Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Раннее деление на ноль  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Гавриленко Сергей Алексеевич, гм....
там же (в БОЛе) прямо определено: <select_list> ::= ..... expression ...
где:
expression
Является константой, функцией, любым сочетанием имен столбцов, констант и функций, соединенных оператором (операторами) или вложенным запросом.

не расстраивайте меня - скажите, что MSSQL выполняет where до select-a - я еще надеюсь
24 июл 09, 16:42    [7458123]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Гавриленко Сергей Алексеевич
iap
Надо не надеяться, а смотреть на план выполнения зпроса.
План может и поменяться со временем по разным причинам.
Это аргумент в пользу "не смотреть в план"? ;)
Нет. Но можно опрометчиво сделать сиюминутные выводы.
Например, о порядке обработки разных частей запроса.
А потом наполнение таблиц поменяется, статистика будет другой,
версия сервера (и алгоритмы оптимизации) изменится - и пойдут глюки по полной программе.
Просто хотел сказать, что план - не единственный источник информации.
24 июл 09, 16:44    [7458130]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
qwrqwr

Я до сегодняшнего дня считал, что where обрабатывается сервером строго до select - что соответствует стандарту SQL и подтверждено вроде документацией:
http://msdn.microsoft.com/ru-ru/library/ms189499.aspx
Порядок обработки инструкции SELECT
Следующие действия демонстрируют порядок обработки инструкции SELECT.

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE или WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP

2 Glory, iap - не могли бы вы прокоментировать?

Что по-вашему значит, например, обрабатывать where ?
Наверное это значит, прочитать значения полей из записи и вычислить выражения из where.
А теперь подумайте, что если сервер уже читает поля filed1 и filed2 и вычисляет filed1 > 0 и filed2 > 0, то почему он тут же не может вычислить filed1/filed2 ? Ведь все равно ему нужно получить в этом запросе записи с вычисленным filed1/filed2
Почему нужно сначала получить отфильтрованный набор из двух полей filed1 и filed2, чтобы потом из него еще получать набор из одного поля ?
24 июл 09, 16:44    [7458132]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36826
qwrqwr
Гавриленко Сергей Алексеевич, гм....
там же (в БОЛе) прямо определено: <select_list> ::= ..... expression ...
где:
expression
Является константой, функцией, любым сочетанием имен столбцов, констант и функций, соединенных оператором (операторами) или вложенным запросом.

не расстраивайте меня - скажите, что MSSQL выполняет where до select-a - я еще надеюсь
Это описание того, что сервер должен делать логически. В каком порядке он будет физически выполнять - это сугубо дело сервера. На практике оказывается, что может по разному. А то, что выскакивает ошибка - это издержки. Для которых, кстати, полно workaround'ов.
24 июл 09, 16:47    [7458153]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Predicate ordering is not guaranteed
24 июл 09, 16:49    [7458178]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Glory

Что по-вашему значит, например, обрабатывать where ?
Фильтровать набор на основании вычисления предикатов.
Glory
А теперь подумайте, что если сервер уже читает поля filed1 и filed2 и вычисляет filed1 > 0 и filed2 > 0, то почему он тут же не может вычислить filed1/filed2 ? Ведь все равно ему нужно получить в этом запросе записи с вычисленным filed1/filed2
подумал. до этого места все логично.
Только не понятна логика возникновения ошибки деления на 0 из заглавного топика. Ведь сервер отобрал только filed2 > 0 ?
24 июл 09, 16:49    [7458181]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
iap
Predicate ordering is not guaranteed
Гавриленко Сергей Алексеевич
А то, что выскакивает ошибка - это издержки.
мдя...
Грустно все это. За стандарты обидно. Люди же трудились, сочиняли их.
24 июл 09, 16:53    [7458218]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
qwrqwr
Glory

Что по-вашему значит, например, обрабатывать where ?
Фильтровать набор на основании вычисления предикатов.
Glory
А теперь подумайте, что если сервер уже читает поля filed1 и filed2 и вычисляет filed1 > 0 и filed2 > 0, то почему он тут же не может вычислить filed1/filed2 ? Ведь все равно ему нужно получить в этом запросе записи с вычисленным filed1/filed2
подумал. до этого места все логично.
Только не понятна логика возникновения ошибки деления на 0 из заглавного топика. Ведь сервер отобрал только filed2 > 0 ?

