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

Откуда: Львов
Сообщений: 22
Часто видел разные глюки на MSSQL, но такого еще не приходилось.
Судите сами:
create table Categories (
  ID int not null primary key
)

create table Units (
  ID int not null primary key
)

create table MasterInfo (
  MC int not null,
  ID int not null,
  UnitID int not null,
  Info int not null,
  primary key clustered (MC, ID)
)

create table ChildInfo (
  CategoryID int not null,
  ID int not null,
  MC int not null,
  UnitID int,
  Info int,
  primary key clustered (CategoryID, ID)
)
go
CREATE view vwInfo
as
SELECT
  C.ID,
  C.CategoryID,
  (case when C.MC = 0 then C.UnitID else M.UnitID end) as UnitID,
  (case when C.MC = 0 then C.Info else M.Info end) as Info
FROM ChildInfo C
  LEFT JOIN MasterInfo M
    ON C.MC = M.MC AND C.ID = M.ID
go
insert into Categories(ID) values (1)
insert into Units(ID) values (1)
insert into ChildInfo (CategoryID, ID, MC, UnitID, Info) values (1, 1, 0, 1, 1)

select I.Info
from vwInfo I
  INNER JOIN Categories C
    ON C.ID = I.CategoryID
  INNER JOIN Units U ON U.ID = I.UnitID
where I.categoryid = 1 and I.Info = 123456 

В результате возвращается "1" (по крайней мере у меня), хотя в запросе явно указано "I.Info = 123456".

В плане исполнения ничего похожего на "I.Info = 123456" мне найти не удалось. Оптимизатор его "потерял"...

Если же в запрос добавить какой-нибудь хинт, чтобы поменялся план исполнения, то все становится на свои места. Например:
select I.Info
from vwInfo I
  INNER LOOP JOIN Categories C
    ON C.ID = I.CategoryID
  INNER JOIN Units U ON U.ID = I.UnitID
where I.categoryid = 1 and I.Info = 123456
ничего не возвращает, как и должно быть.

Может кто слышал о такой "фиче", или знает как с ней бороться. Буду очень признателен.

Да, чуть не забыл "SELECT @@version" возвращает "Microsoft SQL Server 2000 - 8.00.818 (Intel X86)"
26 сен 04, 21:43    [988067]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
YuriAM
Member

Откуда:
Сообщений: 829
у меня сработал нормально. Ничего не вывел
27 сен 04, 08:37    [988287]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Индексы перестраивать пробовали?
27 сен 04, 10:00    [988422]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
VIK@work
Guest
хм.. у меня та же фигня вылазит на данном тесте... Причём на разных серверах. Один 8.00.760, второй 8.00.876.
27 сен 04, 11:02    [988635]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Crimean
Member

Откуда:
Сообщений: 13148
(1 row(s) affected)


(1 row(s) affected)


(1 row(s) affected)

Info
-----------

(0 row(s) affected)


Microsoft SQL Server 2000 - 8.00.929 (Intel X86)
27 сен 04, 11:45    [988791]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
bantik
Member

Откуда:
Сообщений: 376
Может ты поаккуратнее то с Join , раз уж делаешь открытое объединение ?

SELECT
C.ID,
C.CategoryID,
(case when C.MC = 0 then C.UnitID else isnull(M.UnitID,0) end) as UnitID,
(case when C.MC = 0 then C.Info else isnull(M.Info,0) end) as Info
FROM ChildInfo C
LEFT JOIN MasterInfo M
ON C.MC = M.MC AND C.ID = M.ID

Да и вьюшки джойнить на SQL особо быстро не получается. (Тем более ты ни одного индекса на ней не построил). Оптимизатор действительно путается. Жизнь показала - проще переписывать Select или конструировать более сложные Select автоматически препроцессором - если хочется упростить текст.

Удачи !
27 сен 04, 12:02    [988850]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
x
Guest
Интересно, что под вторым сервис паком ошибка не возникает
27 сен 04, 12:58    [989163]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Ну очень странная структура, даже у оптимизатора крышу сносит. Сделай нормализацию или объедини в одну таблицу.
27 сен 04, 13:01    [989171]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Что означает
bantik
конструировать более сложные Select автоматически препроцессором - если хочется упростить текст.

?
27 сен 04, 14:23    [989617]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Юра Козак
Member

Откуда: Львов
Сообщений: 22
2 GreenSunrise:
Для только что созданных таблиц? Это для чего-же?

2 Crimean:
Спасибо, поищу, что же такого нужно установить, чтобы получить "8.00.929". Может поможет...
Кстати, можете опубликовать ваш "SELECT cast(SERVERPROPERTY('ProductLevel') as nvarchar(128))"? У меня "SP3".

