2013-07-18 102 views
0

我有以下查询有点慢,因为你可以看到where子句中有几个嵌套查询,任何人都可以想出更好的解决方案吗?如何最小化多个子查询?

SELECT m.briefmedialist, 
     Count(DISTINCT s.value) AS selected, 
     m.briefmedialistid 
FROM vwmedialistmediachannels m 
     LEFT JOIN sessionfilters s 
       ON s.field = 'Media' 
       AND m.briefmedialistid = s.value 
       AND s.sessionid = @SessionID 
WHERE m.id = (SELECT d.briefid 
       FROM dashboards d 
       WHERE d.dashboardguid IN (SELECT value 
              FROM sessionfilters s 
              WHERE s.sessionid = @SessionID 
               AND s.field = 'DashboardID')) 
GROUP BY m.briefmedialist, 
      m.briefmedialistid 
ORDER BY m.briefmedialist 
+0

您可以添加一个索引,使查询执行得更快 – 2013-07-18 12:10:16

+0

你能告诉我们查询中涉及的表的结构,他们拥有的索引以及该查询试图产生的是什么? –

+0

你是否确定***子查询是性能问题的来源? –

回答

0
SELECT m.briefmedialist, 
     Count(DISTINCT d.dashboardguid) AS selected, 
     m.briefmedialistid 
    FROM vwmedialistmediachannels m 
    LEFT JOIN sessionfilters s 
    ON s.value = m.briefmedialistid 
    AND s.field = 'Media' 
    AND s.sessionid = @SessionID 
    JOIN dashboards d 
    ON d.briefid = m.id 
    JOIN sessionfilters sf 
    ON sf.Value = d.dashboardguid 
    AND sf.field = 'DashboardID' 
    AND sf.sessionid = @SessionID 
GROUP BY m.briefmedialist, 
     m.briefmedialistid 
ORDER BY m.briefmedialist 

类似内纳德但提拉条件为加盟有时让查询优化器过滤器早

检查它在查询优化器。
有连接条件的索引。
最后的手段是尝试加入提示(合并,哈希,循环)。
在复杂的查询上查询优化器不会评估连接选项,但我不认为这将是这种情况。
如果您看到所有循环联接,然后尝试合并两个sessionfilters联接。

下一步将是与申报PK创建#TEMP表为

select distinct(s.value) 
    from sessionfilters s 
where s.field = 'Media' 
    AND s.sessionid = @SessionID 

select distinct(sf.value) 
    from sessionfilters sf 
where sf.sessionid = @SessionID 
    AND sf.field = 'DashboardID' 
0

您可以轻松地更换你的子查询与联接:

SELECT m.briefmedialist, 
     Count(DISTINCT s.value) AS selected, 
     m.briefmedialistid 
FROM vwmedialistmediachannels m 
    INNER JOIN dashboards d ON d.briefid = m.id 
    INNER JOIN sessionfilters sd ON sd.VALUE = d.dashboardguid 
    LEFT JOIN sessionfilters s ON s.field = 'Media' 
       AND m.briefmedialistid = s.value 
       AND s.sessionid = @SessionID 
WHERE sd.sessionid = @SessionID 
    AND sd.field = 'DashboardID' 
GROUP BY m.briefmedialist, 
      m.briefmedialistid 
ORDER BY m.briefmedialist 

如果这将帮助你很多的表现,因为有很多其他的因素,我们不能看到不知道 - 比如索引,表结构,列类型。另外,我猜,vwmedialistmediachannels是一个视图 - 所以无论它是什么都可能是减慢查询速度。