用于数据透视的索引

时间:2017-06-06 17:13:39

标签: sql sql-server tsql

SQL新手。我有一个约20万条记录的无索引表,每个任务有一行,每个作业需要一行,每个作业行包含任务和任务日期。我使用一个支点来完成这个工作。我有一些巨大的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

源表有列

 Job 
,TSK_CD
,FORECAST_DATE
,ACTUAL_DATE

结果表有:

Job   Code1F   Code1A   Code2F  Code2A  Code3F   Code3A....

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

1 个答案:

答案 0 :(得分:3)

覆盖指数:

create nonclustered index ix_Task_Details__Job_Tsk_Cd_cover)
  on dbo.Task_Details (Job,Tsk_Cd)
    include (Forecast_Date,ActualDate)

您可以尝试使用条件聚合而不是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