【发布时间】:2017-06-20 01:23:44
【问题描述】:
我正在尝试加快存储过程的执行时间。特别是一个内部连接需要大约 5 秒来执行。我查看了执行计划,似乎瓶颈在内部连接上。
我尝试创建一些非聚集索引,因为索引查找(非聚集)的成本为 65%。
如果我没有提供足够的信息,请原谅我,因为我不习惯在 sql 中使用索引。
由于表中包含大量数据,因此执行该查询大约需要 5 秒:
INSERT INTO TBL_1(TBL2.COLA, TBL4.COLA, TBL4.COLB, TBL4.COLC, TBL3.COLA)
SELECT TBL2.COLA, TBL4.COLA, TBL4.COLB, TBL4.COLC, TBL2.COLB
FROM TBL_2 TBL2 with(index(idx_tbl2IDX))
INNER JOIN TBL_3 TBL3 with(index(idx_tbl3IDX))
ON TBL2.COLB = TBL3.COLB
INNER JOIN TBL_4 TBL4 with(index(idx_tbl4IDX))
ON TBL3.COLA = TBL4.COLD
AND TBL4.COLA % 1000 = TBL3.COLC
AND TBL4.COLE = 0
WHERE TBL2.COLC = 1
这是我的索引(我最初只是为 TBL_4 创建了一个索引,因为这是执行计划中最大的成本所在,但我最终为每个表创建了一个索引以查看它是否有任何区别,但它没有
CREATE NONCLUSTERED INDEX [idx_tbl4IDX]
ON [dbo].TBL_4(COLD, COLA, COLE)
INCLUDE (COLB, COLC);
CREATE NONCLUSTERED INDEX [idx_tbl3IDX]
ON [dbo].TBL_3 (COLB, COLA, COLC)
CREATE NONCLUSTERED INDEX [idx_tbl2IDX]
ON [dbo].TBL_2(COLB, COLC)
INCLUDE (COLA);
我意识到这可能有点令人困惑,因为我重命名了所有列和表,如果没有意义,请告诉我,我会尝试使用更好的命名约定。
【问题讨论】:
-
我投票关闭作为题外话,因为代码本身没有“错误”,它只是比 OP 的期望慢。我认为这个问题更适合 dba.stackexchange.com。他们的帮助页面显示,主题问题包括“数据库管理,包括配置和备份/恢复,高级查询,包括窗口函数、动态 sql 和查询性能”
标签: sql-server performance indexing