1

我正在使用外部表功能将一些数据从一个 Azure SQL 数据库拉到另一个。

如“性能改进”中所述,确保在远程服务器上评估 WHERE 子句很重要。这确保只返回所需的行,而不是返回整个远程表并在本地服务器上对其进行过滤。

这适用于如下查询:
SELECT column_list FROM remote_table WHERE some_clause

但是,如果我将它与本地插入相结合:
INSERT INTO local_table (column_list) SELECT column_list FROM remote_table WHERE some_clause

.. 突然整个表被返回,而 some_clause 在本地被评估,对性能造成了巨大的影响。
我无法重现两个本地 SQL 实例之间的问题(诚然使用链接服务器而不是外部表)。WHERE 总是按预期进行远程评估。

为什么会出现差异?
有没有办法将查询优化器推向正确的方向?

(SELECT INTO 实际上在 Azure 上按预期工作,因此实际的解决方法似乎是一个临时表。)

更新:
只有在本地表的 IDENTITY_INSERT = ON 以及从远程表插入本地 ID 时,该问题才能重现。

假设 [Id] 是本地标识列,这会触发问题:
SET IDENTITY_INSERT local_table ON;
INSERT INTO local_table (Id) SELECT Id FROM remote_table WHERE Id = 1;

但是,指定 Id 而不是拉它可以正常工作:
INSERT INTO local_table (Id) SELECT 1 FROM remote_table WHERE Id = 1;

4

0 回答 0