Sql server 如何提高此存储过程的性能?
我正在尝试加快存储过程的执行时间。特别是一个内部连接的执行大约需要5秒钟。我看了看执行计划,似乎瓶颈在内部连接 我尝试创建一些非聚集索引,因为索引查找(非聚集)的成本为65% 如果我没有提供足够的信息,请原谅,因为我不太习惯在sql中使用索引 由于表包含大量数据,因此执行查询需要约5秒钟:Sql server 如何提高此存储过程的性能?,sql-server,performance,indexing,Sql Server,Performance,Indexing,我正在尝试加快存储过程的执行时间。特别是一个内部连接的执行大约需要5秒钟。我看了看执行计划,似乎瓶颈在内部连接 我尝试创建一些非聚集索引,因为索引查找(非聚集)的成本为65% 如果我没有提供足够的信息,请原谅,因为我不太习惯在sql中使用索引 由于表包含大量数据,因此执行查询需要约5秒钟: INSERT INTO TBL_1(TBL2.COLA, TBL4.COLA, TBL4.COLB, TBL4.COLC, TBL3.COLA) SELECT TBL2.COLA, TBL4.COLA, TB
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);
我意识到这可能有点混乱,因为我重命名了所有的列和表,如果没有意义,请让我知道,我会尝试使用更好的命名约定。可能会发布实际的执行计划,但很可能
AND TBL4.COLA % 1000 = TBL3.COLC
是导致速度缓慢的原因。索引中列的顺序也可能会影响速度。这取决于数据集的大小。请尝试将它们从最有选择性到最无选择性进行排序。例如,如果TBL4.COLE是1/0值,并且只有很少的0,则可能将其作为索引中的第一列。在不知道行数的情况下,选择等等。真的很难说什么。我建议
(并且永不返回)
如果时间合适,您可以删除不需要的索引。如果时间不合适,您可能需要对
%1000
执行一些操作。您可以将计算后的持久列和索引改为该列。我投票以主题外的形式结束,因为没有“bug”就代码本身而言,它比OP期望的要慢。我认为这个问题更适合dba.stackexchange.com。他们的帮助页面上说,主题问题包括“数据库管理,包括配置和备份/恢复,高级查询,包括窗口函数,动态sql和查询性能”