Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Некорректные результаты запросов с индексированными view и read_committed_snapshot  [new]
aek239
Member

Откуда:
Сообщений: 33
Поймал на боевой БД (SQL Server 2005 SP2) весьма странное поведение. В один прекрасный момент некоторые запросы стали возвращать некорректные данные. До этого момента они 100% работали корректно, но вдруг перестали. К сожалению, я никак не могу установить этот момент со сколь-нибудь приемлемой точностью, поэтому у меня нет возможности узнать, что же именно случилось. Мои шаги в поиске неисправности:
1. Выбрал один запрос. В контрольном примере он должен возвращать одну строку, однако после того "прекрасного" момента стал не возвращать ни одной. Я упростил его до тривиального, но ошибка никуда не ушла. Запрос получился примерно такой:
SELECT t.ID, t.Value, t.StatusID
FROM dbo.MyTable t
WHERE t.ParentID = @ParentID
AND t.ID IN (
  SELECT tt.ID
  FROM dbo.MyTable tt
  WHERE tt.StatusID IN (1,2))
Запись, которую я ожидаю в результате имеет ParentID = @ParentID и StatusID = 1, т.е. непременно должна отбираться.
2. Проанализировал план выполнения. Судя по плану оптимизатор подключил к выборке индексированное представление и проверяет по нему условие StatusID IN (1,2) - в плане index seek из dbo.MyTable по условию ParentID = @ParentID и nested loops join с индексированным представлением, из которого идет index seek по условию StatusID = 1 OR StatusID = 2. К сожалению, я не могу выложить план, т.к. потерял его, а воспроизвести ситуацию не могу.
Однако, индексированное представление имеет следующий вид:
SELECT t.ID, t.StatusID
FROM dbo.MyTable t
WHERE t.StatusID NOT IN (1,2,10)
и моей записи там нет и быть не может - она отсекается условием StatusID NOT IN (1,2,10)!!!
3. После ряда приседаний обнаружил, что если убрать из выборки StatusID:
SELECT t.ID, t.Value/*, t.StatusID*/
FROM dbo.MyTable t
WHERE t.ParentID = @ParentID
AND t.ID IN (
  SELECT tt.ID
  FROM dbo.MyTable tt
  WHERE tt.StatusID IN (1,2))
запрос вдруг начинает возвращать данные! Посмотрел в план - обращение к индексированному представлению исчезло, отсюда, видимо, и корректные данные. Т.е. проблема в представлении.
4. update statistics, alter index all rebuild на представлении ничего не дали. Также как и dbcc freeproccache и dropcleanbuffers.
5. Сгенерировал SSMS скрипт на пересоздание злосчастного представления и всех его индексов и выполнил. Проблема исчезла.

Соответственно теперь задаюсь вопрос - что это было и как этого избежать. Прошло несколько часов, полет все еще нормальный. Но как-то стремно. БД боевая и используется довольно интенсивно.
Покопавшись в интернете я нашел лишь один похожий случай: http://www.sqldev.org/sql-server-database-engine/invalid-query-plan-causing-invalid-results-86916.shtml - практически полное совпадение с моим:
1. Аналогичные симптомы.
2. Тоже SQL 2005, правда там SP1, а у меня SP2.
3. Тоже, как и у меня, используется READ_COMMITTED_SNAPSHOT isolation level (!!!).

Собственно вопрос: не сталкивался ли кто с подобным? В чем может быть проблема и как ее избежать?
5 авг 11, 16:56    [11077914]     Ответить | Цитировать Сообщить модератору
 Re: Некорректные результаты запросов с индексированными view и read_committed_snapshot  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 35396
Блог
Читайте список правленных багов со времен sp2 до sp4+cu.
Возможно найдете его там.
5 авг 11, 17:00    [11077931]     Ответить | Цитировать Сообщить модератору
 Re: Некорректные результаты запросов с индексированными view и read_committed_snapshot  [new]
aek239
Member

Откуда:
Сообщений: 33
Прочитал список, похожей проблемы не нашел. Неужели у меня какой-то новый баг?
8 авг 11, 11:35    [11084511]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить