用于枢轴的索引

sho*_*ton 4 sql t-sql sql-server

SQL 新手。我有一个大约 2000 万条记录的未索引表,每个任务有一行,每个作业需要一行,每个作业行包含任务和任务日期。我使用一个支点来完成这个工作。我有一些巨大的 tempdb 增长,这是有问题的。我需要帮助调整此查询。当我查看执行计划时,我看到大约 80% 是由于表扫描。我认为索引源表会有所帮助,但我不确定如何索引。

SELECT Job
    ,TSK_CD + 'F' AS TaskCode
    ,CAST(FORECAST_DATE AS SMALLDATETIME) AS TaskDate
FROM Task_Details AS FcstDateQuery
WHERE FORECAST_DATE IS NOT NULL

UNION

SELECT Job
    ,TSK_CD + 'A' AS TaskCode
    ,CAST(ACTUAL_DATE AS SMALLDATETIME) AS TaskDate
FROM Task_Details AS ActDateQuery
WHERE ACTUAL_DATE IS NOT NULL
) AS TaskDateQuery

PIVOT(MAX(TaskDate) FOR TaskCode IN (
            [Code1F]
            ,[Code1A]
            ,[Code2F]
            ,[Code2A]
            ,[Code3F]
            ,[Code3A]
                    <... a bunch of other task codes>

            )) AS Piv
Run Code Online (Sandbox Code Playgroud)

源表有列

 Job 
,TSK_CD
,FORECAST_DATE
,ACTUAL_DATE
Run Code Online (Sandbox Code Playgroud)

结果表有:

Job   Code1F   Code1A   Code2F  Code2A  Code3F   Code3A....
Run Code Online (Sandbox Code Playgroud)

我很感激有关如何索引源表或改进查询的指针。源表是静态数据(通过推送给我每天更改一次)。我使用查询来构建目标表。

Sql*_*Zim 5

覆盖指数:

create nonclustered index ix_Task_Details__Job_Tsk_Cd_cover)
  on dbo.Task_Details (Job,Tsk_Cd)
    include (Forecast_Date,ActualDate)
Run Code Online (Sandbox Code Playgroud)

您可以尝试条件聚合而不是pivot()

select 
    Job
  , [Code1F] = max(case when Tsk_Cd='Code1' then ForeCast_Date end)
  , [Code1A] = max(case when Tsk_Cd='Code1' then Actual_Date end)
  , [Code2F] = max(case when Tsk_Cd='Code2' then ForeCast_Date end)
  , [Code2A] = max(case when Tsk_Cd='Code2' then Actual_Date end)
  , [Code3F] = max(case when Tsk_Cd='Code3' then ForeCast_Date end)
  , [Code3A] = max(case when Tsk_Cd='Code3' then Actual_Date end)
from dbo.Task_Details
group by Job
Run Code Online (Sandbox Code Playgroud)