我使用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;