2009-02-10 5 views
1

У меня возникла очень странная проблема относительно того, что кажется некорректным индексом. Не коррумпирован в том смысле, что 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.

ПОМОЩЬ!

+0

Не могли бы вы разместить весь запрос? – Quassnoi

ответ

0

сценарий из индексов и посмотреть на скрипт, был ли он создан с помощью ALLOW_DUP_ROW? если это так, то это может быть вашей проблемой.

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

не является стабильным порядком сортировки, он может меняться от запроса к запросу в зависимости от пути доступа.

Ваше мнение может возвращать разные результаты, выполняемые несколько раз.

Восстановление индексов, похоже, влияет на порядок сортировки.

Используйте это:

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

вместо этого, он гарантирует стабильный порядок сортировки.

+0

+1, именно то, что я только что набрал;) – LukeH

Смежные вопросы