【问题标题】:SQL Case Query OptimizationSQL 案例查询优化
【发布时间】:2014-07-12 04:09:06
【问题描述】:

我在一个更大的选择查询中使用了一个子查询,我需要对其进行优化才能将其上传到 Domo。我正在尝试为交易是否包含特定项目添加是/否列。这将显示在交易的所有行上。

它工作正常,但我处理的数据太多,以至于软件在处理所有数据之前就超时了。我可以在 SQL SMS 2012 中毫无问题地运行查询,但是有没有更简单/更快的方法来做到这一点?谢谢!

case 
when transactions.transaction_id in 
    (select transaction_id
    from transaction_lines
    where item_id_0 = 'msa500'
    group by transaction_id) then 'Yes'
else 'No'
end as ContainsMSA500 

【问题讨论】:

  • 您可以将子查询移动到 CTE。应该更快,因为 CTE 将被检索一次,而子查询是为每一行检索的
  • 谢谢...我将对 CTE 进行一些研究。你能给我举个例子吗?我对 SQL 很陌生。
  • @cha 。 . .你从哪里得到这个想法?据我所知,SQL Server 通常不会实现 CTE。如果您知道有其他说明的文档,我会很高兴看到它。
  • @cha 抱歉,必须同意 Gordon 的观点——这根本不是 CTE 的工作方式。
  • @GordonLinoff:你成功了。我必须同意你的观点,即 CTE 没有实现。在这种情况下,我认为 CROSS APPLY 应该工作得更快。本文做一些性能分析explainextended.com/2009/07/16/inner-join-vs-cross-apply

标签: sql group-by sql-server-2012 query-optimization case


【解决方案1】:

您可以通过以下方式优化:

(case when exists (select 1
                   from transaction_lines tl
                   where tl.item_id_0 = 'msa500' and
                         tl.transaction_id = transactions.transaction_id
                  )
      then 'Yes'
      else 'No'
 end) as ContainsMSA500 

然后在transaction_lines(transaction_id, item_id_0)上创建一个索引。

将其公式化为group by 的问题在于 SQL Server 每次都必须生成整个列表。通过使用exists 对其进行公式化,SQL Server 可以在索引中查找值——通常要快得多。

在 SQL Server 2012 中,in 版本可能会进行优化:

(transaction_id in (select tl.transaction_id 来自 transaction_lines tl 其中 tl.item_id_0 = 'msa500' ) 好的' 否则“不” end) as ContainsMSA500

虽然逻辑上相同,但删除 group by 可能会有所帮助。

最后的选择是把它放在查询的from 子句中。如果不查看整个查询,这很难解释。

【讨论】:

  • 谢谢!看起来好多了!
猜你喜欢
  • 2010-12-20
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2013-01-10
  • 2014-02-04
相关资源
最近更新 更多