gpt4 book ai didi

sql - 如何加速对未索引表的基于组的重复计数查询

转载 作者:行者123 更新时间:2023-12-04 21:56:44 25 4
gpt4 key购买 nike

当我需要知道对于某些 c 列,包含超过 n 个重复项的行数时,我可以这样做:

WITH duplicateRows AS (
SELECT COUNT(1)
FROM [table]
GROUP BY c
HAVING COUNT(1) > n
) SELECT COUNT(1) FROM duplicateRows

这会导致不希望的行为:SQL Server 计算所有按 i 分组的行,这(当此表上没有索引时)会导致糟糕的性能。

但是,当更改脚本使得 SQL Server 不必计算所有行时并不能解决问题:

WITH duplicateRows AS (
SELECT 1
FROM [table]
GROUP BY c
HAVING COUNT(1) > n
) SELECT COUNT(1) FROM duplicateRows

虽然现在SQL Server理论上可以在n + 1之后停止计数,但是会导致查询计划和查询成本相同。

当然,原因是GROUP BY真正引入的是成本,而不是计数。但我对数字一点也不感兴趣。在没有索引的表上是否有另一种方法可以加快重复行的计数?

最佳答案

查询中最大的两个成本是 GROUP BY 的重新排序(由于缺少适当的索引)和扫描整个表这一事实。

不幸的是,要识别重复项,对整个表重新排序是成本最低的选择。


可能会从以下更改中获益,但我非常怀疑它是否重要,因为我预计执行计划无论如何都会再次涉及排序。

WITH
sequenced_data AS
(
SELECT
ROW_NUMBER() OVER (PARTITION BY fieldC) AS sequence_id
FROM
yourTable
)
SELECT
COUNT(*)
FROM
sequenced_data
WHERE
sequence_id = (n+1)

假设 SQLServer2005+

关于sql - 如何加速对未索引表的基于组的重复计数查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8740993/

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