我有一个有趣的案例,SQL Server返回的结果集会有所不同,具体取决于查询是在本地还是远程执行。
实质上,如果我执行以下查询:
SELECT p.ID AS Id
FROM csdb.users.People AS p
LEFT JOIN csdb.users.Accounts AS a ON p.ID = a.IdentityId
然后执行左连接,然后我获得633行。但是,如果我以远程执行查询:
SELECT p.ID AS Id
FROM quantdb.csdb.users.People AS p
LEFT JOIN quantdb.csdb.users.Accounts AS a ON p.ID = a.IdentityId
然后不执行左连接,执行People表的索引扫描,并且仅返回564条记录。本质上,似乎在远程情况下,优化器正在说'好吧,你不需要Accounts表中的任何列,所以我不会进行连接'而在另一种情况下,它说'我会做加入'。
远程和本地查询的优化器行为的差异是SQL Server的已知“功能”,还是这个错误?
我们正在使用SQL Server 2008,SP1
答案 0 :(得分:1)
如果Accounts.IdentityId
上存在唯一约束,则不进行连接是有效的优化,因为连接不能添加任何新行(非唯一列会导致p.ID重复每个对应的副本Accounts.IdentityId)。
您可以发布表格的确切模式,包括所有索引和约束吗?我想看看它是否有责备。