Что значит отобрал только field2 > 0 ?
- Читается текущая запись.
- Вычисляются выражения field1 > 0, field2 > 0, field1/field2
- Если выражения удовлетворяют условиям, то результат идет в конечный набор
24 июл 09, 16:54    [7458228]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
qwrqwr
iap
Predicate ordering is not guaranteed
Гавриленко Сергей Алексеевич
А то, что выскакивает ошибка - это издержки.
мдя...
Грустно все это. За стандарты обидно. Люди же трудились, сочиняли их.

И что мешает то поставить нужные ARITHABORT и ARITHIGNORE и не получать сообщение о делении на 0 ?
24 июл 09, 17:01    [7458280]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Glory
qwrqwr
Glory

Что по-вашему значит, например, обрабатывать where ?
Фильтровать набор на основании вычисления предикатов.
Glory
А теперь подумайте, что если сервер уже читает поля filed1 и filed2 и вычисляет filed1 > 0 и filed2 > 0, то почему он тут же не может вычислить filed1/filed2 ? Ведь все равно ему нужно получить в этом запросе записи с вычисленным filed1/filed2
подумал. до этого места все логично.
Только не понятна логика возникновения ошибки деления на 0 из заглавного топика. Ведь сервер отобрал только filed2 > 0 ?

Что значит отобрал только field2 > 0 ?
- Читается текущая запись.
- Вычисляются выражения field1 > 0, field2 > 0, field1/field2
- Если выражения удовлетворяют условиям, то результат идет в конечный набор
а если результат не идет в конечный набор, зачем возбуждать ошибку?
я искрене хочу понять, без подколок.
24 июл 09, 17:01    [7458282]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
qwrqwr
Glory
qwrqwr
Glory

Что по-вашему значит, например, обрабатывать where ?
Фильтровать набор на основании вычисления предикатов.
Glory
А теперь подумайте, что если сервер уже читает поля filed1 и filed2 и вычисляет filed1 > 0 и filed2 > 0, то почему он тут же не может вычислить filed1/filed2 ? Ведь все равно ему нужно получить в этом запросе записи с вычисленным filed1/filed2
подумал. до этого места все логично.
Только не понятна логика возникновения ошибки деления на 0 из заглавного топика. Ведь сервер отобрал только filed2 > 0 ?

Что значит отобрал только field2 > 0 ?
- Читается текущая запись.
- Вычисляются выражения field1 > 0, field2 > 0, field1/field2
- Если выражения удовлетворяют условиям, то результат идет в конечный набор
а если результат не идет в конечный набор, зачем возбуждать ошибку?
я искрене хочу понять, без подколок.

Потому что выражения вычисляются независимо и параллельно.
24 июл 09, 17:04    [7458298]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
iap
Predicate ordering is not guaranteed
2 iap - сейчас посмотрел статью внимательно - извините, но это не о том, что спросил я, а о порядке предикатов во where - но там его никто и не требует.
24 июл 09, 17:10    [7458326]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Glory
Потому что выражения вычисляются независимо и параллельно.
спасибо.
"как это работает на физическом уровне" - вполне прояснилось.
наплевательство на стандарт SQL и поведение, описанное в собственной документации - расстроило.
24 июл 09, 17:23    [7458399]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36826
qwrqwr
Glory
Потому что выражения вычисляются независимо и параллельно.
спасибо.
"как это работает на физическом уровне" - вполне прояснилось.
наплевательство на стандарт SQL и поведение, описанное в собственной документации - расстроило.
Ссылку на стандарт можно?
24 июл 09, 17:24    [7458409]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
qwrqwr
Glory
Потому что выражения вычисляются независимо и параллельно.
спасибо.
"как это работает на физическом уровне" - вполне прояснилось.
наплевательство на стандарт SQL и поведение, описанное в собственной документации - расстроило.

А в каком стандарте SQL сказано, что выражения должны вычисляться в каком то порядке ?
Приведенная вами ссылка на порядок есть только в документации SQL2008, может там что и изменилось

