在一项新任务中,我遇到了一个SQL Server 2000 :(我在那里找到了大量没有任何聚簇索引的大型表。所以我建议改变它。在测试时,我们发现 - 并且经过双重检查 - 至少有一个当PK索引被聚类时,查询没有返回相同的结果 我知道查询很难看;它由GUI生成,用户可以在其中选择自定义报告的字段和条件。这是查询:
SELECT DISTINCT p.*, pcc.PatentCostCentreLink_pk, pcc.Client_fk,
pcc.Division_fk, pcc.CostCentre_fk, pcc.Reference, pcc.DecisionMaker
FROM dbo.Patent AS p
LEFT OUTER JOIN dbo.PatentCostCentreLink AS pcc ON p.Patent_pk = pcc.Patent_fk
WHERE (pcc.Client_fk = 2787) AND (pcc.Division_fk IS NULL)
AND (pcc.CostCentre_fk = 20066) AND (pcc.Reference LIKE 'P1049%')
我的问题是:使用相同的表格 - 将1 PK从non-clustered
更改为clustered
- 为什么/如何可能相同的查询会返回不同的结果集吗? (23行非聚集索引,1行聚簇索引)
关于查询中的废话的评论是无用的。我知道它很糟糕。
注意:更改的索引是PK_PatentCostCentreLink,位于dbo.PatentCostCentreLink.PatentCostCentreLink_pk(标识列)。
Note2 :删除DISTINCT
或将JOIN
更改为INNER
时,两个数据库都会按预期返回相同的结果(23行)。但我提到过,这是另一个问题。
答案 0 :(得分:1)
我会检查几件事:
dbcc checkdb()
命令错过了一些差异,所以最好在2005年的实例上附加/恢复数据库并在那里进行检查。从语义上讲,此查询将导致inner
而不是outer
join(WHERE
部分包含外部表的条件),因此对此行为没有合理的解释。所以,除非上面提到的任何内容都有帮助,否则你很可能会遇到一些没有人会修复的与堆相关的错误...升级的时间? :)