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

Откуда:
Сообщений: 5
Приветствую всех.
Работала себе база 1С 8.1 ЗУП 2.1.7.3 Для Украины и вдруг перестали проводится Табеля - программа вылетает с ошибкой MS SQL сервера. Я Profiler-ом отследил запрос на котором вываливается ошибка "The query processor ran out of stack space during query optimization", немного его модифицировал и попробовал запустить в QA-результат тот же. Убираю последний UNION - срабатывает без ошибок. На этом же сервере крутится такая же база, используемая для тестов, попробовал выполнить полный запрос в ней - без ошибок. Получается базы почти одинаковые: в одной стек переполняется, а в другой нет - что это за х....?
У меня стоит:
Microsoft SQL Server 2000 - 8.00.2039 (Intel X86) May 3 2005 23:18:38 Copyright (c) 1988-2003 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Мой запрос (93 Union)

USE ZUP_PMEZ_NEW
SELECT DISTINCT
_Document4042_VT4723_Q_000_T_001._LineNo4724 AS _Q_000_F_000,
_Document4042_VT4723_Q_000_T_001._Fld4725RRef AS _Q_000_F_001RRef,
_Document4042_VT4723_Q_000_T_001._Fld4726RRef AS _Q_000_F_002RRef,
_Document4042_VT4723_Q_000_T_001._Fld4727RRef AS _Q_000_F_003RRef,
_Document4042_VT4723_Q_000_T_001._Fld4728 AS _Q_000_F_004,
CAST(CAST(1 AS NUMERIC(1,0)) AS NUMERIC(2,0)) AS _Q_000_F_005
FROM
_Document4042_VT4723 _Document4042_VT4723_Q_000_T_001 WITH(REPEATABLEREAD)
WHERE
_Document4042_VT4723_Q_000_T_001._Document4042_IDRRef = 1
UNION
SELECT DISTINCT
_Document4042_VT4723_Q_001_T_001._LineNo4724 AS _Q_000_F_000,
_Document4042_VT4723_Q_001_T_001._Fld4725RRef AS _Q_000_F_001RRef,
_Document4042_VT4723_Q_001_T_001._Fld4726RRef AS _Q_000_F_002RRef,
_Document4042_VT4723_Q_001_T_001._Fld4729RRef AS _Q_000_F_003RRef,
_Document4042_VT4723_Q_001_T_001._Fld4730 AS _Q_000_F_004,
CAST(CAST(1 AS NUMERIC(1,0)) AS NUMERIC(2,0)) AS _Q_000_F_005
FROM
_Document4042_VT4723 _Document4042_VT4723_Q_001_T_001 WITH(REPEATABLEREAD)
WHERE
_Document4042_VT4723_Q_001_T_001._Document4042_IDRRef = 1
UNION
SELECT DISTINCT
_Document4042_VT4723_Q_002_T_001._LineNo4724 AS _Q_000_F_000,
_Document4042_VT4723_Q_002_T_001._Fld4725RRef AS _Q_000_F_001RRef,
_Document4042_VT4723_Q_002_T_001._Fld4726RRef AS _Q_000_F_002RRef,
_Document4042_VT4723_Q_002_T_001._Fld4731RRef AS _Q_000_F_003RRef,
_Document4042_VT4723_Q_002_T_001._Fld4732 AS _Q_000_F_004,
CAST(CAST(1 AS NUMERIC(1,0)) AS NUMERIC(2,0)) AS _Q_000_F_005
FROM
_Document4042_VT4723 _Document4042_VT4723_Q_002_T_001 WITH(REPEATABLEREAD)
WHERE
_Document4042_VT4723_Q_002_T_001._Document4042_IDRRef = 1
UNION
...........................................покусано............................................
SELECT DISTINCT
_Document4042_VT4723_Q_090_T_001._LineNo4724 AS _Q_000_F_000,
_Document4042_VT4723_Q_090_T_001._Fld4725RRef AS _Q_000_F_001RRef,
_Document4042_VT4723_Q_090_T_001._Fld4726RRef AS _Q_000_F_002RRef,
_Document4042_VT4723_Q_090_T_001._Fld4907RRef AS _Q_000_F_003RRef,
_Document4042_VT4723_Q_090_T_001._Fld4908 AS _Q_000_F_004,
CAST(31 AS NUMERIC(2,0)) AS _Q_000_F_005
FROM
_Document4042_VT4723 _Document4042_VT4723_Q_090_T_001 WITH(REPEATABLEREAD)
WHERE
_Document4042_VT4723_Q_090_T_001._Document4042_IDRRef = 1
UNION
SELECT DISTINCT
_Document4042_VT4723_Q_091_T_001._LineNo4724 AS _Q_000_F_000,
_Document4042_VT4723_Q_091_T_001._Fld4725RRef AS _Q_000_F_001RRef,
_Document4042_VT4723_Q_091_T_001._Fld4726RRef AS _Q_000_F_002RRef,
_Document4042_VT4723_Q_091_T_001._Fld4909RRef AS _Q_000_F_003RRef,
_Document4042_VT4723_Q_091_T_001._Fld4910 AS _Q_000_F_004,
CAST(31 AS NUMERIC(2,0)) AS _Q_000_F_005
FROM
_Document4042_VT4723 _Document4042_VT4723_Q_091_T_001 WITH(REPEATABLEREAD)
WHERE
_Document4042_VT4723_Q_091_T_001._Document4042_IDRRef = 1
UNION
SELECT DISTINCT
_Document4042_VT4723_Q_092_T_001._LineNo4724 AS _Q_000_F_000,
_Document4042_VT4723_Q_092_T_001._Fld4725RRef AS _Q_000_F_001RRef,
_Document4042_VT4723_Q_092_T_001._Fld4726RRef AS _Q_000_F_002RRef,
_Document4042_VT4723_Q_092_T_001._Fld4911RRef AS _Q_000_F_003RRef,
_Document4042_VT4723_Q_092_T_001._Fld4912 AS _Q_000_F_004,
CAST(31 AS NUMERIC(2,0)) AS _Q_000_F_005
FROM
_Document4042_VT4723 _Document4042_VT4723_Q_092_T_001 WITH(REPEATABLEREAD)
WHERE
_Document4042_VT4723_Q_092_T_001._Document4042_IDRRef = 1

