gpt4 book ai didi

sql - Netezza 中的十分位数排名表现

转载 作者:行者123 更新时间:2023-12-04 14:07:55 26 4
gpt4 key购买 nike

我在 Netezza 中有一个小的(大概)聚合数据集,大约 1000 万行,在 TwinFin 6 上。

为了稍微简化问题,我减少了列数:

CUSTOMER_SALES_AGG

CUSTOMER_ID
NUMBER_TRANS
TOTAL_DOLLARS
TOTAL_ITEMS

此表分布在 CUSTOMER_ID 上,每个客户 ID 一行,收集客户进行的总交易、他们花费的总金额以及他们购买的商品数量。

我正在尝试根据交易次数、花费的总金额和购买的商品总数来计算每个客户在所有客户中的排名。例如。如果一个客户花费了 >= 90% 的其他客户,他们将排在第一个十分位数。

我建立了一个查询:

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 上进行排名,它可能会更快。

关于如何加快速度的任何想法?

最佳答案

看来主要问题源于在同一 SQL 语句中使用多个分析函数 (NTILE)(我的实际语句以 7 种不同的方式对客户进行排名)。

据我所知,正如@GordonLinoff 在评论中解释的那样,Netezza 会在每个处理器上进行快速排序,并在 Controller 系统(Netezza 主机)上进行最终快速排序。然而,它只执行一次,然后,正如他猜测的那样 - 将其全部推送到 Controller 系统。

它继续为剩余的分析功能对 Controller 系统上的数据进行快速排序,根本不使用并行性。我希望它应该在每个处理器上以各种方式对数据进行排序,在主机上进行最终排序,然后将数据向下推回处理器以对每列进行最终哈希连接。

我最终创建了一个类似这样的查询。

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 分钟。

关于sql - Netezza 中的十分位数排名表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12323499/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com