2015-11-26 56 views
1

在一个新的使命后更改,我面对一个SQL Server 2000 :(在这里我找到了很多大表没有任何聚集索引所以我建议改变这种测试时,我们发现了。 - 和双重检查 - 即至少一个查询并没有返回相同的结果,当PK指数聚簇,并且当它不是
我知道查询是难看;它是由GUI,其中用户可以选择字段和条件生成的。自定义报告下面是该查询:查询结果作出的PK集群

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到clustered - 为什么/如何可能相同的查询返回不同的结果集? (非聚集索引23行,聚集索引1行)。
有关查询中无意义的备注是无用的。我知道这很糟糕。

注意:已更改的索引是PK_PatentCostCentreLink,位于dbo.PatentCostCentreLink.PatentCostCentreLink_pk(标识列)。

注2:去除所述DISTINCT或者改变JOININNER时则这两个数据库返回相同的结果(23行),如所预期。但是,我提到过,这是另一个问题。

+0

是否'PatentCostCentreLink.PatentCostCentreLink_pk'包含'NULL'值? – lad2025

+0

@ lad2025 PatentCostCentreLink.PatentCostCentreLink_pk字段不包含'NULL's,如果这是你的问题 –

+0

用于集群/非集群查询 – lad2025

回答

1

我会检查两件事情:

  1. 确保您使用最新的服务包/修补程序。 AFAIR,它应该是8.0.2253,除非你的公司已经扩展了支持访问权限或者当时的任何内容。详情请查询SQL Server Builds
  2. 确保您的数据没有损坏。我现在不记得详细信息,但在2000版本上的dbcc checkdb()命令没有注意到一些差异,所以最好在2005实例上附加/恢复数据库并在那里检查它。
  3. 执行可能会影响这个任何维护:重建索引,更新统计等

语义上说,这个查询将导致inner而非outer加入(该WHERE部分包含了外部表的条件),所以有对此行为可能没有合理的解释。所以,除非上面提到的任何东西都会有帮助,否则你有可能碰到一些与堆相关的bug,没有人会修复...升级的时间? :)

+0

及时提供执行计划升级......我的心愿!我们有8.0.2039这似乎是SS2K的最新版本。我觉得剥夺了我所有的窍门和最新的知识,而且你在互联网上发现的大多数东西都不适用于SS2K。 您的想法还原到更新的服务器是一个很好的想法。我认为这里有一个2012年的一个。 Thx –

+0

由于数据库使用VB6编写的一些自定义DLL,升级速度也会变慢,而后者版本似乎不支持该DLL。 –

+0

@iDevlop,恐怕无法直接在2012服务器上恢复2000备份,您将需要2005或2008实例(2008 R2可能无法工作)。微软通常倾向于将2版本的数据库格式兼容性保留在当前版本之外,因此您可以在2012年恢复的最旧备份必须来自2005年的实例。 –