如何快速进行此查询?只要我在 SQL Server 数据库中运行它就会超时

Posted

技术标签:

【中文标题】如何快速进行此查询?只要我在 SQL Server 数据库中运行它就会超时【英文标题】:How do I make this query fast? It reaches time out anytime I run it in the SQL Server database 【发布时间】:2014-04-03 08:29:40 【问题描述】:
SELECT     firstpartno, nOccurrence, nMale, nFemale, COUNT(nMale) / CAST
                          ((SELECT     SUM(nOccurrence) AS Expr1
                              FROM         (SELECT     COUNT(dbo.vw_Tally1.nMale) AS nOccurrence
                                                     FROM          dbo.vw_Split4) AS SumTally) AS decimal) AS nMProportion, COUNT(nFemale) / CAST
                          ((SELECT     SUM(nOccurrence) AS Expr1
                              FROM         (SELECT     COUNT(dbo.vw_Tally1.nFemale) AS nOccurrence
                                                     FROM          dbo.vw_Split4 AS vw_Split4_1) AS SumTally_1) AS decimal) AS nFProportion
FROM         dbo.vw_Tally1
GROUP BY firstpartno, nOccurrence, nMale, nFemale

【问题讨论】:

你的表上有索引吗?发布您的表结构会有所帮助。 运行显示查询计划的查询,对此的分析应该可以帮助您找到查询中最慢的部分 @Abs: 查询看起来不同.. 我认为你不需要这么多内部查询 【参考方案1】:

如果我理解您的问题,这里就是您的解决方案:

SELECT
         firstpartno
        ,nOccurrence
        ,nMale
        ,nFemale
        ,CASE WHEN SUM_nOccurrence.SUM_nOccurrenceMale = 0
                THEN 0
                ELSE COUNT(nMale)/SUM_nOccurrence.SUM_nOccurrenceMale
         END AS nMProportion
        ,CASE WHEN SUM_nOccurrence.nOccurrenceFemale = 0
                THEN 0
                ELSE COUNT(nFemale)/SUM_nOccurrence.nOccurrenceFemale
         END  AS nFProportion
FROM
    dbo.vw_Tally1
LEFT JOIN
    (SELECT
             CAST(SUM(nOccurrenceMale)AS decimal)   AS SUM_nOccurrenceMale
            ,CAST(SUM(nOccurrenceFemale)AS decimal) AS SUM_nOccurrenceFemale
     FROM  (SELECT
                 COUNT(dbo.vw_Tally1.nMale)     AS nOccurrenceMale
                ,COUNT(dbo.vw_Tally1.nFemale)   AS nOccurrenceFemale
            FROM dbo.vw_Split4 ) AS SumTally)  SUM_nOccurrence
        ON 1=1
GROUP BY
         firstpartno
        ,nOccurrence
        ,nMale
        ,nFemale

希望对你有帮助 祝你好运:)

【讨论】:

【参考方案2】:

这个查询至少可以说是可疑的。您选择表 vw_Tally1 的所有记录。对于这些记录中的每一个,您都执行以下操作:

    从表 vw_Split4 中选择 COUNT(vw_Tally1.nMale)。当 vw_Tally1.nMale 不为空时,这是 vw_Split4 的 COUNT(*),否则为空。 然后对这个值求和。这没有任何意义,因为值的总和就是值本身。 你对 nFemale 做同样的事情。

最后你按 (firstpartno, nOccurrence, nMale, nFemale) 分组并使用如此奇怪地找到的值来计算一些东西。由于您不汇总找到的值,因此您会得到每组的随机匹配。 IE。 dbms 采用匹配的记录之一。由于 nMale 和 nFemale 是分组列,因此该组的所有记录的值都是恒定的。所以没什么大问题,但是很多无用的工作。

因此,为了加快速度,首先要考虑您实际要选择的内容。这看起来最终变成了一个非常简单的选择语句。我们可以帮助您,如果您告诉我们您的表包含什么、您需要什么结果集、nMale 和 nFemale 代表什么以及所涉及的表的主键或唯一列是什么。

【讨论】:

以上是关于如何快速进行此查询?只要我在 SQL Server 数据库中运行它就会超时的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2012 中缓存并进行查询 - 我可以假设啥以及如何使用此缓存?

如何使用 SQL Server 在此查询中按天对结果进行分组?

SQL Server代码如何快速格式化

SQL Server代码如何快速格式化,sqlserver代码

SQL Server - 如何优化此查询?

如何在sql server中使用group_concat进行查询[重复]