加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:29:01 所属栏目:MsSql教程 来源:网络整理
导读:以下查询将永远完成.但是,如果我删除前10个子句,它会很快完成. big_table_1和big_table_2是2个表,10 ^ 5个记录. 我以前认为顶级条款会减少时间成本,但显然不在这里.为什么??? select top 10 ServiceRequestIDfrom ( (select * from big_table_1 where big_
以下查询将永远完成.但是,如果我删除前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?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读