sql 可以为这个程序生成一个好的计划吗?

Jas*_*son 5 sql-server stored-procedures optimization execution-plan sql-server-2008-r2

我读过那些本身并不总是做同样事情的过程,不会总是有一个好的计划。也就是说(如果我错了,请纠正我),如果我有一个过程,如果当天是偶数,它从表 X 中读取,否则它从表 Y 中读取,并且它第一次执行的时间是偶数,那么生成的计划将被优化对于从表 X 读取而不是从 Y 读取,即使从 Y 读取,sql 也会使用该计划,恕我直言很容易理解并尽量避免,但是作用于同一个表的过程呢。

像下面的示例(显然是一个非常简单的示例),如果它第一次运行,并且该项目确实存在,而随后的运行通常不存在(或反之亦然),我是否会得到一个“不太好”的计划这会影响性能?

CREATE PROCEDURE dbo.MyProc
(
@data    VarChar(25),
@name    VarChar(25)
)

AS

    IF NOT EXISTS (SELECT * FROM dbo.MyTable WHERE myname = @name)
    BEGIN
        INSERT dbo.MyTable (myname, mydata)
        VALUES (@name, @data)
    END
    ELSE
    BEGIN
        UPDATE dbo.MyTabel
        SET mydata = @data
        WHERE myname = @name
    END
Run Code Online (Sandbox Code Playgroud)

gbn*_*gbn 5

SQL Server 2005+ 具有语句级重新编译。因此,IIRC 您将根据分支获得最佳计划。

但是,您的代码不是并发安全的。对于 NOT EXISTS,两个重叠的调用可能为真:你得到一个错误。这就是您在 SQL Server 2008 上使用 MERGE 的原因。

或旧版本的各种 JDFI 模式。另请参阅需要帮助对 Sql Server 2005 Deadlock Scenario进行故障排除,其中有几个选项:这也取决于您的负载