以下查询将永远完成.但是,如果我删除前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?