在进行PK群集后,查询结果会发生变化

时间:2015-11-26 09:06:14

标签: sql-server primary-key sql-server-2000

在一项新任务中,我遇到了一个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行)。但我提到过,这是另一个问题。

1 个答案:

答案 0 :(得分:1)

我会检查几件事:

  1. 确保使用最新的Service Pack / hotfix。 AFAIR,它应该是8.0.2253,除非您的公司已经扩展了支持访问权限或者当时的任何内容。查看SQL Server Builds了解详情。
  2. 确保您的数据未损坏。我现在无法回忆起这些细节,但是2000版本的dbcc checkdb()命令错过了一些差异,所以最好在2005年的实例上附加/恢复数据库并在那里进行检查。
  3. 执行可能影响此操作的任何维护:重建索引,更新统计信息等。
  4. 从语义上讲,此查询将导致inner而不是outer join(WHERE部分包含外部表的条件),因此对此行为没有合理的解释。所以,除非上面提到的任何内容都有帮助,否则你很可能会遇到一些没有人会修复的与堆相关的错误...升级的时间? :)