|
|
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
В очередной раз наши программисты свояли запрс, на который сервер выдаёт: errorThe current query would generate a key size of 676 for a work table. This exceeds the maximum allowable limit of 600. Пару лет было все нормально, но похоже после обновления статистики(хотя может причина в другом), началась эта ошибка! Что делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2008, 14:57 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > В очередной раз наши программисты свояли запрс, на который сервер выдаёт: > error > The current query would generate a key size of 676 for a work table. > This exceeds the maximum allowable limit of 600. > Что делать? переписывать запрос. Это от статистики не зависит совсем, зависит только от запроса. Это случается, когда суммарный размер полей, указанных в GROUP BY слишком большой или когда список вывода в запросах с DISTINCT или UNION без ALL очень большой. Всегда почти можно переписать запрос, например, вынося JOIN-ы с таблицами-атрибутами из такого запроса, чтобы выполнить эти операции (GROUP BY, DISTINCT или UNION ), поместив результат во временную таблицу, а потом уже с ней с JOIN-ить. Если это -- GROUP BY - там есть ещё один рецепт, если нужно, могу отдельно рассказать. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2008, 18:35 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
MasterZiv cherrex_Den пишет: > В очередной раз наши программисты свояли запрс, на который сервер выдаёт: > error > The current query would generate a key size of 676 for a work table. > This exceeds the maximum allowable limit of 600. > Что делать? переписывать запрос. Это от статистики не зависит совсем, зависит только от запроса. Это случается, когда суммарный размер полей, указанных в GROUP BY слишком большой или когда список вывода в запросах с DISTINCT или UNION без ALL очень большой. Всегда почти можно переписать запрос, например, вынося JOIN-ы с таблицами-атрибутами из такого запроса, чтобы выполнить эти операции (GROUP BY, DISTINCT или UNION ), поместив результат во временную таблицу, а потом уже с ней с JOIN-ить. Если это -- GROUP BY - там есть ещё один рецепт, если нужно, могу отдельно рассказать. да проблема в GROUP BY, там полей 20 указано! Допустим все эти 20 полей нужны в GROUP BY, что тогда делать? у меня только одно соображение: сделать GROUP BY с половиной полей(10) и поместить в временную таблицу, потом остальную группировку сделать уже по временной таблице! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.11.2008, 18:46 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > да проблема в GROUP BY, там полей 20 указано! Допустим все эти 20 полей > нужны в GROUP BY, что тогда делать? В SQL пологается в GROUP BY писать все поля, которые не находятся под агрегатами. В ASE это делать не обязательно. И хотя многие (и я в том числе) считают, что это очень плохо, потому что это приводит к катастрофическим ошибкам в запросах, в данном случае это может помочь. Сейчас попробую объяснить как. Обычно в запросе с GROUP BY все поля делятся на три категории: (1) поля, являющиеся идентификаторами сущностей, составляющих каждую группу в группировке. Например, если мы получаем строки, соответствующие сотруднику и его месту работы (ставке), то это будут идентификаторы сотрудника и ставки. (2) поля, являющиеся неключевыми атрибутами сущностей, составляющих каждую группу в группировке. Например, если мы получаем строки, соответствующие сотруднику и его месту работы (ставке), то это будут ФИО сотрудника и название ставки. (3) поля, полученные агрегированием (содержащие агрегирующие функции от исходных полей). В нашем примере это могли бы быть сумма зарплаты и сумма налога. Группы (1) и (2) должны входить в GROUP BY. (1) обычно короткие, (2) обычно, наоборот, длинные. Можно переписать запрос так, чтобы он НЕ содержал поля группы (2). Чтобы это сделать, но не сломать запрос, нужно переписать GROUP BY так, чтобы он: содержал все поля группы (1) (т.е. их мы оставляем) для каждой связанной JOIN-ом таблицы из тех, чьи первичные ключи не входят в (1), нужно добавить в GROUP BY первичный ключ этой при-JOIN-енной таблицы. Получившийча запрос БУДЕТ НАРУШАТЬ ПРАВИЛА СТАНДАРТА ANSI SQL и не будет переносим, кроме этого, такие запросы могут вызывать очень серьёзные проблемы с производительностью, т.е., грубо говоря, очень долго выполняться. Это связано как раз с этим "дополнением" ASE для GROUP BY. Описано это здесь и в последующих главах. Читайте и изучайте сами. Вкратце -- такие запросы могут вызывать выполнение декартового произведения результата группировки обратно с одной или несколькими исходными таблицами с данными, причём БЕЗ применения каких-либо условий, что, понятно, очень опасно при даже достаточно небольших таблицах типа 10 - 100 тысяч записей. Поэтому НЕОБХОДИМО ОБЯЗАТЕЛЬНО ПРОВЕРЯТЬ ПЛАН ЗАПРОСА И ТЕСТИРОВАТЬ ЕГО ПРОИЗВОДИТЕЛЬНОСТЬ ПЕРЕД ВНЕДРЕНИЕМ В РАБОЧУЮ СИСТЕМУ. На плане всегда видны дополнительные незапланированные JOIN-ы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2008, 19:30 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
Спасибо!!! маленькое уточнение! Извините за назойливость!!! MasterZiv очень серьёзные проблемы с производительностью, т.е., грубо говоря, очень долго выполняться. прочитал все и ссылку, но проблемы с производительностью могут поджидать только если будет ошибка в запросе (будет происходить декартовое произведение) либо сам по себе такой запрос(без ошибки и без декарт.произведения) трудоёмок для ASE? cherrex_Den у меня только одно соображение: сделать GROUP BY с половиной полей(10) и поместить в временную таблицу, потом остальную группировку сделать уже по временной таблице! а такой способ прокатит? Ну если даже не выдержан стандарт SQL, а все равно не хватает(больше 600) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2008, 21:59 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
Зачем такие сложности с непереносимыми запросами и возможными декартовыми произведениями? Насколько я понимаю проблема состоит только в ограничении на длину индекса в ASE в 600 байт. Чтобы не превышать этот лимит разбейте ваш запрос на две части. В первой перечислите И сделайте группировку только по первичным ключам, даже если их 20 штук по 30 байт на каждый должно хватить. Результат сохраните во временную таблицу. На втором этапе присоедините по имеющимся ключам вспомогательные таблицы и обновите остальные поля типа ФИО, названия, и прочее. И никаких нарушений стандарта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.11.2008, 22:11 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
cherrex_DenСпасибо!!! маленькое уточнение! Извините за назойливость!!! MasterZiv очень серьёзные проблемы с производительностью, т.е., грубо говоря, очень долго выполняться. прочитал все и ссылку, но проблемы с производительностью могут поджидать только если будет ошибка в запросе (будет происходить декартовое произведение) либо сам по себе такой запрос(без ошибки и без декарт.произведения) трудоёмок для ASE? cherrex_Den у меня только одно соображение: сделать GROUP BY с половиной полей(10) и поместить в временную таблицу, потом остальную группировку сделать уже по временной таблице! а такой способ прокатит? Ну если даже не выдержан стандарт SQL, а все равно не хватает(больше 600) все, дошло! вопросы снимаютсся! Всем спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2008, 08:04 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > прочитал все и ссылку, но проблемы с производительностью могут поджидать > только если будет ошибка в запросе (будет происходить декартовое > произведение) либо сам по себе такой запрос(без ошибки и без > декарт.произведения) трудоёмок для ASE? > Ни то, и ни другое. Запрос будет БЕЗ ОШИБКИ в том смысле, что это никак не будет сообщено разработчику (кроме случая, когда set fipsflagger on), и это является ожидаемым поведением ASE с точки зрения разработчиков сервера. Но многие разработчики даже не подозревают о таков мозможном поведении ASE, вот в чём проблема. Что на счёт трудоёмкости - если там будет неявное декартово произведение, оно всегда для любой СУБД трудоёмко. Просто потому, что много записей. Если не будет - то производительность будет нормальной. Надо только "правильно" написать запрос, а, поскольку в случае "неправильного" запроса ASE ничего не говорит, то, чтобы всё было хорошо, надо очень тщательно протестировать запрос, посмотреть план, IO, и пр. и убедиться, что всё хорошо. > а такой способ прокатит? Ну если даже не выдержан стандарт SQL, а все > равно не хватает(больше 600) В принципе должен работать, но вы же будете генерировать больше строк, чем нужно, в промежуточной таблице, потом её читать, а это всё лишний IO. Не думаю, что это - лучший способ. Уж если идти таким путём, можно сделать временную таблицу с идентификаторами и агрегатами, а потом к ней при-JOIN-ить все остальные атрибуты для показа. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2008, 12:10 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > а такой способ прокатит? Ну если даже не выдержан стандарт SQL, а все > равно не хватает(больше 600) Ну это как-то очень странно, что ж у вас за ключи такие длинные ? А так (отвечаю всем) - ну да, можно во временные таблицы сагрегировать, но это -- лишнее IO и потом не всегда можно временную таблицу использовать. Я хотел предложить решение, которое всегда применимо, в любом запросе. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2008, 12:13 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
MasterZivЯ хотел предложить решение, которое всегда применимо, в любом запросе. то есть правильный(не требующий лишнее IO) алгоритм такой(поправьте если не так): 1.сводим все ключи и делаем GROUP BY по ключам( GROUP BY содержал все поля группы (1) и для каждой связанной JOIN-ом таблицы из тех, чьи первичные ключи не входят в (1), нужно добавить в GROUP BY первичный ключ этой при-JOIN-енной таблицы.) и кладем во времянку. 2.потом по ключам которые не входят в группу 1 делаем join-ы. правильно понял? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2008, 13:04 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > 1.сводим все ключи и делаем GROUP BY по ключам( GROUP BY содержал все > поля группы (1) и для каждой связанной JOIN-ом таблицы из тех, чьи > первичные ключи не входят в (1), нужно добавить в GROUP BY первичный > ключ этой при-JOIN-енной таблицы.) и кладем во времянку. > 2.потом по ключам которые не входят в группу 1 делаем join-ы. Я не понял, что там за "времянка". Либо вы пишите нормальный ANSI GROUP BY, и вам никакого "правильного алгоритма" не надо, либо вы пишите не ANSI GROUP BY, но там уже никаких временных таблиц не нужно. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2008, 13:45 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
MasterZiv cherrex_Den пишет: > 1.сводим все ключи и делаем GROUP BY по ключам( GROUP BY содержал все > поля группы (1) и для каждой связанной JOIN-ом таблицы из тех, чьи > первичные ключи не входят в (1), нужно добавить в GROUP BY первичный > ключ этой при-JOIN-енной таблицы.) и кладем во времянку. > 2.потом по ключам которые не входят в группу 1 делаем join-ы. Я не понял, что там за "времянка". Либо вы пишите нормальный ANSI GROUP BY, и вам никакого "правильного алгоритма" не надо, либо вы пишите не ANSI GROUP BY, но там уже никаких временных таблиц не нужно. Что-то я уже запутался! По ANSI GROUP BY все замечательно только может произойти казус "The current query would generate a key size of ...". По не ANSI GROUP BY казус очень редкий, но есть вероятность ошибки, и нужно делать через временную таблицу. Так, да? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2008, 15:39 |
|
||
|
ASE 12.5 The current query would generate a key size of 676 for a work table
|
|||
|---|---|---|---|
|
#18+
cherrex_Den пишет: > По ANSI GROUP BY все замечательно только может произойти казус "The > current query would generate a key size of ...". > По не ANSI GROUP BY казус очень редкий, но есть вероятность ошибки, и > нужно делать через временную таблицу. > > Так, да? Да нет, не так. Кто вам что про временную таблицу -то говорил ? Ещё раз. У вас два пути. разбить запрос на два (или более), либо делаю промежуточную, а потом окончательную группировку, либо делая группировку только по ключам, а потом при JOIN-ивая неключевые атрибуты уже к результату. В этом случае вам нужно хранить промежуточный результат во временной таблице. Написать НЕ-ANSI GROUP BY, тогда никаких временных таблиц не нужно. Но его нужно отлаживать тщательно. вы может быть уже лучше запрос бы показали , а то я чувствую что по третему кругу уже пойдём. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2008, 21:46 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35672791&tid=2011272]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 247ms |
| total: | 362ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...