2015-04-14 33 views
2

我正在寻求提高生产数据库中某个进程的性能。我们有两组SP,这些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子句来创建一个标准化的而不是内它有条件的逻辑是什么?

E.g.

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 

我很欣赏这可能是一个意见,但我很好奇,看看是否有其他人有过这种情况下的经验。

+0

IMO,IF语句(我会把它写成IF/ELSE)会更好,因为那样它只会是1 INSERT INTO调用正在进行,而您的第二个示例将执行2 INSERT INTO调用,如果没有插入。把它写出来就像第二个例子一样没有意义,因为'@ SWITCH'一次只能设置为1,所以实际上只会使用其中一个插入语句。 –

回答

0

第二个例子可能会导致您到 parameter sniffing problem。 (longer explanation here

此问题由查询优化程序创建,该查询优化程序针对switch语句的某个值生成优化的执行计划(并且这是您在第一次调用存储过程时发送的值)。

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