Sql-Server

sql可以為這個過程生成一個好的計劃嗎?

  • July 19, 2012

我讀過那些本身並不總是做同樣事情的過程,不會總是產生一個好的計劃。也就是說(如果我錯了,請糾正我),如果我有一個 proc,如果這一天是偶數,它從表 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

SQL Server 2005+ 具有語句級重新編譯。因此,IIRC 您將根據分支機構獲得最佳計劃。

但是,您的程式碼不是並發安全的。對於 NOT EXISTS,兩個重疊的呼叫可能會為真:你會得到一個錯誤。這就是您在 SQL Server 2008 上使用 MERGE 的原因。

或舊版本的各種 JDFI 模式。另請參閱需要幫助排除 Sql Server 2005 死鎖方案,它有幾個選項:它也取決於您的負載

引用自:https://dba.stackexchange.com/questions/21071