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?

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...