Помогите пожалуйста. Заранее благодарен.
2 ноя 09, 16:31    [7872319]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Плохо оптимизатору от этого запроса. Переписывайте.

З.Ы. Можно еще последние хотфиксы на сервер накатить, хотя я не уверен, что 93 юниона после этого станут работать.
2 ноя 09, 16:41    [7872395]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
Stackmann
Member

Откуда:
Сообщений: 5
Дык а почему этому оптимизатору в другой базе от этого запроса не плохо?
2 ноя 09, 16:50    [7872470]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
Glory
Member

Откуда:
Сообщений: 104760
Stackmann
Дык а почему этому оптимизатору в другой базе от этого запроса не плохо?

Разные базы - разные объекты/индексы/статистики - разные планы - разные требования к стеку для построения плана
2 ноя 09, 16:52    [7872495]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31200
Stackmann
Дык а почему этому оптимизатору в другой базе от этого запроса не плохо?
Оптимизатор учмтывает много всего, в т.ч. особенности железа и настроек сервера. Может идти по другой ветке и ломаться.

Во первых, проанализируйте, обязательно ли нужно использовать UNION вместо UNION ALL, во вторых на крайняк используйте временные таблицы.
2 ноя 09, 16:55    [7872518]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
Stackmann
Member

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


А то, что в этой базе еще вчера оптимизатор не вылетал - это нормально?

alexeyvg
Во первых, проанализируйте, обязательно ли нужно использовать UNION вместо UNION ALL, во вторых на крайняк используйте временные таблицы.


Не пойму разницы: что оптимизатору станет намного легче, если ему не придется сворачивать одинаковые строки?
2 ноя 09, 17:07    [7872598]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
У меня машина вчера заводилась, а сегодня не хочет? Что ей не хватает? Это вообще нормально? Что это за х....?
2 ноя 09, 17:18    [7872715]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31200
Stackmann
alexeyvg
Оптимизатор учмтывает много всего, в т.ч. особенности железа и настроек сервера. Может идти по другой ветке и ломаться.


А то, что в этой базе еще вчера оптимизатор не вылетал - это нормально?
Может, данные поменялись (если базы не в РидОнли)? Или диск перегрелся и статистика по нему изменилась?

Очевидно, раз результат изменился, значит, изменилось что-то внутри :-)

Stackmann
Не пойму разницы: что оптимизатору станет намного легче, если ему не придется сворачивать одинаковые строки?
Может, и не станет. Но из всех вариантов этот проще всего проверить.

Точно поможет разбиение на отдельные запросы + временная таблица.
2 ноя 09, 17:19    [7872725]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
Stackmann
Member

Откуда:
Сообщений: 5
А можно как-то этим оптимизатором управлять (что-ли)? Или помотреть какие он там планы строит? Может где можно ему "помочь".
2 ноя 09, 17:33    [7872870]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
Glory
Member

Откуда:
Сообщений: 104760
Stackmann
А можно как-то этим оптимизатором управлять (что-ли)? Или помотреть какие он там планы строит? Может где можно ему "помочь".

Перепишите запрос - это будет самая лучшая помощь оптимизатору
2 ноя 09, 17:36    [7872902]     Ответить | Цитировать Сообщить модератору
 Re: Стек оптимизатора в одной базе переполняется, а в другой нет  [new]
Stackmann
Member

Откуда:
Сообщений: 5
Придется. Спасибо за ответы.
2 ноя 09, 17:46    [7872992]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить