是什么在差异Dictionary.add(key, value)和Dictionary[key] = value?
我注意到最后一个版本ArgumentException在插入重复密钥时没有抛出,但有没有理由更喜欢第一个版本?
编辑:有没有人有权威的信息来源?我尝试过MSDN,但它一如既往的野鹅追逐:(
我有一个查询,我想尽快执行.
这里是:
select d.InvoiceDetailId,a.Fee,a.FeeTax
from InvoiceDetail d
LEFT JOIN InvoiceDetail a on a.AdjustDetailId = d.InvoiceDetailId
Run Code Online (Sandbox Code Playgroud)
我在AdjustDetailId列上放了一个升序索引
然后,我使用"显示实际执行计划"运行查询,结果估计子树成本(最顶层选择节点之外)为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
Run Code Online (Sandbox Code Playgroud)
我重新跑了,我的子树成本为.98.所以我想,很棒,我的速度提高了两倍.然后我点击显示客户端统计信息,然后点击两次查询执行4-5次,并且相信或不相信第一个查询平均更快.我不明白.顺便说一下,查询返回120K行.
任何见解?
也许我因为缓存而得到污点,但我不知道是否是这种情况或如何重置缓存.
编辑:好的,我google了如何清除查询缓存,所以我在查询之前添加了以下内容:
DBCC DROPCLEANBUFFERS
DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)
然后我运行每个查询5次,第一个查询仍然快一点(13%).第一个查询:客户端处理时间:239.4第二个查询:客户端处理时间:290
所以我想问题是,你为什么这么认为?当表格的大小翻倍时,第二个查询会更快吗?或者左连接导致查询两次命中索引,因此它总是会变慢.
请不要激怒我,我只是想接受教育.
编辑#2:我需要获得所有的InvoiceDetails,而不仅仅是调整后的,因此左边的连接.
编辑#3:我试图用查询解决的真正问题是总结所有InvoiceDetail行,但同时也调整它们.所以最终似乎要执行的最佳查询如下.我认为做一个连接然后添加连接表将是唯一的方法,但似乎按条件分组最优雅地解决问题.
SELECT CASE WHEN AdjustDetailId IS NULL THEN InvoiceDetailId ELSE AdjustDetailId END AS InvoiceDetailId
,SUM(Fee + FeeTax) AS Fee
FROM dbo.InvoiceDetail d
GROUP BY CASE WHEN AdjustDetailId IS NULL THEN InvoiceDetailId ELSE …Run Code Online (Sandbox Code Playgroud)