2013-06-13 25 views
0

以下是我嵌套的SQL查询:的Sql嵌套查询的执行性能

SELECT M.UserID, SUM(M.Browser) 
FROM 
(
    SELECT UserID, X.Browser 
    FROM 
    (
     SELECT UserName, PCMLogEventID, MAX(Browser) AS Browser 
     FROM [PCMDBSERVER].[MISTestPCM_Raw].[dbo].[PCM_Log_FilterSwitchData] 
     WHERE [DateTime] BETWEEN '6/12/2013 12:00:00 AM' AND '6/12/2013 11:59:59 PM' 
     GROUP BY UserName, PCMLogEventID 
    ) X 
    INNER JOIN ( 
     SELECT * 
     FROM PCM_Stat_UserRepository 
     WHERE MachineID='All' 
    ) Y 
    ON X.UserName = Y.UserName 
) M 
GROUP BY M.UserID 

的执行时间 - 附SELECT子句内的查询(选择用户名,X.Browser),只需要1秒来执行,仅返回197行。但是,当我执行整个嵌套查询时,需要将近6分钟才能返回结果。任何人都可以帮助我理解为什么需要这么长时间?编号: 其实需要PCMLogEventID。因为PCM_Log_FilterSwitchData中的数据是这样的: UserName | PCMLogEventID |浏览器 abc | 111 | 0.9 abc | 111 | 1.2 abc | 222 | 1.2 abc | 222 | 3.5 。 。 因此,我首先通过将用户名& PCMLogEventID分组,然后对其进行求和。

+0

'[PCM_Log_FilterSwitchData]'是一个视图吗?你为什么“GROUP BY PCMLogEventID”? – Devart

+0

在内部查询的情况下,对于外部查询返回的每一行,将执行内部查询。因此,即使内部查询只需要几秒钟执行,外部查询可能会返回多行,导致内部查询的多次执行。 –

+0

@Darshan梅塔,我不同意你 - 一切都取决于'执行计划'。 – Devart

回答

0

可能这对你有所帮助 -

SELECT M.UserID, Browser = SUM(X.Browser) 
FROM 
(
    SELECT 
      UserName 
     , Browser = MAX(Browser) 
    FROM [PCMDBSERVER].[MISTestPCM_Raw].[dbo].[PCM_Log_FilterSwitchData] 
    WHERE [DateTime] BETWEEN '20130613 12:00:00' AND '20130613 23:59:59' 
    GROUP BY UserName 
) X 
JOIN (
    SELECT 
      UserName 
     , UserID 
    FROM dbo.PCM_Stat_UserRepository 
    WHERE MachineID = 'All' 
) M ON X.UserName = Y.UserName 
GROUP BY M.UserID 
+0

这大部分是我在思考我的想法。另一种可能性是将[PCM_Log_FilterSwitchData]结果的子选择放入一个临时表中,并简单地将它加入到第二个放弃外部选择的选择中。 –

+0

这似乎是在@Devart工作,但你能帮我解释一下如何简单地用Inner替换Inner Join做的神奇吗? – Lucifer

+0

但是你错过了PCMLogEventID @Devart! – Lucifer

1

这是对我工作。我改变了顺序:先MAX,然后SUM,然后JOIN。

Select Y.UserID, P.Browser 
    FROM 
    (
     SELECT DISTINCT X.UserName, SUM(X.Browser) as Browser 
     FROM 
     (
      SELECT UserName, PCMLogEventID, MAX(Browser) AS Browser 
      FROM [PCMDBSERVER].[MISTestPCM_Raw].[dbo].[PCM_Log_FilterSwitchData] 
      WHERE [DateTime] BETWEEN '6/12/2013 12:00:00 AM' AND '6/12/2013 11:59:59 PM' 
      GROUP BY UserName, PCMLogEventID 
     ) X 
     GROUP BY X.UserName 
     ) P 
     INNER JOIN 
     (SELECT * FROM PCM_Stat_UserRepository WHERE MachineID='All') Y 
    ON P.UserName = Y.UserName