У меня возникла очень странная проблема относительно того, что кажется некорректным индексом. Не коррумпирован в том смысле, что dbcc checkdb заберет его, но коррумпирован в том смысле, что у него есть строки, которые он не должен иметь.Коррумпированный индекс SQL Server?
У меня есть две таблицы, TableA и TableB. Для целей моего приложения некоторые строки считаются функционально дублирующими, то есть в то время как не все значения столбца одинаковы, строка обрабатывается моим приложением как dup. Чтобы отфильтровать их, я создал представление, называемое 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, которые не имеют каких-либо других строк в TableA с такими же значениями Col1. Для этого примера предположим, что TableA имеет 10 полных строк, но только 7 с различными значениями, которые отображаются в vTableAUnique.
TableB - это просто список значений, которые соответствуют значениям Col1 из TableA. В этом случае предположим, что TableB имеет все 8 уникальных значений, которые появляются в vTableAUnique. Таким образом, данные из 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 с TableB на Col1, я возвращаю нечеткие значения из TableA. Другими словами, строки, которые НЕ существуют в vTableAUnique, но которые существуют в TableA, появляются, когда я делаю соединение. Если я сделаю выбор только с vTableAUnique, я не получу эти строки. В этом случае я бы вернул не только строки с идентификаторами 1,3,5,6,7,8,9,10, но также строки с идентификаторами 2 и 4!
После того, как я ударил головой о стол, я решил попробовать перестроить все индексы в БД. Разумеется, проблема исчезла. Тот же запрос теперь вернул правильные строки. Однако, после неполного периода времени, проблема возвращается. DBCC CHECKDB не показывает никаких проблем, и мне сложно отслеживать, какой индекс может вызвать это.
Я использую SQL Server 2008 Developer Edition для Vista x64.
ПОМОЩЬ!
Не могли бы вы разместить весь запрос? – Quassnoi