2 bantik & SeVa:
Пример я упростил как только смог. В оригинале структура и запросы немного :) другие. Но от этого суть то не меняется. Получается, что сервер может возвращать (а то и модифицировать/удалять ?!!!) не те данные, которые ему сказали !!! Причем ничего "такого" (типа distributed/indexed view ...) в запросе не используется. Исправление "фичи" для конкретного запроса не решает проблему. Кто сможет гарантировать, что все остальные запросы будут работать правильно?
27 сен 04, 20:02    [991033]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Glory
Member

Откуда:
Сообщений: 104760
Кто сможет гарантировать, что все остальные запросы будут работать правильно?
Как говаривал Остап Бендер - "Полную гарантию может дать только страховой полис".

Я лично думаю что "В оригинале структура и запросы НЕ немного другие" а много другие. В частности подозреваю что вы "упрятали" сложные запросы во вложенные представления. А потом удивляетесь отчего у потимизатора едет крыша. Птому и едет что оптимизатор раскрывет все эти представления и пытается составить единый план выполнения.
Хотя максимальное количество таблиц в запросе и ограничено 256-ю, но запрос с более чем 10ком таблиц нужно разюивать на части. Можно через временные таблицы, а можно через индексированные представления.
27 сен 04, 20:11    [991058]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Юра Козак
Member

Откуда: Львов
Сообщений: 22
2 Glory:
Но ведь в данном примере участвуют всего 4 таблицы. И вьюшка-то кажется не сложная...
Кроме того, речь ведь идет не об оптимальности плана, а о корректности результата.
27 сен 04, 20:22    [991072]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Glory
Member

Откуда:
Сообщений: 104760
Похоже на баг. Ибо если не использовать представление а написать все одним запросом то результат правильный.
27 сен 04, 20:40    [991095]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Юра Козак
Member

Откуда: Львов
Сообщений: 22
Согласен на счет бага. Что же делать?
27 сен 04, 21:12    [991121]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Crimean
Member

Откуда:
Сообщений: 13148
SP3
27 сен 04, 21:57    [991164]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Алексей Ельцов
Member

Откуда: Redmond
Сообщений: 252
Я посмотрел, это пофиксено в 913-м билде (что подтвердил Crimean - проблеы нет на 929м билде).

Вот статья:

836651 FIX: You receive query results that were not expected when you use both
http://support.microsoft.com/?id=836651

Алексей
29 сен 04, 01:22    [994589]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Кстати, господа хорошие, а может того, в виде эксперимента ложить новые билды на местный FTP?!
Я обращаюсь к официальным представителям MS которые читают (я знаю :) , могу на rsdn продублировать призыв :) ) этот форум.
Как такое предложение?
А то я лично , хоть и имею в своем распоряжении тот же 929 билд, но опубликовать его по понятным (думаю!) соображениям не могу :)
29 сен 04, 11:22    [995478]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Алексей Ельцов
Member

Откуда: Redmond
Сообщений: 252
Crimean
Кстати, господа хорошие, а может того, в виде эксперимента ложить новые билды на местный FTP?!
Я обращаюсь к официальным представителям MS которые читают (я знаю :) , могу на rsdn продублировать призыв :) ) этот форум.
Как такое предложение?
А то я лично , хоть и имею в своем распоряжении тот же 929 билд, но опубликовать его по понятным (думаю!) соображениям не могу :)


Я не знаю почему фиксы не доступны в публичное пользование (не имею непосредственного отношения к PSS). Хотя уверен, что на это есть более чем веские причины. Может тут есть кто из PSS чтобы прокомментировать ?
29 сен 04, 11:34    [995559]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Юра Козак
Member

Откуда: Львов
Сообщений: 22
2 Алексей Ельцов:
Что-то не очень похоже на http://support.microsoft.com/?id=836651.
В моём примере участвуют только Int-ы. (Или я не правильно понимаю, что такое 'ANSI style joins'?)

Но похоже на то, что у 929м билде проблема действительно исправлена.

2 All:
Если кто знает где можно скачать 929-й билд или выше, дайте, плиз, знать.
2 окт 04, 20:05    [1004235]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизатор "теряет" фильтр  [new]
Алексей Ельцов
Member

Откуда: Redmond
Сообщений: 252
Юра Козак
2 Алексей Ельцов:
Что-то не очень похоже на http://support.microsoft.com/?id=836651.
В моём примере участвуют только Int-ы. (Или я не правильно понимаю, что такое 'ANSI style joins'?)

Но похоже на то, что у 929м билде проблема действительно исправлена.

2 All:
Если кто знает где можно скачать 929-й билд или выше, дайте, плиз, знать.


Я, конечно, DBA, а не девелопер, и мог напутать - но судя по деталям в описании бага это именно он, да и потом я посмотрел на другие фиксы сделанные между 902 (где проблема есть) и 929 (где ее больше нет), там других даже отдаленно похожих нет.
Что касается билдов, см сюда:

Баг SP3 - Profiler
3 окт 04, 23:11    [1004779]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить