查询Azure SQL外部表时,不会远程评估WHERE子句

时间:2018-06-04 11:52:17

标签: sql sql-server azure azure-sql-database azure-sql-server

我使用external tables功能将一些数据从一个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上按预期工作,因此实际的解决方法似乎是临时表。)

更新
对于本地表,以及从远程表插入本地ID时,问题只能通过IDENTITY_INSERT = ON重现。

假设[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;

0 个答案:

没有答案