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

Откуда: ->|<- :адуктО
Сообщений: 22201
Есть некий сводный запрос, довольно насыщенный, с учетом представлений и инлайновых функций включает в себя три десятка таблиц, отбирает три десятка полей.

При некоторых интервалах дат отбора (как правило больших) при выполнении запроса возникает ошибка деления на ноль, при этом
  • в полях выборки деления на ноль нет
  • в условиях объединения деления на ноль нет
    Помимо просто визуального анализа, это подтверждается тем, что, к примеру, я могу сделать выборку по отдельности за июль и за август, но не получается сделать одновременно с июля по август.

    Попытка локализовать проблему путем постепенного убирания из запроса полей выборки или таблиц не приводит к успеху, так как в какой-то момент план запроса меняется и ошибка пропадает. То есть, скажем, первая половина полей выборки и вторая половина полей выборки отбираются нормально, а вместе - никак. То же и с таблицами.

    То есть деление на ноль возникает не в самом запросе, а где-то глубже (в оптимизаторе, я не знаю, в обработке индексов...)

    Я буду дальше сам ковырять-искать, пока рассчитываю на шальной ответ типа "о, я с таким сталкивался, проблема была с ...".

    MSSQL 2000 SP4
  • 1 апр 15, 11:31    [17458228]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47047
    Shocker.Pro,

    оператор деления в запросе есть?
    1 апр 15, 11:40    [17458313]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    o-o
    Guest
    Shocker.Pro
    То есть деление на ноль возникает не в самом запросе, а где-то глубже (в оптимизаторе, я не знаю, в обработке индексов...)

    вы перечислили то, где оно точно не возникает.
    ищите деление у себя, если не в самом запросе, то в функциях/вьюхах
    1 апр 15, 11:41    [17458319]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104760
    Shocker.Pro
    То есть деление на ноль возникает не в самом запросе, а где-то глубже

    Ага, например, в куче " представлений и инлайновых функций "
    1 апр 15, 11:41    [17458322]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 22201
    Все операторы деления закрыты /NULLIF(n,0)
    Опять же, как я говорил, все выборки работают, если делать их по частям, то есть проблема не в том, что деление на ноль возникает именно в выборке.
    1 апр 15, 11:41    [17458326]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    SQL2008
    Member

    Откуда: Москва
    Сообщений: 4392
    Выделите из общего запроса кусок, который и дает ошибку и запостите сюда
    ... рассчитываю на шальной ответ типа "о, я с таким сталкивался, проблема была с ...".

    С вашим запросом здесь ранее никто не работал.
    1 апр 15, 11:42    [17458332]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 22201
    SQL2008
    Выделите из общего запроса кусок, который и дает ошибку и запостите сюда
    в том-то и дело, что при попытке выделить кусок ошибка пропадает.

    То есть не работает вся эта громадина целиком, выкладывать ее всю бессмысленно.
    SQL2008
    С вашим запросом здесь ранее никто не работал.
    я ценю юмор. Однако, иногда вопросы решаются таким косвенным образом
    1 апр 15, 11:46    [17458365]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    SQL2008
    Member

    Откуда: Москва
    Сообщений: 4392
    Shocker.Pro
    Все операторы деления закрыты /NULLIF(n,0)

    Пример в студию!
    1 апр 15, 11:48    [17458385]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104760
    Shocker.Pro
    Однако, иногда вопросы решаются таким косвенным образом

    Серверное исключение о делении на 0 возникает при делении на 0
    А не при построении плана или какой то обработке индекса
    1 апр 15, 11:48    [17458387]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    o-o
    Guest
    может, есть вьюха, где есть отбор с условием <> 0.
    при выборке только из нее все хорошо.
    потом вы соединяете ее еще с чем-то и там делите что-то на эти вроде бы ненулевые значения из вьюхи.
    а он так соптимизировал, что сначала делит, потом фильтрует.
    короче, ищите вообще все возможное деление
    1 апр 15, 11:49    [17458392]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    daw
    Member

    Откуда: Муром -> Москва
    Сообщений: 7381
    > Все операторы деления закрыты /NULLIF(n,0)

    значит, не все. ищите.

    > Опять же, как я говорил, все выборки работают, если делать их по частям, то есть проблема не в том, что деление на ноль возникает именно в выборке.

    ну, вы же, вроде бы, понимаете, что это ни о чем. в общем запросе меняется порядок выполнения операторов плана, вот и пропадает. а потенциально оно где-то есть, все-таки.
    1 апр 15, 11:50    [17458414]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    SQL2008
    Member

    Откуда: Москва
    Сообщений: 4392
    Shocker.Pro
    я могу сделать выборку по отдельности за июль и за август, но не получается сделать одновременно с июля по август.

    Максимально сузьте диапазон, при котором выдается ошибка.
    Чудес не бывает.
    1 апр 15, 11:51    [17458416]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    iap
    Member

    Откуда: Москва
    Сообщений: 47047
    Shocker.Pro,

    Может, Вы полагаете, что, например, условие в WHERE отбрасывает все нулевые значения в знаменателях полей SELECTа,
    и поэтому такая ошибка невозможна. На эти грабли очень часто наступают.
    Тогда ответ будет простым: сервер сам решает, сначала отбрасывать записи,
    не удовлетворяющие WHERE, а потом формировать результирующий датасет
    или поступить наоборот. Во втором случае обычно как раз и удивляются
    ошибкам преобразования и деления на ноль, хотя WHERE якобы все такие строки "должен был отбросить".
    Не, не то?
    1 апр 15, 11:53    [17458437]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    SQL2008
    Member

    Откуда: Москва
    Сообщений: 4392
    Shocker.Pro, ну все! Интрига достигла эпогея.
    Постите уже сюда свой запрос.
    Сделайте только в тэге SRC, please!
    1 апр 15, 11:55    [17458454]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 22201
    SQL2008
    Максимально сузьте диапазон, при котором выдается ошибка.
    он плавающий, в одном квартале может отобрать три месяца, в другом - только полмесяца


    o-o
    может, есть вьюха, где есть отбор с условием <> 0.
    при выборке только из нее все хорошо.
    потом вы соединяете ее еще с чем-то и там делите что-то на эти вроде бы ненулевые значения из вьюхи.
    а он так соптимизировал, что сначала делит, потом фильтрует.
    короче, ищите вообще все возможное деление
    iap
    Может, Вы полагаете, что, например, условие в WHERE отбрасывает все нулевые значения в знаменателях полей SELECTа,
    и поэтому такая ошибка невозможна. На эти грабли очень часто наступают.
    Тогда ответ будет простым: сервер сам решает, сначала отбрасывать записи,
    не удовлетворяющие WHERE, а потом формировать результирующий датасет
    или поступить наоборот. Во втором случае обычно как раз и удивляются
    ошибкам преобразования и деления на ноль, хотя WHERE якобы все такие строки "должен был отбросить".
    o-o, iap - спасибо за советы, я посмотрю с этой точки зрения
    1 апр 15, 11:56    [17458460]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    o-o
    Guest
    SQL2008
    Интрига достигла эпогея.

    какого-какого гея достигла интрига?
    Парижской. БОГОматери
    1 апр 15, 12:00    [17458490]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    SQL2008
    Member

    Откуда: Москва
    Сообщений: 4392
    Sorry - Апогея
    1 апр 15, 12:02    [17458507]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104760
    Shocker.Pro
    Все операторы деления закрыты /NULLIF(n,0)

    Может где то закрался /NULLIF(0,n) ?
    1 апр 15, 12:21    [17458631]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Владислав Колосов
    Member

    Откуда:
    Сообщений: 8316
    iap
    Shocker.Pro,

    Может, Вы полагаете, что, например, условие в WHERE отбрасывает все нулевые значения в знаменателях полей SELECTа,
    и поэтому такая ошибка невозможна. На эти грабли очень часто наступают.


    Именно так! Фильтр может сработать по плану запроса после попытки деления.
    1 апр 15, 12:53    [17458855]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 22201
    Shocker.Pro
    o-o
    может, есть вьюха, где есть отбор с условием <> 0.
    при выборке только из нее все хорошо.
    потом вы соединяете ее еще с чем-то и там делите что-то на эти вроде бы ненулевые значения из вьюхи.
    а он так соптимизировал, что сначала делит, потом фильтрует.
    короче, ищите вообще все возможное деление
    iap
    Может, Вы полагаете, что, например, условие в WHERE отбрасывает все нулевые значения в знаменателях полей SELECTа,
    и поэтому такая ошибка невозможна. На эти грабли очень часто наступают.
    Тогда ответ будет простым: сервер сам решает, сначала отбрасывать записи,
    не удовлетворяющие WHERE, а потом формировать результирующий датасет
    или поступить наоборот. Во втором случае обычно как раз и удивляются
    ошибкам преобразования и деления на ноль, хотя WHERE якобы все такие строки "должен был отбросить".
    o-o, iap - спасибо за советы, я посмотрю с этой точки зрения
    Да, дело было в этом.

    вопрос решен - спасибо всем за советы и комментарии
    1 апр 15, 14:17    [17459488]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104760
    Shocker.Pro
    вопрос решен

    Неужели таки human errors ?
    1 апр 15, 14:20    [17459512]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    Shocker.Pro
    Member

    Откуда: ->|<- :адуктО
    Сообщений: 22201
    Glory
    Неужели таки human errors ?
    да. твое замечание
    Glory
    Серверное исключение о делении на 0 возникает при делении на 0
    А не при построении плана или какой то обработке индекса
    помогло, исключив фактор моего незнания каких-то побочных тонкостей
    1 апр 15, 14:27    [17459541]     Ответить | Цитировать Сообщить модератору
     Re: Деление на ноль где-то в недрах запроса  [new]
    dma_caviar
    Member

    Откуда: https://itproduct.ru
    Сообщений: 2351
    А у вас в "запросе" нигде в недрах не происходит апдейта или инсерта? Если происходит, тогда тригеры прошерстите.
    1 апр 15, 19:57    [17461458]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить