使用3个表优化TSQL查询

问题描述:

我需要从数据库中获取所有运行,但需要标记是否存在此运行的错误。使用3个表优化TSQL查询

3表:

  • 上运行:包含运行)
  • Runfiles:包含一个运行期间处理
  • 消息全部文件ID:包含错误,警告,...

此查询是否可以进一步优化?

SELECT TOP 1000 runid, 
      start, 
      end, 
      userid, 
      CASE 
       WHEN EXISTS(SELECT rf.fk_fileid 
          FROM runfiles rf 
          WHERE rf.fk_runid = r.runid 
           AND EXISTS(SELECT m.messageid 
              FROM messages m 
              WHERE m.fk_fileid = 
                rf.fk_fileid 
                AND m.fk_statusid = 4)) 
      THEN 1 
       ELSE 0 
      END     AS ContainsError 
FROM runs r 
ORDER BY start DESC 

请不要评论表名称,他们被翻译为这个问题。

谢谢!

+0

看执行计划并添加适当的索引 – Magnus 2013-02-20 14:58:04

+0

“优化”是什么意思?如果您询问性能,那么您应该在查询中包含执行计划。如果您问的是提高可读性或可维护性,那么[代码评论网站](http://codereview.stackexchange.com/)将是一个更好的问题。 – Pondlife 2013-02-20 16:21:07

+0

有时你只需要比较不同的选项。你有没有试过在运行文件和消息上的左连接? – Narnian 2013-02-20 17:19:23

试试这个:在选择列表

SELECT TOP 1000 
    r.runid 
    ,r.start 
    ,r.[end] 
    ,r.userid 
    ,CASE WHEN m.messageid IS NOT NULL THEN 1 ELSE 0 END AS ContainsError 
FROM runs r 
LEFT JOIN runfiles rf 
    ON rf.fk_runid = r.runid 
LEFT JOIN [messages] m 
    ON m.fk_fileid = rf.fk_fileid 
    AND m.fk_statusid = 4 
ORDER BY r.start DESC 

什么是跑在结果集中的每一行。这意味着CASE语句中的嵌套子查询正在为这些TOP 1000行中的每一行执行。

使用左连接和CASE语句来检查主键是否允许将整个语句作为一个集合进行评估,该SQL Server的内置操作是基于该集合进行的。它应该以更好的方式执行。

+0

关系Run RunFile是一对多关系Runfile 消息也是一对多的。因此,该查询将多次返回相同的运行。也许有一种方法可以限制连接中结果的数量。我会研究它。谢谢! – Nullius 2013-02-21 06:32:53