Я сталкиваюсь с очень странной проблемой, связанной с чем-то вроде искаженного индекса. Не поврежден в том смысле, что dbcc checkdb его подберет, но поврежден в том смысле, что в нем есть строки, которых не должно быть.
У меня есть две таблицы, TableA и TableB. В целях моего приложения некоторые строки считаются функционально дублирующимися, то есть, хотя не все значения столбцов одинаковы, строка рассматривается моим приложением как дубликат. Чтобы отфильтровать их, я создал представление с именем 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
Результатами представления являются все записи из Таблицы A, которые не имеют других строк в Таблице A с такими же значениями для 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.
HELP!