小编Sun*_*ers的帖子

添加到Dictionary的不同方式

是什么在差异Dictionary.add(key, value)Dictionary[key] = value

我注意到最后一个版本ArgumentException在插入重复密钥时没有抛出,但有没有理由更喜欢第一个版本?

编辑:有没有人有权威的信息来源?我尝试过MSDN,但它一如既往的野鹅追逐:(

c# optimization dictionary

95
推荐指数
5
解决办法
13万
查看次数

SQL查询优化

我有一个查询,我想尽快执行.

这里是:

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)

sql-server optimization performance

1
推荐指数
1
解决办法
180
查看次数

标签 统计

optimization ×2

c# ×1

dictionary ×1

performance ×1

sql-server ×1