【问题标题】:Procedure Advice程序建议
【发布时间】:2015-04-14 20:25:25
【问题描述】:

我希望在生产数据库中提高我们其中一个流程的性能。我们有 2 组 SP,它们通过存储在配置表中的配置设置。

一个示例语法是:

Declare @SWITCH BIT

IF @SWITCH = 1
INSERT INTO DEST_TABLE_A 
SELECT VALUES
  FROM SOURCE_TABLE

IF @SWITCH = 2
INSERT INTO DEST_TABLE_B
SELECT VALUES
  FROM SOURCE_TABLE

在这种情况下,将 IF 逻辑移动到 WHERE 子句中以创建标准化而不是其中包含条件的逻辑会更好吗?

例如

INSERT INTO DEST_TABLE_A
SELECT VALUES 
FROM SOURCE_TABLE
WHERE @SWITCH = 1

INSERT INTO DEST_TABLE_B
SELECT VALUES
FROM SOURCE_TABLE
WHERE @SWITCH = 2

我很欣赏这可能是一篇观点文章,但我很好奇是否有其他人有过这种情况的经验。

【问题讨论】:

  • IMO,IF 语句(我将其写为 IF/ELSE)会更好,因为这样只会进行 1 个 INSERT INTO 调用,而您的第二个示例将执行 2 个 INSERT INTO调用,即使没有插入任何内容。像第二个例子一样写出来对我来说也没有意义,因为 @SWITCH 一次只能设置为 1 个值,因此实际上只会使用一个插入语句。

标签: sql-server-2012 sql-server-2014 query-performance


【解决方案1】:

第二个示例可能会将您引导至 parameter sniffing problem 。 (longer explanation here)

这个问题是由生成执行计划的查询优化器造成的,该计划针对 switch 语句的一个值(这是您在调用存储过程时第一次发送的值)进行了优化。

在您的情况下,如果您第一次使用@switch = 1 调用存储过程,则会生成此参数的执行计划。 @switch = 2 的后续调用可能需要更长的时间来处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 2013-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2011-06-10
    • 2015-04-07
    相关资源
    最近更新 更多