Поврежденный индекс SQL Server? - PullRequest
1 голос
/ 10 февраля 2009

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

Ответы [ 2 ]

4 голосов
/ 10 февраля 2009
ROW_NUMBER() OVER (PARTITION By Col1 ORDER BY Col1)

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

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

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

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

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

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

0 голосов
/ 10 февраля 2009

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

...