如何快速进行此查询?只要我在 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 在此查询中按天对结果进行分组?