LEFT JOIN服务器性能优化

我有一个查询,我想要尽可能快地执行。

这里是:

select d.InvoiceDetailId,a.Fee,a.FeeTax from InvoiceDetail d LEFT JOIN InvoiceDetail a on a.AdjustDetailId = d.InvoiceDetailId 

我在AdjustDetailId列上添加了一个升序索引

然后我用“显示实际执行计划”运行查询,结果估计的子树成本(离最顶端的select节点)为2.07

然后我想,也许我可以做一些改进,所以我添加了一个条件左连接像这样:

 select d.InvoiceDetailId,a.Fee,a.FeeTax from InvoiceDetail d LEFT JOIN InvoiceDetail a on a.AdjustDetailId is not null and a.AdjustDetailId = d.InvoiceDetailId 

我重新跑了,我得到了98的一个子树成本。 所以我觉得,我做了两次。 那么我点击显示客户端的统计数据,然后点击执行两次查询4-5次,并相信是否第一个查询平均速度更快。 我不明白。 顺便说一下,查询返回120K行。

任何见解?

也许因为caching,我得到了污染的结果,但我不知道是否是这种情况或如何重置caching。

编辑:好吧我googled如何清除查询caching,所以我在查询之前添加以下内容:

 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE 

然后,我运行每个查询5次,第一个查询仍然快一点(13%)。 第一个查询:客户端处理时间:239.4第二个查询:客户端处理时间:290

所以我想问题是,你为什么这么想? 是不是当表的四倍大,第二个查询会更快? 或者左连接导致查询两次点击索引,所以它总是比较慢。

请不要激怒我,我只是想获得教育。

在AdjustDetailID的索引上,包含Fee和FeeTax列。 否则,系统将需要做一个查询来获得这些数据,系统可能会最终做一个扫描,忽略你的索引。