我在 TwinFin 6 上的 Netezza 中有一个小的(ish)聚合数据集,大约 1000 万行。
为了简化问题,我减少了列数:
CUSTOMER_SALES_AGG
CUSTOMER_ID
NUMBER_TRANS
TOTAL_DOLLARS
TOTAL_ITEMS
此表分布在 CUSTOMER_ID 上,每个客户 ID 有 1 行,收集客户进行的总交易、他们花费的总美元以及他们购买的物品的数量。
我正在尝试通过 # 次交易、总花费的美元和购买的总物品来计算每个客户在所有客户中的十分位排名。例如,如果客户花费 >= 90% 的其他客户,他们将排名第 1 个十分位。
我建立了一个查询:
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 上进行排名,它可能会更快。
关于如何加快速度的任何想法?