Sql-Server

從連結伺服器加入表非常慢

  • November 6, 2018

我有一個生產 SQL 伺服器和一個連結伺服器(Azure SQL 數據庫)

我加入兩個表做更新

Table A - small table A in TempDB that has only 100 rows on SQL Server
Table B - on linked server, is about 90 MB in size and 334,000 rows total

當我在查詢下執行時

update A
   set A.ColumnA = B.ColumnB
from #Table A
   join [LinkedServer].[DB].[dbo].[Table] B on
        A.ID = B.ID

100行的更新大約需要18秒!1000 行或更多行需要更多時間

我確定以下是真的:

Column B.ID is indexed
Collation Compatible setting in Linked Server Options is set to "True"

我什至嘗試顯著擴展 Azure SQL DB(從 20 DTU 到 800 DTU),但是查詢速度(100 行更新)從 18 秒到 8 秒,這仍然是不可接受的

我錯過了什麼?在這種情況下有什麼解決方法嗎?

問候,

在 A.ID 上放一個索引

添加一個 <> 以便它可以避免鎖定

update A
   set A.ColumnA = B.ColumnB
from #Table A
join [LinkedServer].[DB].[dbo].[Table] B 
 on A.ID = B.ID 
where A.ColumnA &lt;&gt; B.ColumnB or A.ColumnA is null

如果您擷取與此特定查詢相關的等待,您將看到 OLEDB 等待類型的高值,這在使用連結伺服器查詢遠端伺服器時很常見。據我所知,你無法避免這種情況。我在這裡寫過。

您可以使用以下腳本擷取查詢等待:

DROP TABLE IF EXISTS #before;
SELECT [wait_type], [waiting_tasks_count], 
[wait_time_ms], [max_wait_time_ms],
[signal_wait_time_ms]
INTO #before
FROM sys.[dm_db_wait_stats];

-- Execute test query here

DECLARE @Rows INT
SELECT @Rows = 100

;WITH Q AS
(
SELECT A.StateProvince, A.CountryRegion,
ROW_NUMBER() OVER (PARTITION BY A.CountryRegion ORDER BY A.StateProvince, A.CountryRegion) GrpRow
FROM SalesLT.Address A
)
SELECT TOP(@Rows) Q.*
FROM Q
WHERE GrpRow &lt;= 1 + CEILING(@Rows * 1.0 / ( SELECT COUNT(DISTINCT CountryRegion) FROM Q))

-- Finish test query

DROP TABLE IF EXISTS #after;
SELECT [wait_type], [waiting_tasks_count], [wait_time_ms], [max_wait_time_ms],
[signal_wait_time_ms]
INTO #after
FROM sys.[dm_db_wait_stats];

-- Show accumulated wait time

SELECT [a].[wait_type], ([a].[wait_time_ms] - [b].[wait_time_ms]) AS [wait_time]
FROM [#after] AS [a]
INNER JOIN [#before] AS [b] ON
[a].[wait_type] = [b].[wait_type]
ORDER BY ([a].[wait_time_ms] - [b].[wait_time_ms]) DESC;

有關如何擷取特定查詢等待的更多方法,請閱讀此處

查看查詢計劃,您可能還會發現沒有索引參與連接。

是否可以使用 SQL 數據同步在本地 SQL Server 上保留表的副本,然後使用表的本地副本創建連接?

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