微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sql – 为什么选择Top子句可能会导致很长的时间成本

以下查询将永远完成.但是,如果我删除前10个子句,它会很快完成. big_table_1和big_table_2是2个表,10 ^ 5个记录.

我以前认为顶级条款会减少时间成本,但显然不在这里.为什么???

select top 10 ServiceRequestID
from 
(
    (select * 
     from  big_table_1
     where big_table_1.StatusId=2
    ) cap1
    inner join
      big_table_2 cap2
    on cap1.ServiceRequestID = cap2.CustomerReferenceNumber
    )

解决方法

在同一主题(底部链接)上还有其他的stackoverflow讨论.如上述注释所示,它可能与索引和优化器变得困惑并使用错误有关.

我的第一个想法是,您正在(select * ….)中选择顶级的serviceid,而优化器可能难以将查询推送到内部查询并使用索引.

考虑重写它

select top 10 ServiceRequestID  
from  big_table_1
inner join big_table_2 cap2
on cap1.servicerequestid = cap2.customerreferencenumber
and big_table_1.statusid = 2

查询中,数据库可能会尝试合并结果并返回它们,然后将其限制在外部查询中的前10名.在上述查询中,数据库只能在结果合并时收集前10个结果,从而节省了时间.如果servicerequestID被索引,则一定要使用它.在您的示例中,查询正在查找已经以虚拟,无索引格式返回的结果集中的servicerequestid列.

希望有道理虽然假设优化器应该采用我们把sql放入的任何格式,并计算出每次返回值的最佳方法,但事实是,我们将sql放在一起的方式真的可以影响在DB.

SELECT TOP is slow,regardless of ORDER BY

Why is doing a top(1) on an indexed column in SQL Server slow?

原文地址:https://www.jb51.cc/mssql/82342.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