加入视图时的SQL性能问题

加入视图时的SQL性能问题,sql,sql-server,performance,join,view,Sql,Sql Server,Performance,Join,View,我有一个查询,在与视图上的查询连接后,运行它需要花费很长时间。加入前,需要2分钟。联接查询本身需要1分钟。他们一起走了20多分钟 我的问题是: 除了在视图上创建索引外,我还能做些什么来加快此查询的运行速度 创建索引会使此查询在合理的时间内运行吗 谢谢。问题是: DECLARE @year INT=2017; WITH data AS ( SELECT M.Brand, M.SubBrand, M.Detail, S.Units, S.OB, [PRODUCTION_DATE]

我有一个查询,在与视图上的查询连接后,运行它需要花费很长时间。加入前,需要2分钟。联接查询本身需要1分钟。他们一起走了20多分钟

我的问题是:

  • 除了在视图上创建索引外,我还能做些什么来加快此查询的运行速度
  • 创建索引会使此查询在合理的时间内运行吗
谢谢。问题是:

    DECLARE @year INT=2017;
WITH data AS (
    SELECT M.Brand, M.SubBrand, M.Detail, S.Units, S.OB, [PRODUCTION_DATE] = RIGHT(S.DateId,2)
    , [PRODUCTION_YEAR] = LEFT(S.DateId,4), [PRODUCTION_MONTH] = SUBSTRING(CONVERT(VARCHAR(10), S.DateId),5,2) FROM [fact].[Sales] V
    LEFT JOIN [dim].[Material] M ON M.MaterialId = S.MaterialId
    INNER JOIN (SELECT [MaterialId]
                  ,[ROF]
                  ,[OB]
              FROM [Objectives].[load].[FactData_KPI_Sales_OB_ROF]
              WHERE ROF > 0) RFOB ON RFOB.MaterialId = S.MaterialId
    WHERE LEFT(S.DateId,4) > @year
)
SELECT Brand, SubBrand, Detail, [PRODUCTION_MONTH], [PRODUCTION_YEAR], OB, [01], [02], [03], [04], [05], [06], [07], [08], [09], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31]
FROM data
Pivot (
    SUM(Units)
    FOR [PRODUCTION_DATE] In
    ([01], [02], [03], [04], [05], [06], [07], [08], [09], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31])
    ) AS piv

您是否尝试过使用临时表而不是普通表

DECLARE @year INT=2017;
SELECT M.Brand, M.SubBrand, M.Detail, S.Units, S.OB, [PRODUCTION_DATE] = RIGHT(S.DateId,2)
        , [PRODUCTION_YEAR] = LEFT(S.DateId,4), [PRODUCTION_MONTH] = SUBSTRING(CONVERT(VARCHAR(10), S.DateId),5,2) 
    Into #tmpData   
        FROM [fact].[Sales] V
        LEFT JOIN [dim].[Material] M ON M.MaterialId = S.MaterialId
        INNER JOIN (SELECT [MaterialId]
                      ,[ROF]
                      ,[OB]
                  FROM [Objectives].[load].[FactData_KPI_Sales_OB_ROF]
                  WHERE ROF > 0) RFOB ON RFOB.MaterialId = S.MaterialId
        WHERE LEFT(S.DateId,4) > @year

    SELECT Brand, SubBrand, Detail, [PRODUCTION_MONTH], [PRODUCTION_YEAR], OB, [01], [02], [03], [04], [05], [06], [07], [08], [09], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31]
    FROM #tmpData
    Pivot (
        SUM(Units)
        FOR [PRODUCTION_DATE] In
        ([01], [02], [03], [04], [05], [06], [07], [08], [09], [10], [11], [12], [13], [14], [15], [16], [17], [18], [19], [20], [21], [22], [23], [24], [25], [26], [27], [28], [29], [30], [31])
        ) AS piv
你试过这个吗

    DECLARE @year INT=2017;
WITH data AS (
    SELECT M.Brand, M.SubBrand, M.Detail, S.Units, S.OB, [PRODUCTION_DATE] = RIGHT(S.DateId,2)
    , [PRODUCTION_YEAR] = LEFT(S.DateId,4), [PRODUCTION_MONTH] = SUBSTRING(CONVERT(VARCHAR(10), S.DateId),5,2) FROM [fact].[Sales] S
    LEFT JOIN [dim].[Material] M ON M.MaterialId = S.MaterialId
    INNER JOIN   [Objectives].[load].[FactData_KPI_Sales_OB_ROF] RFOB 
关于RFOB.MaterialId=S.MaterialId 左上角(S.DateId,4)>@year和RFOB.ROF>0
)

这是为哪个RDBMS设计的?无论您使用的是MySQL、PostgreSQL、Oracle、SQL Server还是IBM DB2,甚至是其他什么,这通常都会产生影响。请在您的问题中添加相关标签@marc_这是SQL Server的,谢谢你的回复。这样看起来更有条理,但不幸的是它没有起作用。谢谢普林斯,我尝试了这个解决方案。SELECT INTO语句需要永远运行(运行20分钟以上,什么也没有)。SELECT查询需要多长时间?如果它很大,您是否为分区设置了它?