2015-11-26 93 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年的實例。 –