我正在尝试编写类似于this的递归CTE查询,并且当我将CTE记录限制为极小的样本大小时,结果是正确的。我假设有更多记录,它仍然是正确的。但是,如果我将CTE限制为~5000条记录(使用where子句),我总共需要11秒的执行时间。如果我将其增加到~24,000条记录(使用where子句),最多可以跳转3分钟。
我没有运行查询的时间比这长,因为我不想吃掉系统资源。
我知道我可以避免在这个查询中一起使用CTE,但是这个特定查询的意图是更大的查询,所以如果我可以使用CTE,它会更具可读性。我也非常有信心递归CTE能够处理更大的数据集,所以如果有人注意到我缺少的东西,我很好奇。
以下是查询(表和字段名称已更改):
WITH TEMP (COL1, COL2, CURR, PREV) AS (
SELECT COL1,
COL2,
ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) AS CURR,
ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2) -1 AS PREV
FROM MYLIB.MYTABLE
WHERE COLDATE > 20150101 -- Produces about 5000 records
-- WHERE COLDATE > 20140101 -- Produces about 24000 records
)
SELECT COL1, MAX(TRIM(L ',' FROM CAST(SYS_CONNECT_BY_PATH(COL2, ',') AS VARCHAR(256))))
FROM TEMP
START WITH CURR = 1
CONNECT BY COL1 = PRIOR COL1
AND PREV = PRIOR CURR
GROUP BY COL1;
注意*:COLDATE仅用于限制CTE中的记录以进行测试。
CTE本身似乎不是问题,我可以做SELECT * FROM TEMP;
并且它是瞬间的。我相信我可能错误地使用SYS_CONNECT_BY_PATH
和/或CONNECT BY
(IE:我可以修改查询以提高效率)
我提供的链接更详细,但我想要实现的目标是: 进入: 动态。
目前它正在做什么,虽然速度很慢。
非常感谢任何见解。
答案 0 :(得分:0)
我发现了两件事,并设法为我的用例制定解决方案。
首先:我在执行两次相同的确切查询后意识到,所有后续查询都接近瞬时。所以我想它只需要构建一个查询计划然后一切都很好。如果我稍微修改了一下查询,可能需要一段时间,因为它必须重新构建查询计划。
第二:我意识到我不需要在整个表上执行查询。我只需要为COL1
的单个值定制它。一旦我将其转换为UDF,我就能够为每条记录单独使用它,而不是一次性处理所有记录。