如何提示遠端掃描操作員估計超過 10000 行?
我需要從連結伺服器讀取數據並插入到本地表中。我需要刪除數據中的重複項,並且我需要在本地伺服器上執行此操作,因為遠端伺服器已超載。因此,我添加了
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
在遠端伺服器上預先準備數據,或者使用數據同步功能(如複製)將其複製到本地伺服器,而不是使用連結伺服器。如果我想到其他任何事情,我會相應地更新我的答案。