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