gpt4 book ai didi

sql - 简单查询的选择性估计错误

转载 作者:行者123 更新时间:2023-12-04 13:15:20 25 4
gpt4 key购买 nike

让我们有一个简单的表格 tt像这样创建

WITH x AS (SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)), t1 AS
(
SELECT ones.n + 10 * tens.n + 100 * hundreds.n + 1000 * thousands.n + 10000 * tenthousands.n as id
FROM x ones, x tens, x hundreds, x thousands, x tenthousands, x hundredthousands
)
SELECT id,
id % 100 groupby,
row_number() over (partition by id % 100 order by id) orderby,
row_number() over (partition by id % 100 order by id) / (id % 100 + 1) local_search
INTO tt
FROM t1

我有一个简单的查询 Q1:
select distinct g1.groupby,
(select count(*) from tt g2
where local_search = 1 and g1.groupby = g2.groupby) as orderby
from tt g1
option(maxdop 1)

我想知道为什么 SQL Server 对 Q1 的结果大小估计得如此糟糕(请参阅打印屏幕)。查询计划中的大多数运算符都是精确估计的,但是,在根哈希匹配运算符处引入了完全疯狂的猜测。

enter image description here

为了让它更有趣,我尝试了对 Q1 的不同重写。如果我应用子查询的去相关,我会得到一个等效的查询 Q2:
select main.groupby, 
coalesce(sub1.orderby,0) orderby
from
(
select distinct g1.groupby
from tt g1
) main
left join
(
select groupby, count(*) orderby
from tt g2
where local_search = 1
group by groupby
) sub1 on sub1.groupby = main.groupby
option(maxdop 1)

这个查询在两个方面很有趣:(1)估计是准确的(见打印屏幕),(2)它也有不同的查询计划,比 Q1 的查询计划更有效。

enter image description here

所以问题是: 为什么Q1的估计不正确,而Q2的估计是精确的? 请不要发布此 SQL 的其他重写(我知道即使没有子查询也可以编写),我只对选择性估计器行为的解释感兴趣。谢谢。

最佳答案

它无法识别 orderby具有相同 groupby 的所有行的值将相同所以它认为distinct groupby, orderby将有更多的组合,而不仅仅是 distinct groupby .

它乘以 DISTINCT orderby 的估计值(对我来说,这是 35.0367 )和 DISTINCT groupby 的估计值(对我来说这是 100 )好像它们是不相关的。

我得到了 3503.67 的估价对于 Q1 中的根节点

这次重写避免了它,因为它现在只按单个 groupby 分组。柱子。

SELECT groupby,
max(orderby) AS orderby
FROM (SELECT g1.groupby,
(SELECT count(*)
FROM tt g2
WHERE local_search = 1
AND g1.groupby = g2.groupby) AS orderby
FROM tt g1) d
GROUP BY groupby
OPTION(maxdop 1)

尽管如您的 Q2 和评论 @GarethD 所示,这不是此查询的最佳方法。导致多次运行相关子查询并丢弃重复项的低效率。

关于sql - 简单查询的选择性估计错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53869710/

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