Sql-Server
從連結伺服器加入表非常慢
我有一個生產 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 <> 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 <= 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 上保留表的副本,然後使用表的本地副本創建連接?