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 で再配分してランキングを実行できる十分位数を分割していれば、さらに高速になる可能性があります。
これをスピードアップする方法についてのアイデアはありますか?