Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
в общем есть такое условие в триггере
SELECT OBJID FROM INSERTED WHERE TYPEID = 2989 and CAST(right(OBJID,3) as decimal(2)) = 10
когда встоял 2000, то при несовпадении TYPEID, проверка OBJID - не делалась
счас же поставили 2005 и с каких-то рыжиков она стала делаться
с чего бы это?
29 май 09, 15:48    [7245305]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5499
Блог
А кто-то обещал, что вообще может быть неполная проверка условий? ;)
29 май 09, 15:59    [7245360]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
aleks2
Guest
Сергей84,

порядок исчисления условий в WHERE выбирает оптимизатор. Можно разве попробовать хинт FORCEORDER... заколбасить CASE

WHERE CASE TYPEID WHEN 2989 THEN CASE CAST(right(OBJID,3) as decimal(2)) WHEN 10 THEN 1 END END=1
29 май 09, 15:59    [7245366]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
DeColo®es
А кто-то обещал, что вообще может быть неполная проверка условий? ;)

ну перед тем как писать такой триггер я задавал вопрос, будет ли скул проверять второе условие and, если 1-е ложно
и мне сказали, что не должен, проверил - действительно не проверяет, а тут вдруг стал зачем-то :-/
29 май 09, 18:27    [7246226]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Сергей84
я задавал вопрос
где? дайте ссылку пожалуйста
(честно, не могу найти по истории Ваших сообщений
наверное, плохо ищу)
29 май 09, 18:36    [7246251]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
aleks2
Сергей84,

порядок исчисления условий в WHERE выбирает оптимизатор. Можно разве попробовать хинт FORCEORDER... заколбасить CASE

WHERE CASE TYPEID WHEN 2989 THEN CASE CAST(right(OBJID,3) as decimal(2)) WHEN 10 THEN 1 END END=1
А разве FORCE ORDER не к порядку JOINов относится?
29 май 09, 18:58    [7246309]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
aleks2
Guest
iap
aleks2
Сергей84,

порядок исчисления условий в WHERE выбирает оптимизатор. Можно разве попробовать хинт FORCEORDER... заколбасить CASE

WHERE CASE TYPEID WHEN 2989 THEN CASE CAST(right(OBJID,3) as decimal(2)) WHEN 10 THEN 1 END END=1
А разве FORCE ORDER не к порядку JOINов относится?


Ну, если пойдет такая пьянка, можно и через JOIN переписать...
30 май 09, 11:14    [7247362]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Паганель
Сергей84
я задавал вопрос
где? дайте ссылку пожалуйста
(честно, не могу найти по истории Ваших сообщений
наверное, плохо ищу)

ох... я и сам уже затрудняюсь найти
вопрос задавал в какой-то ветке как сопутсвующий между делом :(
30 май 09, 15:37    [7247710]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
Crimean
Member

Откуда:
Сообщений: 13148
начиная с 2000 СП4 это поменялось. многие влетели. case рулит, да..
30 май 09, 15:48    [7247728]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Мда, у вас жёстче. В моём вопросе план более сложного запроса вывёртывало (да и причём там ROBUST PLAN счас не понимаю). Но там понятно, hash-ить узкую таблу выгоднее, процы дешёвые. А здесь простой запрос из одной таблы, логика оптимизатора непонятна.

Конечно можно "пытаться отмазаться" о возможной параллельности провеки уловий. :) Но даже если гипотетически предположить (о использовании "новых" видах макрокомад процессора), в соотношении стоимости ну никак не укладывается (там целые подпроцедуры right и convert).
Да количество команд в Проверка1; Подсчёт; Проверка2; больше чем в Подсчёт; Проверка1и2;, но общее проинтерпретированное количество вероятно не больше. У MS своя логика. :-/

Хотя может и глупо:
SELECT OBJID FROM INSERTED WHERE TYPEID = 2989 and right(OBJID,3) = '010'
SELECT OBJID FROM INSERTED WHERE TYPEID = 2989 and(right(OBJID,3) = '010' OR OBJID = '10')
...
31 май 09, 05:22    [7248339]     Ответить | Цитировать Сообщить модератору
 Re: зачем MSSQL 2005 проверяет 2-е условие, если 1-е не верно?  [new]
Сергей84
Member

Откуда: Мурманск
Сообщений: 27465
Mnior
Мда, у вас жёстче. В моём вопросе план более сложного запроса вывёртывало (да и причём там ROBUST PLAN счас не понимаю). Но там понятно, hash-ить узкую таблу выгоднее, процы дешёвые. А здесь простой запрос из одной таблы, логика оптимизатора непонятна.

Конечно можно "пытаться отмазаться" о возможной параллельности провеки уловий. :) Но даже если гипотетически предположить (о использовании "новых" видах макрокомад процессора), в соотношении стоимости ну никак не укладывается (там целые подпроцедуры right и convert).
Да количество команд в Проверка1; Подсчёт; Проверка2; больше чем в Подсчёт; Проверка1и2;, но общее проинтерпретированное количество вероятно не больше. У MS своя логика. :-/

Хотя может и глупо:
SELECT OBJID FROM INSERTED WHERE TYPEID = 2989 and right(OBJID,3) = '010'
SELECT OBJID FROM INSERTED WHERE TYPEID = 2989 and(right(OBJID,3) = '010' OR OBJID = '10')
...

вот и я про тоже
на кой делать лишнюю работу не понятно
в общем переписал на
SELECT OBJID FROM INSERTED WHERE TYPEID = 2989 and right(OBJID,3) = '10 '
31 май 09, 17:33    [7248932]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить