powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Informix [игнор отключен] [закрыт для гостей] / Переменные в процедурах
15 сообщений из 15, страница 1 из 1
Переменные в процедурах
    #35109753
Kostik_les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет Всем !
IDS 9.21
Решил уйти от фрагментации таблицы BY ROUND ROBIN.
Сделал фрагментацию по выражению.
Перевел данные и индексы на разные диски.
Индексы заработали намного быстрее, но только если передавать в запрос константу.
В случае , когда процедура работает с переменными, она, похоже, индексов не видит вообще !
Выполняется более 30 сек !
А, если внутри этой же процедуры в конкретном запросе подставляю постоянные значения,
то процедура отрабатывает за доли секунды.

Где- то говорили, что можно ввести эти переменные во временные таблицы,
но для этого надо менять все процедуры (их около 100).
Что предложите, кроме как изменять все хранимые процедуры ?
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35109817
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[телепатия он]
STMT_CACHE включен?
onstat -c|grep -i STMT_CACHE
onstat -g cac stmt
[телепатия офф]


версия инф? планы запросов?
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35109866
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в процедурах, ступил, STMT_CACHE тут ни при чем.
тогда хинтами загнать в нужный план
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35110150
Kostik_les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Так ведь хинты проставлять - это надо все процедуры перелопатить !!!!
Как ускорить процесс ?
-------------------------------------
структура Таблицы:

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 )
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35110309
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у вас неправильно фрагментировано
поэтому фрагментация не работает в обоих случаях
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35110505
Kostik_les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что именно неправильно ?
И в каких _обоих_ случаях?
В том то и суть, что при выполнении одиночного запроса всё отрабатывает моментально !!!
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35110515
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 .....)
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35110644
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kostik_lesIDS 9.21
Решил уйти от фрагментации таблицы BY ROUND ROBIN.
Сделал фрагментацию по выражению.
Перевел данные и индексы на разные диски.
Индексы заработали намного быстрее, но только если передавать в запрос константу.
В случае , когда процедура работает с переменными, она, похоже, индексов не видит вообще !
Выполняется более 30 сек !
А, если внутри этой же процедуры в конкретном запросе подставляю постоянные значения,
то процедура отрабатывает за доли секунды.?
А вы заметили, что индексы в обоих случаях используются разные ?
И в одном и в другом случае индексы используются, а вот фрагментация, как правильно заметил Денис, для ЭТИХ запросов не используется совсем, т.к. выражение фрагментации и используемые фильтры у вас совсем разные.
Похоже, что индекс по data у вас слишком тяжелый и его избирательность низкая (т.е. слишком много строк должно выбраться по стандартному условию) и только затем применяется фильтр по очень избирательным значениям kodka и ndog.
Во втором случае все наоборот - сначала выбирается по хорошему индексу всего несколько строк и только затем применяется фильтр по datetime.

Kostik_lesГде- то говорили, что можно ввести эти переменные во временные таблицы,
но для этого надо менять все процедуры (их около 100).
Что предложите, кроме как изменять все хранимые процедуры ?
Кроме стандартной директивы, которая вам не сильно подходит, попробуйте на время убрать (выключить) индекс по data (если он более нигде не нужен). Возможно, тогда и в первом случае, будет также применяться индекс по kodka и ndog.
Возможно вам подойдет миграция на IDS 11.1 где можно применять ВНЕШНИЕ директивы - как раз ваш случай невмешательства в тексты процедур.
Надеюсь, о сборе статистики HIGH по индексным столбцам напоминать не нужно ?
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35112043
Kostik_les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое !

Конечно, отключение индекса по дате помогает.
Но отключить индекс никак не могу - он тоже активно используется в других запросах.

Только вопрос у меня остался такой:
Почему уход от стратегии фрагментирования 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.
Как я понял, индексы в случае ее использования не самые скоростные?
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35112419
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kostik_les
Estimated Cost: 132
Estimated # of Rows Returned: 6

(1) Index Keys: kodka ndog (Serial, fragments: ALL)

У вас индекс раньше был фрагментрованным а сейчас не фрагментирован. Раньше статистика была, а сейчас ее нет?
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35116441
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kostik_lesПочему уход от стратегии фрагментирования ROUND ROBIN повлияла так на работу оптимизатора? Или на это влияет что-то еще?
На работу оптимизатора влияет очень много факторов, в том числе и нам неизвестных.

Kostik_les
И еще хотел бы, чтоб кто-то поделился со мной знаниями о всех
преемуществах и недостатках схемы фрагментирования ROUND ROBIN.
Как я понял, индексы в случае ее использования не самые скоростные?
Знаниями, которых нет в книжках, могут поделиться только те, кто активно используют это на практике, а таковых довольно мало, т.к. польза от ROUND ROBIN может быть только в редких и конкретных ситуациях (например, надо просто разделить огромную таблицу на фрагменты, чтобы избежать ограничения на кол-во страниц в табличном пространстве).
А индексы там самые обычные.
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35116449
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Журавлев ДенисРаньше статистика была, а сейчас ее нет?
да, что то мы никак не получим ответ на счет статистики...
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35117132
Kostik_les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помогли 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 ?)
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35117252
vasilis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 значения на миллион строк. Но об индексе и его размере оптимизатор будет знать.
...
Рейтинг: 0 / 0
Переменные в процедурах
    #35117896
Kostik_les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо ВСЕМ ОГРОМНОЕ !!!
Очень и Очень ПОМОГЛИ
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Informix [игнор отключен] [закрыт для гостей] / Переменные в процедурах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]