我正在尝试加快存储过程的执行时间。特别是一个内部连接需要大约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创建了一个索引,因为这是执行计划中最大的成本,但我最终为每个表创建了一个,看它是否有任何区别,它没有&#39 ;吨
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);
我意识到这可能有点令人困惑,因为我重命名了所有列和表,如果没有意义请告诉我,我会尝试使用更好的命名约定。
答案 0 :(得分:0)
也许发布实际的执行计划,但很可能是这个
AND TBL4.COLA % 1000 = TBL3.COLC
导致缓慢。索引中列的顺序也可能会出现这种情况,具体取决于数据集的大小。尝试从大多数到最少选择性排序。例如,如果TBL4.COLE是1/0值并且只有很少的0,那么可能使其成为索引中的第一列。
答案 1 :(得分:0)
在不知道行数,选择性等的情况下,很难说什么。我建议
with(index...
(并且永不退回)如果时间还可以,你可以删除你不需要的索引。如果不是,您可能需要对% 1000
执行某些操作。您可以改为计算持久化列和索引。