Sql-Server

如何提示遠端掃描操作員估計超過 10000 行?

  • June 4, 2021

我需要從連結伺服器讀取數據並插入到本地表中。我需要刪除數據中的重複項,並且我需要在本地伺服器上執行此操作,因為遠端伺服器已超載。因此,我添加了DISTINCT按照我想要的方式執行 Distinct Sort 的子句。

問題是 Remote Scan 運算元總是估計行數為 10000,而實際行數約為 3M。因此,排序溢出到磁碟並變得很慢。

如果有辦法向優化器提示實際行數遠遠超過 10K?

我應該將原始數據載入到本地臨時表中,然後從本地表中執行 DISTINCT 嗎?我不想兩次寫入磁碟。

重複的行數很少——3M 中只有幾百行。我的意思是,在刪除重複項之前,大約有 3,000,000 行;刪除重複項後,大約有 2,999,800 行。因此,刪除遠端伺服器上的重複數據不會顯著減少通過網路傳輸的數據量。

目標表在插入之前被截斷,所以我總是插入一個空表。此外,目標表沒有任何索引、觸發器或約束。表中有很多列。大約 110 列。在下面的查詢中,我ManyManyColumns改為寫了。

查詢:

WITH
CTE_Raw
AS
(
SELECT
   [ManyManyColumns]
FROM OpenQuery([remote_server],'
SELECT
   [ManyManyColumns]
FROM
   [DB].[dbo].[remote_view]
')
)
,CTE_Converted
AS
(
   SELECT DISTINCT
       [ManyManyColumns]
   FROM
       CTE_Raw
)
INSERT INTO [dbo].[TestVBFast2]
   ([ManyManyColumns]
   )
SELECT
   [ManyManyColumns]
FROM
   CTE_Converted
;

執行計劃

遠端掃描

SQL Server 版本:

Microsoft SQL Server 2012 (SP4) (KB4018073) - 11.0.7001.0 (X64)
2017 年 8 月 15 日 10:23:29
版權所有 (c) 微軟公司
Windows NT 6.3(內部版本 9600:)(管理程序)上的標準版(64 位)

我想在DISTINCT本地執行,因為遠端伺服器超載,我想減少它的負載。DISTINCT將僅刪除 3M 中的幾百行,因此通過網路傳輸的數據量不會有太大變化。

我假設 ManyManyColumns 真的是多列而不是一列?…我看到你的評論說它實際上是 110。

10,000 行是您的 SQL Server 版本中遠端掃描操作的預設基數估計,因此很遺憾,我認為您無法做太多改變。

目前慢什麼程度?請記住,即使基數估計非常準確,300 萬行總是需要通過網路/連結伺服器傳輸大量數據,尤其是在您有很多列的情況下。

我目前唯一的一般想法是DISTINCT在遠端伺服器上預先準備數據,或者使用數據同步功能(如複製)將其複製到本地伺服器,而不是使用連結伺服器。如果我想到其他任何事情,我會相應地更新我的答案。

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