Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何提高此存储过程的性能?_Sql Server_Performance_Indexing - Fatal编程技术网

Sql server 如何提高此存储过程的性能?

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

我正在尝试加快存储过程的执行时间。特别是一个内部连接的执行大约需要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);

我意识到这可能有点混乱,因为我重命名了所有的列和表,如果没有意义,请让我知道,我会尝试使用更好的命名约定。

可能会发布实际的执行计划,但很可能

AND TBL4.COLA % 1000 = TBL3.COLC

是导致速度缓慢的原因。索引中列的顺序也可能会影响速度。这取决于数据集的大小。请尝试将它们从最有选择性到最无选择性进行排序。例如,如果TBL4.COLE是1/0值,并且只有很少的0,则可能将其作为索引中的第一列。

在不知道行数的情况下,选择等等。真的很难说什么。我建议

  • 删除所有带有(索引…)的
    (并且永不返回)
  • 更新所有表的统计信息(例如,使用FULLSCAN更新统计信息TBL_2)
  • 添加所有可能的索引。表TBL_3和TBL_4有6个索引,TBL_2有两个索引
  • 运行查询,查看使用了哪些索引以及时间

  • 如果时间合适,您可以删除不需要的索引。如果时间不合适,您可能需要对
    %1000
    执行一些操作。您可以将计算后的持久列和索引改为该列。

    我投票以主题外的形式结束,因为没有“bug”就代码本身而言,它比OP期望的要慢。我认为这个问题更适合dba.stackexchange.com。他们的帮助页面上说,主题问题包括“数据库管理,包括配置和备份/恢复,高级查询,包括窗口函数,动态sql和查询性能”