【发布时间】:2013-01-30 16:39:35
【问题描述】:
我正在寻找一种可能的方法来消除子查询。
任何评论都会有帮助
SELECT
[FacilityGroupID]
,[LocationGroupID]
,[MsrID]
,CAST(LEFT([ReportingPeriod],4) + '-'
+ RIGHT([ReportingPeriod],2)
+ '-01' as datetime) as create_timestamp
,SUM([Denominator]) as [Denominator]
,SUM([Numerator]) as [Numerator]
FROM
(
SELECT
DISTINCT
Tob.FacilitygroupId
,Tob.LocationgroupId
,Tob.Reportingperiod
,Tob.Denominator
,DimIndicator.MsrId
,CASE
WHEN DimIndicator.MsrID = Tob.MsrId THEN 1
ELSE 0
END as Numerator
from
BIReport.dbo.vIndianatest "Tob"
INNER JOIN [BIreport].[dbo].[DimIndicator] "DimIndicator"
on Tob.MsrSubGroupId = DimIndicator.MsrSubGroupId
) as "Inner"
GROUP BY
[FacilityGroupID]
,[LocationGroupID]
,[MsrID]
,CAST(LEFT([ReportingPeriod],4) + '-'
+ RIGHT([ReportingPeriod],2)
+ '-01' as datetime)
与子查询一样,性能太慢了。
谢谢!!!
【问题讨论】:
-
你试过删除
DISTINCT吗?另请发布查询的解释计划。 -
内层查询求和的分母和分子的值在外层查询中求和
-
如果只运行嵌套选择,是不是太慢了?你看过索引吗?
-
我知道您正试图在转换之前将日期/时间作为“国际”(ISO) 形式,但不幸的是 SQL Server 认为该特定格式仍可本地化(检查第一个 @987654321 @) - 你最好删除破折号。另外,
ReportingPeriod已经是日期/时间类型了吗?可能有一个更好(并且性能更高)的函数来获取月初。 -
所以,真正的目标是加快查询速度;例如,可能还有其他解决方案可以提高性能。
标签: sql sql-server sql-server-2008 sql-server-2005