Sql-Server

使用功能更新時的遠端掃描

  • June 4, 2021

為什麼通過連結伺服器更新時使用 ISNULL() 使用遠端掃描檢索所有行並在本地過濾而不是通過遠端查詢過濾?

UPDATE LINKEDSERVER1.database1.dbo.table1 WITH(ROWLOCK)
SET number = ISNULL(number,0)
WHERE accounts = '123'

UPDATE LINKEDSERVER1.database1.dbo.table1 WITH(ROWLOCK)
SET number = number
WHERE accounts = '123'

執行計劃如下: 執行計劃1

該表確實為accounts 列提供了一個非聚集唯一索引,但是在accounts 列上沒有使用ISNULL(),並且該索引應該仍然可用。我在這裡錯過了什麼嗎?

我在這裡錯過了什麼嗎?

並不真地。您會發現分佈式查詢處理有很多像這樣的棘手限制。

因此,使用連結伺服器的經驗法則是,如果您想要遠端執行,則始終使用直通查詢。

exec (
'
UPDATE database1.dbo.table1 WITH(ROWLOCK)
SET number = ISNULL(number,0)
WHERE accounts = ''123''
'
) at LINKEDSERVER1

這只是一個猜測,很可能只是沒有允許ISNULL(number,0)推送到遠端伺服器的轉換。

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