Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Привет Всем ! IDS 9.21 Решил уйти от фрагментации таблицы BY ROUND ROBIN. Сделал фрагментацию по выражению. Перевел данные и индексы на разные диски. Индексы заработали намного быстрее, но только если передавать в запрос константу. В случае , когда процедура работает с переменными, она, похоже, индексов не видит вообще ! Выполняется более 30 сек ! А, если внутри этой же процедуры в конкретном запросе подставляю постоянные значения, то процедура отрабатывает за доли секунды. Где- то говорили, что можно ввести эти переменные во временные таблицы, но для этого надо менять все процедуры (их около 100). Что предложите, кроме как изменять все хранимые процедуры ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 09:20 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
[телепатия он] STMT_CACHE включен? onstat -c|grep -i STMT_CACHE onstat -g cac stmt [телепатия офф] версия инф? планы запросов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 09:54 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
а в процедурах, ступил, STMT_CACHE тут ни при чем. тогда хинтами загнать в нужный план ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 10:09 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Так ведь хинты проставлять - это надо все процедуры перелопатить !!!! Как ускорить процесс ? ------------------------------------- структура Таблицы: create table 'informix'.ihzv ( idzv SERIAL not null, . . . ) fragment by expression ((MONTH (data ) >= 1 ) AND (MONTH (data ) <= 3 ) ) in data_dbs1, ((MONTH (data ) >= 4 ) AND (MONTH (data ) <= 6 ) ) in data_dbs2, ((MONTH (data ) >= 7 ) AND (MONTH (data ) <= 9 ) ) in data_dbs3, ((MONTH (data ) >= 10 ) AND (MONTH (data ) <= 12 ) ) in data_dbs4 extent size 512000 next size 640 lock mode row; create index 'informix'.ihzv_data on 'informix'.ihzv ( data ) in i_dbs; create cluster index 'informix'.ihzv_kodka_ndog on 'informix'.ihzv ( kodka, ndog ) in i_dbs; create unique index 'informix'.ihzv_unique_i on 'informix'.ihzv ( idzv ) in i_dbs; alter table 'informix'.ihzv add constraint unique (idzv) constraint ihzv_unic_i; ------------------------------------------ Процедура: create procedure date_tmp(_kodka int,_ndog int, _data_1_intr datetime year to second,_data_2_intr datetime year to second) returning int,int,datetime year to second,char(32),char(64) define _kodus,_nrm int; define _data datetime year to second; define _number char(32); define _id char(64); foreach select kodus,nrm,data,number,h323_incoming_conf_id into _kodus,_nrm,_data,_number,_id from ihzv where kodka = _kodka and ndog = _ndog and data between _data_1_intr and _data_2_intr return _kodus,_nrm,_data,_number,_id with resume; end foreach; end procedure; --------------------------------------- set explain ON; update statistics for procedure date_tmp ---------- Procedure: informix.date_tmp select x0.kodus ,x0.nrm ,x0.data ,x0.number ,x0.h323_incoming_conf_id from "informix".ihzv x0 where (((x0.kodka = ? ) AND (x0.ndog = ? ) ) AND ((x0.data >= ? ) AND (x0.data <= ? ) ) ) QUERY: ------ Estimated Cost: 3 Estimated # of Rows Returned: 1 1) informix.ihzv: INDEX PATH Filters: (informix.ihzv.ndog = '<VAR>' AND informix.ihzv.kodka = '<VAR>' ) (1) Index Keys: data (Serial, fragments: ALL) Lower Index Filter: informix.ihzv.data >= '<VAR>' Upper Index Filter: informix.ihzv.data <= '<VAR>' ----------------------------------- И план для Запроса,который в процедуре, но только с конкретными значениями: (запрос выполняется моментально !) ----------------------------------- QUERY: ------ select kodus,nrm,data,number,h323_incoming_conf_id from ihzv where kodka = 3323 and ndog = 6237 and data between datetime(2008-01-01 0:00:00)year to second and datetime(2008-02-01 0:00:00)year to second Estimated Cost: 1 Estimated # of Rows Returned: 1 Maximum Threads: 1 1) informix.ihzv: INDEX PATH Filters: (informix.ihzv.data <= datetime(2008-02-01 00:00:00) year to second AND informix.ih zv.data >= datetime(2008-01-01 00:00:00) year to second ) (1) Index Keys: kodka ndog (Parallel, fragments: ALL) Lower Index Filter: (informix.ihzv.ndog = 6237 AND informix.ihzv.kodka = 3323 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 11:35 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
у вас неправильно фрагментировано поэтому фрагментация не работает в обоих случаях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 12:05 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Что именно неправильно ? И в каких _обоих_ случаях? В том то и суть, что при выполнении одиночного запроса всё отрабатывает моментально !!! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 12:47 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Kostik_lesЧто именно неправильно ? И в каких _обоих_ случаях? В том то и суть, что при выполнении одиночного запроса всё отрабатывает моментально !!!все неправильно. Чтоб сказать как правильно надо видеть типичные запросы, и вообще зачем вы фрагментировали? Во втором случае банальный проход по всему индексу (нет слов fragments eliminated)(мне лень думать но индекс по моему не фрагментирован). Если в выражении фрагментации использована функция (в вашем случае (MONTH (data )), то оптимизатор любой субд будет использовать фрагментации в запросах вида "where MONTH (data ) =", т.е. с той же функцией. Если вы хотели разложить поквартально (зачем такой гемор7???????????????????????????????), то надо было писать ((data >= 01.01.2007 ) AND (data <= 31.03.2007 )) or ((data >= 01.01.2008 ) AND (data <= 31.03.2008 )or .....) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 12:50 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Kostik_lesIDS 9.21 Решил уйти от фрагментации таблицы BY ROUND ROBIN. Сделал фрагментацию по выражению. Перевел данные и индексы на разные диски. Индексы заработали намного быстрее, но только если передавать в запрос константу. В случае , когда процедура работает с переменными, она, похоже, индексов не видит вообще ! Выполняется более 30 сек ! А, если внутри этой же процедуры в конкретном запросе подставляю постоянные значения, то процедура отрабатывает за доли секунды.? А вы заметили, что индексы в обоих случаях используются разные ? И в одном и в другом случае индексы используются, а вот фрагментация, как правильно заметил Денис, для ЭТИХ запросов не используется совсем, т.к. выражение фрагментации и используемые фильтры у вас совсем разные. Похоже, что индекс по data у вас слишком тяжелый и его избирательность низкая (т.е. слишком много строк должно выбраться по стандартному условию) и только затем применяется фильтр по очень избирательным значениям kodka и ndog. Во втором случае все наоборот - сначала выбирается по хорошему индексу всего несколько строк и только затем применяется фильтр по datetime. Kostik_lesГде- то говорили, что можно ввести эти переменные во временные таблицы, но для этого надо менять все процедуры (их около 100). Что предложите, кроме как изменять все хранимые процедуры ? Кроме стандартной директивы, которая вам не сильно подходит, попробуйте на время убрать (выключить) индекс по data (если он более нигде не нужен). Возможно, тогда и в первом случае, будет также применяться индекс по kodka и ndog. Возможно вам подойдет миграция на IDS 11.1 где можно применять ВНЕШНИЕ директивы - как раз ваш случай невмешательства в тексты процедур. Надеюсь, о сборе статистики HIGH по индексным столбцам напоминать не нужно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 13:24 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Спасибо большое ! Конечно, отключение индекса по дате помогает. Но отключить индекс никак не могу - он тоже активно используется в других запросах. Только вопрос у меня остался такой: Почему уход от стратегии фрагментирования ROUND ROBIN повлияла так на работу оптимизатора? Или на это влияет что-то еще? А план запроса до изменения фрагментирования(со схемой ROUND ROBIN ) был такой : ----------------- Estimated Cost: 132 Estimated # of Rows Returned: 6 1) informix.ihzv: INDEX PATH Filters: ((informix.ihzv.data <= '<VAR>' AND informix.ihzv.data >= '<VAR>' ) AND informix.ih (1) Index Keys: kodka ndog (Serial, fragments: ALL) Lower Index Filter: (informix.ihzv.kodka = '<VAR>' AND informix.ihzv.ndog = '<VAR>' ) ------------------------------ И еще хотел бы, чтоб кто-то поделился со мной знаниями о всех преемуществах и недостатках схемы фрагментирования ROUND ROBIN. Как я понял, индексы в случае ее использования не самые скоростные? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.02.2008, 20:46 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Kostik_les Estimated Cost: 132 Estimated # of Rows Returned: 6 (1) Index Keys: kodka ndog (Serial, fragments: ALL) У вас индекс раньше был фрагментрованным а сейчас не фрагментирован. Раньше статистика была, а сейчас ее нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2008, 08:29 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Kostik_lesПочему уход от стратегии фрагментирования ROUND ROBIN повлияла так на работу оптимизатора? Или на это влияет что-то еще? На работу оптимизатора влияет очень много факторов, в том числе и нам неизвестных. Kostik_les И еще хотел бы, чтоб кто-то поделился со мной знаниями о всех преемуществах и недостатках схемы фрагментирования ROUND ROBIN. Как я понял, индексы в случае ее использования не самые скоростные? Знаниями, которых нет в книжках, могут поделиться только те, кто активно используют это на практике, а таковых довольно мало, т.к. польза от ROUND ROBIN может быть только в редких и конкретных ситуациях (например, надо просто разделить огромную таблицу на фрагменты, чтобы избежать ограничения на кол-во страниц в табличном пространстве). А индексы там самые обычные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2008, 12:10 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Журавлев ДенисРаньше статистика была, а сейчас ее нет? да, что то мы никак не получим ответ на счет статистики... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2008, 12:11 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Помогли 2 варианта: 1) Просто Создал индекс по полям kodka,ndog,data Оптимизатор увидел его. 2) И второй вариант Я сэмулировал ситуацию на другом сервере В итоге, помог возврат к статистике LOW: update statistics LOW for table ihzv drop distributions; Update statistics LOW for table ihzv; То есть оптимизатор заработал по другому из-за того, что всю жизнь статистика делалась как LOW, а в этот раз, после заливки таблицы, я сделал её как HIGH. Поэтому и пострадали некоторые планы выполнения. В общем, пока-что я за второй вариант, как за более глобальный, хотя и менее правильный А вот интересно, чем плохо выполнение всегда Update statistics LOW, а не HIGH?. (Вообще и в частности в моём случае, когда многие процедуры создавались на фоне статистики LOW ?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2008, 14:47 |
|
||
|
Переменные в процедурах
|
|||
|---|---|---|---|
|
#18+
Kostik_lesПомогли 2 варианта: 1) Просто Создал индекс по полям kodka,ndog,data Оптимизатор увидел его. Тоже вариант, правда такой индекс достаточно тяжелый при частых вставках и модификациях но зато с хорошей избирательностью. Kostik_les 2) И второй вариант Я сэмулировал ситуацию на другом сервере В итоге, помог возврат к статистике LOW: update statistics LOW for table ihzv drop distributions; Update statistics LOW for table ihzv; Второй оператор лишний (дублирует работу по сбору статистики). Kostik_les То есть оптимизатор заработал по другому из-за того, что всю жизнь статистика делалась как LOW, а в этот раз, после заливки таблицы, я сделал её как HIGH. Поэтому и пострадали некоторые планы выполнения. А вы утверждали, что план изменился из-за изменения схемы фрагментации и упорно молчали о статистике... Kostik_les В общем, пока-что я за второй вариант, как за более глобальный, хотя и менее правильный А вот интересно, чем плохо выполнение всегда Update statistics LOW, а не HIGH?. (Вообще и в частности в моём случае, когда многие процедуры создавались на фоне статистики LOW ?) Одна из задач админа и состоит в правильном подборе схемы и частоты сбора статистики, т.к. она имеет определяющее значение для работы оптимизатора, особенно с учетом фич, глюков и особенностей в каждой версии. Помню, как то еще в версии 7.3 пришлось долго исследовать особенности выполнения некоторых тяжелых запросов на двух десятках таблиц (время отличалось на 2 порядка!), в результате чего была сделана оптимальная схема сбора статистики, в которой по маленьким таблицам (менее 5 страниц) статистика просто удалялась (тот самый drop distributions). А "плохо выполнение всегда Update statistics LOW" тем, что оптимизатор ничего не знает о распределении данных по ключевым столбцам таблицы, соответственно ему будет все равно, что уникальность или всего 2 значения на миллион строк. Но об индексе и его размере оптимизатор будет знать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2008, 15:19 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=35112043&tid=1608174]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
44ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
| others: | 219ms |
| total: | 379ms |

| 0 / 0 |
