3

TwinFin 6 で、Netezza に約 1,000 万行の小さな (っぽい) 集約データ セットがあります。

質問を少し単純化するために、列の数を減らしました。

CUSTOMER_SALES_AGG

CUSTOMER_ID
NUMBER_TRANS
TOTAL_DOLLARS
TOTAL_ITEMS

このテーブルは、顧客 ID ごとに 1 行で CUSTOMER_ID に分散され、顧客が行った合計トランザクション、費やした合計金額、および購入したアイテムの数を収集します。

私は、# トランザクション、合計支出額、合計購入アイテムによって、すべての顧客にわたる各顧客の十分位ランキングを計算しようとしています。たとえば、ある顧客が他の顧客の 90% 以上を費やした場合、その顧客は 10 位にランク付けされます。

私はクエリを作成しました:

SELECT
    CUSTOMER_ID, 
    NUMBER_TRANS,
    NTILE(10) OVER(ORDER BY NUMBER_TRANS DESC NULLS LAST) as TRANS_DECILE,
    TOTAL_DOLLARS,
    NTILE(10) OVER(ORDER BY TOTAL_DOLLARS DESC NULLS LAST) as DOLLARS_DECILE,
    TOTAL_ITEMS,
    NTILE(10) OVER(ORDER BY TOTAL_ITEMS DESC NULLS LAST) as ITEMS_DECILE
FROM CUSTOMER_SALES_AGG;

これは機能しますが、非常に遅く、実行に 10 ~ 20 分近くかかります。

十分位数の計算を行うには、データを並べ替えてから、その並べ替えられたデータをグループに分割する必要があるため、Netezza の MPP 構造はこれをうまく処理できるようです。各 SPU で再配分してランキングを実行できる十分位数を分割していれば、さらに高速になる可能性があります。

これをスピードアップする方法についてのアイデアはありますか?

4

1 に答える 1

3

主な問題はNTILE、同じSQLステートメントで複数の分析関数()を使用することに起因しているようです(私の実際のステートメントは、7つの異なる方法で顧客をランク付けします)。

私の知る限り、Netezzaは、@ GordonLinoffがコメントで説明しているように、各プロセッサでのクイックソートと、コントローラーシステム(Netezzaホスト)での最終的なクイックソートを実行します。ただし、これは1回だけ実行され、その後、彼が推測したように、すべてをコントローラーシステムにプッシュします。

並列処理をまったく使用せずに、残りの分析関数のコントローラーシステム上のデータをクイックソートします。代わりに、各プロセッサでデータを各方法で並べ替え、ホストで最終的な並べ替えを行ってから、データをプロセッサにプッシュして、各列の最終的なハッシュ結合を行う必要があると思います。

結局、このようなクエリを作成することになりました。

WITH 
NT AS (
  select customer_id, 
         number_trans,
         ntile(10) over (order by number_trans) as trans_decile
),
TD AS (
  select customer_id, 
         total_dollars,
         ntile(10) over (order by total_dollars) as dollars_decile
),
NI AS (
  select customer_id, 
         total_items,
         ntile(10) over (order by total_items) as items_decile
)
SELECT
    NT.CUSTOMER_ID, NT.NUMBER_TRANS, NT.TRANS_DECILE,
    TD.TOTAL_DOLLARS, TD.DOLLARS_DECILE,
    NI.TOTAL_ITEMS, NI.ITEMS_DECILE
FROM NT
JOIN TD ON (NT.CUSTOMER_ID = TD.CUSTOMER_ID)
JOIN NI ON (NT.CUSTOMER_ID = NI.CUSTOMER_ID);

このクエリの計画ははるかに複雑ですが、7つの分析ランキングを実行していた私の場合、クエリ時間が12分から5分弱に短縮されました。

于 2012-09-07T21:14:41.400 に答える