1

ある種の破損したインデックスのように見えるものに関して、非常に奇妙な問題に遭遇しています。dbcc checkdb がそれを取得するという意味では破損していませんが、あるべきではない行が含まれているという意味では破損しています。

TableA と TableB の 2 つのテーブルがあります。私のアプリケーションでは、一部の行は機能的に重複していると見なされます。つまり、すべての列の値が同じというわけではありませんが、その行はアプリによって重複として扱われます。これらを除外するために、vTableAUnique というビューを作成しました。ビューは次のように定義されます。

SELECT a.*   
FROM TableA a   
INNER JOIN  
(   
      SELECT ID, ROW_NUMBER() OVER   
          (PARTITION By Col1   
           ORDER BY Col1) AS Num   
      FROM TableA   
) numbered ON numbered.ID = a.ID   
WHERE numbered.Num = 1  

ビューの結果は、TableA に Col1 の同じ値を持つ他の行がない TableA のすべてのレコードです。この例では、TableA に合計 10 行あるとしますが、vTableAUnique に表示される個別の値を持つのは 7 行のみです。

TableB は基本的に、TableA の Col1 の値と一致する値のリストです。この場合、vTableAUnique に表示される 8 つの一意の値がすべて TableB にあるとします。したがって、TableA、TableB、および vTableAUnique からのデータは次のようになります。

TableA (ID, Col1, Col2, Col3)

1,A,X,X

2,A,X,X

3,B,X,X

4,A,X,X

5,E,X,X

6,F,X,X

7,G,X,X

8,H,X,X

9,I,X,X

10,J,X,X


TableB (ID)

A

B

C

D

E

F

G

H

I

J


vTableAUnique (ID, Col1, Col2, Col3)

1,A,X,X

3,B,X,X

5,E,X,X

6,F,X,X

7,G,X,X

8,H,X,X

9,I,X,X

10,J,X,X

ここが奇妙な部分です。vTableAUnique を Col1 の TableB と結合すると、TableA から不明確な値が返されることがあります。つまり、結合を行うと、vTableAUnique には存在しないが TableA には存在する行が表示されます。vTableAUnique のすぐ下で選択を行うと、これらの行は取得されません。この場合、ID が 1、3、5、6、7、8、9、10 の行だけでなく、ID が 2 と 4 の行も返されます。

頭を机にぶつけた後、DB 内のすべてのインデックスを再構築することにしました。案の定、問題は消えました。同じクエリで正しい行が返されるようになりました。しかし、しばらくすると問題が再発します。DBCC CHECKDB は問題を示さず、どのインデックスがこれを引き起こしているのかを突き止めるのに苦労しています。

Vista x64 で SQL Server 2008 Developer Edition を使用しています。

ヘルプ!

4

2 に答える 2

4
ROW_NUMBER() OVER (PARTITION By Col1 ORDER BY Col1)

は安定した並べ替え順序ではなく、アクセス パスに応じてクエリごとに変わる可能性があります。

ビューが複数回実行されると、異なる結果が返される場合があります。

インデックスの再構築はソート順に影響を与えるようです。

これを使って:

ROW_NUMBER() OVER (PARTITION By Col1 ORDER BY Id)

代わりに、安定した並べ替え順序が保証されます。

于 2009-02-10T15:46:51.763 に答える
0

スクリプトを作成してインデックスを作成し、スクリプトを確認します。スクリプトは ALLOW_DUP_ROW で作成されましたか? もしそうなら、それはあなたの問題かもしれません

于 2009-02-10T15:18:35.670 に答える