2017-02-05 29 views
0

我在SQL Server 2012的工作,我有以下查询:SQL COUNT(*)花费的时间太长,返回

SELECT 
    COUNT(*), a.col3 
FROM 
    a 
INNER JOIN 
    (SELECT 
     d.x, c.col6 
    FROM 
     c 
    INNER JOIN 
     d ON d.x = c.col2 
    WHERE 
     c.col15 = 20 
     AND c.col4 IN ('something', 'more') 
    ) AS b ON b.x = a.col3 
      AND b.col6 = a.col2 
WHERE 
    a.col10 = 20 
    AND a.col2 IS NOT NULL 
    AND a.col3 IS NOT NULL 
GROUP BY 
    a.col3 

的表是小的。 a和c大约有100k行。 d大约100行。

但是,查询即使在45分钟以上也没有返回任何内容。

不幸的是,我无权查看估计的查询计划。我需要更改什么以便查询返回更快?

+1

您需要更改所需的任何内容,以便访问查询计划。随机刺戳性能问题是愚蠢的。 – thebjorn

+1

除了糟糕的查询计划之外,另一个可能的原因是阻塞。 –

+0

你有'a'和'c'表的任何索引吗? –

回答

0

也许你的子查询如果在外部查询中触发每一行。你可以把它改写无子查询:

SELECT 
    COUNT(*), a.col3 
FROM 
    a 
INNER JOIN 
    c ON c.col6 = a.col2 
INNER JOIN 
    d ON d.x = c.col2 
     AND d.x = a.col3 
WHERE 
    a.col10 = 20 
    --AND a.col2 IS NOT NULL 
    --AND a.col3 IS NOT NULL 
    AND c.col15 = 20 
    AND c.col4 IN ('something', 'more') 
GROUP BY 
    a.col3 

我注释掉不是WHERE子句中的NULL部分B/C,因为它们是在连接使用,他们将永远不会为NULL。