0

永久に実行される単純なクエリがあります。と言っても10時間以上。ファクト テーブルには 170 億行を超える行があります。次のクエリのパフォーマンスを改善するための推奨事項またはベスト プラクティスはありますか?

SELECT
  /*+ parallel(f 4) */
  F.DM_CUSTOMER_DKEY,
  P.PRODUCT_YEAR,
  SUM(F.ADVG_COST_ACTUALS) advg_cost_actuals
FROM DM_CUST_RENEWAL_ADV_FACT F
INNER JOIN DM_PRODUCT_HIERARCHY p
ON F.DM_PRODUCT_HKEY = P.DM_PRODUCT_HKEY
GROUP BY F.DM_CUSTOMER_DKEY,
  P.PRODUCT_YEAR
ORDER BY P.PRODUCT_YEAR

プランはこちら

OPERATION OBJECT_NAME OPTIONS COST PARTITION_START PARTITION_STOP
SELECT STATEMENT 10931402
PX COORDINATOR
PX SEND :TQ10005 QC (ORDER) 10931402
SORT ORDER BY 10931402
PX RECEIVE 10931402
PX SEND :TQ10004 RANGE 10931402
SORT GROUP BY 10931402
PX RECEIVE 10931402
PX SEND :TQ10003 HASH 10931402
SORT GROUP BY 10931402
HASH JOIN 1964410
Access Predicates
F.DM_PRODUCT_HKEY=P.DM_PRODUCT_HKEY
PX RECEIVE 335
PX SEND :TQ10002 BROADCAST 335
VIEW index$_join$_002 335
HASH JOIN BUFFERED
Access Predicates
ROWID=ROWID
PX RECEIVE 136
PX SEND :TQ10000 HASH 136
PX
BLOCK
ITERATOR 136
INDEX DM_PRODUCT_HIERARCHY_PK FAST FULL
SCAN
136
PX RECEIVE 280
PX SEND :TQ10001 HASH 280
PX
BLOCK
ITERATOR 280
INDEX DM_PRODUCT_HIERARCHY_LPK FAST FULL
SCAN
280
PX BLOCK ITERATOR 1878718 1 369
TABLE ACCESS DM_CUST_RENEWAL_ADV_FACT FULL 1878718 1 369
4

2 に答える 2

0

すでに述べたように、テーブルに適切にインデックスを付けるようにしてください。私が想定しているのは、そのテーブルを分割することですhttp://docs.oracle.com/cd/B10501_01/server.920/a96524/c12parti.htm

F.DM_CUSTOMER_DKEY または P.PRODUCT_YEAR、またはその両方で分割します。または、少なくとも where ステートメントを入れて product_year ほど縮小し、複数のクエリを実行することができます

于 2013-06-24T18:04:07.620 に答える
0

テーブル DM_PRODUCT_HIERARCHY は、クエリの実行中にメモリに収まるほど小さいと思います。その場合、ハッシュ結合が推奨され、インデックスは必要ありません。USE_HASH ヒントと一緒に NO_INDEX ヒントを試すことができます。

非常に大きなファクト テーブルの DM_CUSTOMER_DKEY で結果をグループ化します。この属性でファクト テーブルを分割すると、パフォーマンスが大幅に向上する可能性があります。

集計されたファクト テーブルを作成することも検討する必要があります。これは、ETL プロセスの一部である場合があります。おそらく、マテリアライズド ビューが機能するでしょう。しかし、私は大きな具体化されたビューで非常に悪い経験をしています。特に、ソース テーブルに多くの変更がある場合は、基盤となるテクノロジの限界に直面します。

「最適な」実行時間を把握するには、ファクト テーブルのフル テーブル スキャンの時間を測定する必要があります。必ず、インデックスのない列 (サンプルでは COLUMN_X) をカウントしてください。そうしないと、テーブルではなくインデックスをスキャンする時間が測定されます。

SELECT count(COLUMN_X) from DM_CUST_RENEWAL_ADV_FACT;
于 2013-06-26T07:32:25.630 に答える