【问题标题】:Eliminating SubQueries消除子查询
【发布时间】: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


【解决方案1】:

你试过WITH吗? With 对内联视图进行子查询。

with的一般用法:

with clausename AS
(
subquery
)
main query referencing clausename;

例子:

-- define with clause
with saletot as
    (
     select dname, sum(sal) as dept_total
     from emp, dept
     where emp.deptno = dept.deptno
     group by dname
    )
-- Main query which use the with clause
   select dname, dept_total
   from saletot        -- Reference to with clause
   order by dept_total desc;

【讨论】:

  • 如果你对选择使用 with 子句,连接发生的地方,连接只运行一次,我想是的。
  • 我的意思是这样:使用内部作为 SELECT DISTINCT Tob.FacilitygroupId ... from BIReport.dbo.vIndianatest "Tob" INNER JOIN [BIreport].[dbo].[DimIndicator] "DimIndicator" ... SELECT [FacilityGroupID],[LocationGroupID]..,SUM([Denominator]) as [Denominator] ,SUM([Numerator]) as [Numerator] from inner GROUP BY ...
  • @OliC - 感谢您的意见
猜你喜欢
  • 1970-01-01
  • 2011-02-16
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 2012-07-24
  • 1970-01-01
  • 2011-05-03
相关资源
最近更新 更多