【问题标题】:How can I improve this stored procedure performance?如何提高此存储过程的性能?
【发布时间】: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


【解决方案1】:

也许贴出实际的执行计划,但很可能是这样

AND TBL4.COLA % 1000 = TBL3.COLC

导致缓慢。索引中列的顺序也可能会影响到这一点,具体取决于您的数据集有多大。尝试从最有选择性的顺序排列它们。例如,如果 TBL4.COLE 是一个 1/0 值并且很少有 0,那么也许将它作为索引中的第一列。

【讨论】:

    【解决方案2】:

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

    1. 删除所有with(index...(并且永远不要退回)
    2. 更新所有表的统计信息(例如 UPDATE STATISTICS TBL_2 WITH FULLSCAN)
    3. 添加所有可能的索引。表 TBL_3 和 TBL_4 有 6 个,TBL_2 有两个。
    4. 运行查询,查看使用了哪些索引以及时间。

    如果时间合适,你可以删除不需要的索引。如果不是,您可能需要对% 1000 做一些事情。您可以改为创建计算的持久列和索引。

    【讨论】:

      猜你喜欢
      • 2016-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多