【发布时间】:2012-12-05 11:29:11
【问题描述】:
我有以下疑问:
SELECT fpa.scenario_id,
fpa.facility_id,
cge.CostGroupId result_total_id,
mp_surrogate_id,
CAST(SUM(fpa.raw_amount * cge.CostSign) AS DECIMAL(25, 13))
result_total_amount
INTO ADM_FactProfitTotalAmount_1
FROM #tempAmount fpa
JOIN ResultTest cge ON cge.CostId = fpa.process_id
WHERE fpa.scenario_id = 1
GROUP BY fpa.scenario_id, fpa.facility_id, cge.CostGroupId, fpa.mp_surrogate_id
- 在
#tempAmount我有 2.2 亿行。 - 在
ResultTest我有 150 行。
我在#tempAmount上有一个索引:
CREATE NONCLUSTERED INDEX #tempAmount_process_id
ON #tempAmount(scenario_id, facility_id, mp_surrogate_id, process_id )
执行大约需要 1 小时。可以优化吗?
编辑:
我在 ResultTest 列 CostId 上创建了索引,更改了一些其他索引和查询
CREATE CLUSTERED INDEX #tempFactAmount_index
ON #tempAmount (process_id ,facility_id, mp_surrogate_id )
SELECT ISNULL(CAST(1 as BIGINT), 0) scenario_id,
fpa.facility_id,
cge.CostGroupId result_total_id,
fpa.mp_surrogate_id,
CAST(SUM(fpa.raw_amount * cge.CostSign) AS DECIMAL(25, 13)) result_total_amount
INTO ADM_FactProfitTotalAmount_1
FROM ResultTest cge
JOIN #tempAmount fpa ON cge.CostId = fpa.process_id
GROUP BY fpa.facility_id, fpa.mp_surrogate_id, cge.CostGroupId
执行计划:
41% 插入 ADM_FactProfitTotalAmount_1
51% 哈希匹配聚合
2% 哈希匹配内连接
【问题讨论】:
-
你在
process_id上也有索引吗?从 JOIN 条件来看,定义一个似乎是有益的。将process_id移动到第二个索引列也可能会有所帮助。但是,如果没有查询计划,就很难判断瓶颈在哪里。 -
关于优化选择的良好网络广播:brentozar.com/archive/2012/10/…
-
尝试在 #tempAmount 上创建一个 CLUSTERED INDEX 仅在列 scenario_id 上。
-
fpa.schenario_id = 1 的选择性如何?
-
我从查询中删除了 fpa.schenario_id = 1,抱歉误导,请参阅下面的查询
标签: sql sql-server performance query-optimization