ある種の破損したインデックスのように見えるものに関して、非常に奇妙な問題に遭遇しています。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 を使用しています。
ヘルプ!