gpt4 book ai didi

sql-server - select top 10 ... 和 select top 30 遵循不同的执行计划

转载 作者:行者123 更新时间:2023-12-02 10:30:19 26 4
gpt4 key购买 nike

在查询优化期间,我遇到了 sql server (Sql Server 2008 R2 Enterprise) 的奇怪行为。我在表上创建了几个索引,以及一些索引 View 。我有两个查询,例如:

select top 10 N0."Oid",N1."ObjectType",N1."OptimisticLockField" from ((("dbo"."Issue" N0
inner join "dbo"."Article" N1 on (N0."Oid" = N1."Oid"))
inner join "dbo"."ProductLink" N2 on (N1."ProductLink" = N2."Oid"))
inner join "dbo"."Technology" N3 on (N2."Technology" = N3."Oid"))
where (N1."GCRecord" is null and (N0."IsPrivate" = 0) and ((N0."HasMarkedAnswers" = 0) or N0."HasMarkedAnswers" is null) and (N3."Name" = N'Discussions'))
order by N1."ModifiedOn" desc

select top 30 N0."Oid",N1."ObjectType",N1."OptimisticLockField" from ((("dbo"."Issue" N0
inner join "dbo"."Article" N1 on (N0."Oid" = N1."Oid"))
inner join "dbo"."ProductLink" N2 on (N1."ProductLink" = N2."Oid"))
inner join "dbo"."Technology" N3 on (N2."Technology" = N3."Oid"))
where (N1."GCRecord" is null and (N0."IsPrivate" = 0) and ((N0."HasMarkedAnswers" = 0) or N0."HasMarkedAnswers" is null) and (N3."Name" = N'Discussions'))
order by N1."ModifiedOn" desc

两个查询都是相同的,只不过第一个查询以选择前 10 个开头,第二个查询以选择前 30 个开头。两个查询返回相同的结果集 - 6 行。但第二个查询比第一个查询快 5 倍!我查看了两个查询的实际执行计划,当然它们是不同的。第二个查询使用索引 View ,并且执行得很好,而第一个查询拒绝使用它,而是使用表上的索引。我重复一遍 - 两个查询都是相同的,对于同一个表,在同一个服务器上,它们仅在“顶部”部分的数字上有所不同。我尝试通过更新统计信息、销毁它使用的索引等来强制优化器在第一个查询中使用索引 View 。无论我如何尝试实际执行,都不要在第一个查询中使用索引 View ,而在第二个查询中始终使用它。

我真的很想知道造成这种行为的原因。有什么建议吗?

更新我不确定它是否可以在不描述相应索引和 View 的情况下有所帮助,但这是实际的执行计划图:对于选择前 19 名: for select top 19:

对于选择前 18 名: for select top 18:

另一个令人困惑的事实是,对于 select top 19 查询,有时使用索引 View ,有时不使用

最佳答案

我唯一能想到的可能是第一个查询中的优化器得出的结论是,指定的条件对于使用“更好”的执行计划来说没有足够的选择性。

如果您仍在调查此问题,请查看 TOP 60、90、100... 是否生成第二个执行计划并执行良好。您还可以修改它,看看优化器在这种情况下选择第二个计划的阈值是多少。

还可以尝试不使用 order by 语句的查询,看看这是否会影响查询计划的选择(检查该字段的索引等)

除此之外,您说您不能使用索引提示,因此也许重写您从 Article 表 (N1) 中选择 top X 并在 where 子句中使用一堆存在语句将为您提供更好的性能。

关于sql-server - select top 10 ... 和 select top 30 遵循不同的执行计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8170491/

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