Сообщение было отредактировано: 24 июл 09, 17:26
24 июл 09, 17:25    [7458413]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Гавриленко Сергей Алексеевич, Glory
электронную ссылку дать не могу, т.к. не имею.
информацию о содержании стандарта SQL выносил из этого печатного издания
http://www.labirint-shop.ru/books/149564/
если оно врет - прошу меня извинить.
24 июл 09, 17:31    [7458448]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
qwrqwr
Гавриленко Сергей Алексеевич, Glory
электронную ссылку дать не могу, т.к. не имею.
информацию о содержании стандарта SQL выносил из этого печатного издания
http://www.labirint-shop.ru/books/149564/
если оно врет - прошу меня извинить.

И там есть стандарт, посвещенный именно порядку вычисления выражений ?
Есть его номер ?
24 июл 09, 17:33    [7458453]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Сорри, но иногда большие знания - большие проблемы...
любой новичёк бы понял в чём проблема, а я затупил сам...

declare @a float, @b float, @c float, @d float
--declare @a int, @b int, @c int, @d int

set @a = 6
set @b = 10

set @c = 3
set @d = 10

select (@a/@b) / (@c/@d)
24 июл 09, 17:36    [7458479]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
NIIIK
Сорри, но иногда большие знания - большие проблемы...
любой новичёк бы понял в чём проблема, а я затупил сам...

declare @a float, @b float, @c float, @d float
--declare @a int, @b int, @c int, @d int

set @a = 6
set @b = 10

set @c = 3
set @d = 10

select (@a/@b) / (@c/@d)

И что тут неправильного ?
24 июл 09, 17:39    [7458490]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
Glory
qwrqwr
Гавриленко Сергей Алексеевич, Glory
электронную ссылку дать не могу, т.к. не имею.
информацию о содержании стандарта SQL выносил из этого печатного издания
http://www.labirint-shop.ru/books/149564/
если оно врет - прошу меня извинить.

И там есть стандарт, посвещенный именно порядку вычисления выражений ?
Есть его номер ?
там описан стандарт SQL92
раздел "Порядок обработки инструкции SELECT" соответствует описанному в BOL по ссылке выше. (разумеется, за исключением 'WITH CUBE или WITH ROLLUP' и 'TOP')
24 июл 09, 17:39    [7458495]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Самое прикольное что были приведеня к float и были умножения на 0.1

Лет 5ть назад по офису ходила загадка, которую дают детям при постулени в школу. Если решают - оправляют в физ-мат класс.

Корова - 2
Собака - 3
Хрюша - 3
Петушок - 8

Уточка - 3
Кошечка - ?

Вот только решали взрослые дяди долго.
24 июл 09, 17:40    [7458500]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
NIIIK
Самое прикольное что были приведеня к float и были умножения на 0.1

Лет 5ть назад по офису ходила загадка, которую дают детям при постулени в школу. Если решают - оправляют в физ-мат класс.

Корова - 2
Собака - 3
Хрюша - 3
Петушок - 8

Уточка - 3
Кошечка - ?

Вот только решали взрослые дяди долго.

Какое отношение все это имеет к теме данного обсуждения ?
24 июл 09, 17:41    [7458510]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Glory,

поменяйте типы данных

При делении происходит округление до целого

0.4 / 0.2 = 2

Но когда это приводится к int в числителе может быть 0 и в знаменателе та же хрень.

Щас поставлю принудительно преобразование везде...
24 июл 09, 17:42    [7458518]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
NIIIK
Member

Откуда: Россия, Ростовская область, г. Таганрог
Сообщений: 1295
Glory,

Прямое, слишком заморачиваться не надо...
Всё работает как должно, проблема только казалась в том что порядок выполнения не тот. Не надо надевать шоры мне было.
24 июл 09, 17:43    [7458529]     Ответить | Цитировать Сообщить модератору
 Re: Раннее деление на ноль  [new]
Glory
Member

Откуда:
Сообщений: 104760
NIIIK
Glory,

поменяйте типы данных

При делении происходит округление до целого

0.4 / 0.2 = 2

Но когда это приводится к int в числителе может быть 0 и в знаменателе та же хрень.

Щас поставлю принудительно преобразование везде...

Мда. Читать документацию надо. При делении int на int результатом будет int. Начиная с версии 6.0, если не раньше
24 июл 09, 17:44    [7458533]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить