【问题标题】:The slow query with one innerjoin一个内连接的慢查询
【发布时间】:2016-03-11 20:57:56
【问题描述】:

我有一个查询,在 foreach 循环中搜索此查询以查找每个 item

但是太慢了。

foreach (string item in X)
{
   //This is the prototype 
    querystring = "select distinct g.N,g.NH + ' - ' + g.NV + ' - ' + g.S + ' - ' + g.VS ID
    from Table1 as g inner join Table2 as d on d.V=g.V
    where d.MD= '1234' and g.AC= 'item' and
       g.N <> '' and g.NV <> '' and g.S <> '' and g.VS <> '' ORDER BY g.N";
}

我跑了Estimated Execution Plan,我不能在这里附上结果,但是对于表1,index seek(nonClustered) 的成本是40%,而parallelism (repartion streams) is 24% 其余的都很低。

【问题讨论】:

  • 是单个查询慢,还是处理foreach需要很多时间?
  • 即使单次查询也很慢,foreach 最多搜索20次。但它太慢了。给我结果需要 4 到 7 秒
  • 在 C#(?) 代码中触发单个查询并检索 X 中每个项目的相关数据可能更有效。
  • 我实际上只为一个项目运行了 Estimated Execution Plan
  • 您认为我是否会更好地编写嵌入查询的 foreach?

标签: sql sql-server sql-server-2008 optimization query-optimization


【解决方案1】:

您现在对数据库发起了多达 20 个相同的查询(除了where 条件之外相同)。所以我要做的是触发一个查询,例如:

SELECT     DISTINCT g.N
,          g.NH + ' - ' + g.NV + ' - ' + g.S + ' - ' + g.VS ID
from       Table1 as g 
INNER JOIN Table2 as d 
        ON d.V=g.V
WHERE      d.MD= '1234' 
       AND g.N <> '' 
       AND g.NV <> '' 
       AND g.S <> '' 
       AND g.VS <> '' 
ORDER BY   g.N

并将结果加载到某种变量中,DictionaryDatatable 似乎是您最好的选择。

当变量中包含所有数据时,您可以查询 X 中各个项目的结果。例如,您可以为此使用 Linq

另外,我刚刚复制了您的查询,但我也会在 C# 中执行所有字符串连接。因此,只需分别选择g.NHg.NV 等,并将它们连接到您需要的地方。

最后,您确定需要DISTINCT 吗?通常当您必须使用它时,这意味着JOIN 条件错误/不完整。它可能是正确的,只要确定它是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 2014-08-28
    • 2015-03-20
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    相关资源
    最近更新 更多