|
|
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Я запускаю несложный запрос на IQ 12.7, использующий небольшие временные таблицы: SELECT o.symbol, o.userName, o.cleanDestName, o.CLEAN_EXEC_VENUE o.genericAttribute, fillQuantity = sum(fillQuantity) , value_in_base_cur = sum(value_in_base_cur), rep_avg = avg(rep_avg) , value = sum(value), currency = convert(CHAR(3), ''), ticker = convert(CHAR(8), ''), country_code = convert(CHAR(3), '') --INTO #tmp1 FROM #ord o, #rep r WHERE o.tradeDateID = r.tradeDateID AND o.orderKey = r.orderKey group by o.symbol, o.userName, o.cleanDestName, CLEAN_EXEC_VENUE, genericAttribute Получаю ошибку: General error: Query rejected because it exceeds resource: Query_Temp_Space_Limit Опция Query_Temp_Space_Limit выставлена в 0 (нет ограничений). Temp cache size = 12 G (в конфигурационном файле) Таблицы: 40К записей (#ord) и 120К записей (#rep). Как я могу получить estimation для требуемого Temp cache size? Помогите, пожалуйста. Спасибо, Света ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2009, 12:04 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
msveta13, Без статистики 40К * 120К = 4800М по оценке оптимизатора. Вы бы для начала создали бы HG индексы по колонкам tradeDateID и orderKey в обеих таблицах, а потом уже и план можно было бы посмотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2009, 13:08 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
up, Мне не удалось создать индексы внутри SP. Я новичок в IQ, может, какие-то параметры поменять, чтобы можно было создавать индексы внутри SP? Еще один общий вопрос: как может быть в этом запросе больше 40К записей, это join по ключу меньшей таблицы? Я не очень понимаю, почему оценка оптимизатора будет 4,8G... Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2009, 14:59 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
msveta13, Да очень просто. Представьте себе, что все значения в обоих колонках, по которым идёт джойн, равны 1, т.е. условие джойна 1=1 для всех записей, которые должны быть соединены между собой (проджойнены) - вот Вам и 4.8Г в худшем случае. Странно. Вот простейший код, который создаёт индекс на временной таблице, которая конечно удаляется автоматически после "выхода" из процедуры. create proc test_tmp as begin create table #t (id int, col1 int) create HG index I_1 on #t (id) end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2009, 20:05 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
Похожая ситуация. Несложный запрос. select pa11.Plan_ID Plan_ID, RTRIM(a16.Plan_DESC) Plan_DESC, pa11.Object_ID Object_ID, a17.Object_DESC Object_DESC, pa11.Month_ID Month_ID, a18.Month_name Month_name, a18.Month_of_Year_ID||'/'||a18.Year_ID CustCol_13, pa12.WJXBFS1 WJXBFS1, ISNULL((pa12.WJXBFS2 / NULLIF(pa13.WJXBFS1, 0)), 0) WJXBFS2, ISNULL((pa14.WJXBFS1 / NULLIF(pa15.WJXBFS1, 0)), 0) WJXBFS3, ISNULL(((pa14.WJXBFS2 / NULLIF(pa15.WJXBFS2, 0)) * pa13.WJXBFS2), 0) WJXBFS4, ISNULL(((ISNULL((pa14.WJXBFS3 / NULLIF(pa15.WJXBFS3, 0)), 0) - ISNULL((pa12.WJXBFS3 / NULLIF(pa13.WJXBFS3, 0)), 0)) * pa15.WJXBFS4), 0) WJXBFS5, pa12.WJXBFS4 WJXBFS6, pa14.WJXBFS4 WJXBFS7, ISNULL((pa12.WJXBFS5 / NULLIF(pa13.WJXBFS4, 0)), 0) WJXBFS8, ISNULL(((pa14.WJXBFS5 / NULLIF(pa15.WJXBFS5, 0)) * pa13.WJXBFS5), 0) WJXBFS9, ISNULL(((ISNULL((pa14.WJXBFS6 / NULLIF(pa15.WJXBFS6, 0)), 0) - ISNULL((pa12.WJXBFS6 / NULLIF(pa13.WJXBFS6, 0)), 0)) * pa15.WJXBFS7), 0) WJXBFSa, pa14.WJXBFS7 WJXBFSb, pa15.WJXBFS8 WJXBFSc from ZZTST020BNLOD005 pa11 left outer join ZZTST020BNLMD000 pa12 on (pa11.Month_ID = pa12.Month_ID and pa11.Object_ID = pa12.Object_ID and pa11.Plan_ID = pa12.Plan_ID) left outer join ZZTST020BNLMD001 pa13 on (pa11.Month_ID = pa13.Month_ID) left outer join ZZTST020BNLMD002 pa14 on (pa11.Month_ID = pa14.Month_ID and pa11.Object_ID = pa14.Object_ID and pa11.Plan_ID = pa14.Plan_ID) cross join ZZTST020BNLMD003 pa15 join DBA.LU_Plan a16 on (pa11.Plan_ID = a16.Plan_ID) join DBA.LU_SHOP a17 on (pa11.Object_ID = a17.Object_ID) join DBA.LU_MONTH a18 on (pa11.Month_ID = a18.Month_ID) Таблицы все небольшие, несколько десятков тысяч строк. В таблице ZZTST020BNLMD003 - одна строка. По всем столбцам, по которым идёт соединение, построены HG индексы. При этом смотрю план запроса, вижу Est. temp space for this node (Mb) 7685.89145279 Act. temp space for this node (Mb) 0.12500000 При большем количестве строк в таблицах, запрос не выполняется по причине превышения Query_temp_space_limit. Можно ли это победить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 14:12 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
Виктор Сакович, Тяжело так вот по одному запросу точно сказать где идёт переоценка оптимизатором. Скорее всего на джойнах по нескольким колонкам (могу и ошибаться). Если это так, то композитный HG индекс по всем колонкам в джойне должен помочь. Проще всего посмотреть план запроса в html и глянуть на каких именно нодах оценка оптимизатора отличается от реальной после выполнения. Виктор, план запроса просто пришлите и мы на него посмотрим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 20:30 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
up, спасибо за ответ. Как доберусь до заказчика, так и вышлю. Я немного поэкспериментировал, убрал cross join, вычисления (isnull), проблема не исчезла. От джойна по нескольким колонкам избавиться не получится, скрипт генерится автоматом, а там настроек не так много. Уже то хорошо, что одноколоночные индексы построены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.05.2009, 23:59 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
Виктор Саковичup, спасибо за ответ. Как доберусь до заказчика, так и вышлю. Я немного поэкспериментировал, убрал cross join, вычисления (isnull), проблема не исчезла. От джойна по нескольким колонкам избавиться не получится, скрипт генерится автоматом, а там настроек не так много. Уже то хорошо, что одноколоночные индексы построены. В предыдущем посте я не так выразился, не "От джойна по нескольким колонкам избавиться не получится", а многостолбцового индекса построить не получится. Я приложил файл с планом запроса проблемные ноды #18 и #19, был бы очень признателен за помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 10:13 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
Виктор Сакович, Виктор смотря на данный конкретный запрос можно Вам порекомендовать отключить вообще поддержку двунаправленных крсоров (Tetch Prior). Врядли это нужно в Вашем случае. Это снимет нагрузку на сервер в целом. set option public.Force_No_Scroll_Cursors='ON'; Переконнектить сессии после этого нужно. Если пройтись по плану вниз, то доходим до ноды 9 и на ней останавливаемся: 17: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to Many (cross - но справа 1 запись) Estimated Right Inputs 1 Estimated Left Inputs 20726596 (левая ветка) 15: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to 1 Estimated Right Inputs 120 Estimated Left Inputs 20726596 (опять по левой) 13: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to 1 Estimated Right Inputs 318 Estimated Left Inputs 20726596 (опять по левой) 11: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to 1 Estimated Right Inputs 359 Estimated Left Inputs 20726596 (опять по левой) 9: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to Many Estimated Right Inputs 9473 Estimated Left Inputs 535210 Тут мы и получаем основной прирост при оценке оптимизатора из-за Many to Many. Output Vector 20 entries (280 data bytes) - это и есть наши Гиги при умножении на кол-во записей по оценке орптимизатора. Смотрим: Condition 1 (pa11.Month_ID AS Month_ID = pa14.Month_ID) Condition 2 (pa11.Object_ID AS Object_ID = pa14.Object_ID) Condition 3 (pa11.Plan_ID AS Plan_ID = pa14.Plan_ID) А разве нельзя в настройках сервера MSTR (я не помню - давно это было) для временных таблиц сказать типа такого? create table ZZTST010L62MD002 (Month_ID smallint,Object_ID unsigned int,Plan_ID unsigned int, WJXBFS1 int,WJXBFS2 int, UNIQUE(Month_ID,Object_ID,Plan_ID) ) Или попробуйте такой запрос в режиме Derived Tables (только в базовых таблицах, если есть джойны по нескольким колонкам создайте композитный HG индекс). Надеюсь не ощибся с разбором. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.05.2009, 18:29 |
|
||
|
How to estimate required Query_Temp_Space_Limit?
|
|||
|---|---|---|---|
|
#18+
upВиктор Сакович, Виктор смотря на данный конкретный запрос можно Вам порекомендовать отключить вообще поддержку двунаправленных крсоров (Tetch Prior). Врядли это нужно в Вашем случае. Это снимет нагрузку на сервер в целом. set option public.Force_No_Scroll_Cursors='ON'; Переконнектить сессии после этого нужно. Если пройтись по плану вниз, то доходим до ноды 9 и на ней останавливаемся: 17: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to Many (cross - но справа 1 запись) Estimated Right Inputs 1 Estimated Left Inputs 20726596 (левая ветка) 15: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to 1 Estimated Right Inputs 120 Estimated Left Inputs 20726596 (опять по левой) 13: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to 1 Estimated Right Inputs 318 Estimated Left Inputs 20726596 (опять по левой) 11: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to 1 Estimated Right Inputs 359 Estimated Left Inputs 20726596 (опять по левой) 9: Generated Result Rows 201 Estimated Result Rows 20726596 Join Result Constraint Many to Many Estimated Right Inputs 9473 Estimated Left Inputs 535210 Тут мы и получаем основной прирост при оценке оптимизатора из-за Many to Many. Output Vector 20 entries (280 data bytes) - это и есть наши Гиги при умножении на кол-во записей по оценке орптимизатора. Смотрим: Condition 1 (pa11.Month_ID AS Month_ID = pa14.Month_ID) Condition 2 (pa11.Object_ID AS Object_ID = pa14.Object_ID) Condition 3 (pa11.Plan_ID AS Plan_ID = pa14.Plan_ID) А разве нельзя в настройках сервера MSTR (я не помню - давно это было) для временных таблиц сказать типа такого? create table ZZTST010L62MD002 (Month_ID smallint,Object_ID unsigned int,Plan_ID unsigned int, WJXBFS1 int,WJXBFS2 int, UNIQUE(Month_ID,Object_ID,Plan_ID) ) Или попробуйте такой запрос в режиме Derived Tables (только в базовых таблицах, если есть джойны по нескольким колонкам создайте композитный HG индекс). Надеюсь не ощибся с разбором. Спасибо. Думаю, что я просто буду отключать query_temp_space_limit на последнем проходе, когда объединяются несколько коротких таблиц для формирования выходной формы. Остальные варианты как-то не проходят. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2009, 13:13 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=35984058&tid=2011017]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 245ms |
| total: | 500ms |

| 0 / 0 |

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