我需要从链接服务器读取数据并插入到本地表中。我需要删除数据中的重复项,并且我需要在本地服务器上执行此操作,因为远程服务器已超载。因此,我添加了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 中的几百行,因此通过网络传输的数据量不会有太大变化。
我的建议是切换到可以以更好的方式处理此问题的 SSIS 包,在源和目标处使用缓冲区,比链接服务器更快。
请看一下:
https://social.technet.microsoft.com/wiki/contents/articles/30703.ssis-implementing-a-faster-distinct-sort-or-aggregate-transformation.aspx
我假设 ManyManyColumns 真的是多列而不是一列?...我看到你的评论说它实际上是 110。
10,000 行是您的 SQL Server 版本中远程扫描操作的默认基数估计,因此很遗憾,我认为您无法做太多改变。
目前慢到什么程度?请记住,即使基数估计非常准确,300 万行总是需要通过网络/链接服务器传输大量数据,尤其是在您有很多列的情况下。
我目前唯一的一般想法是
DISTINCT
在远程服务器上预先准备数据,或者使用数据同步功能(如复制)将其复制到本地服务器,而不是使用链接服务器。如果我想到其他任何事情,我会相应地更新我的答案。