Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Informix Новый топик    Ответить
 Как посчитать percall_cost ?  [new]
falcon111
Member

Откуда:
Сообщений: 117
Привет!
В Сишных удрках стали появляться все более сложные алгоритмы, которые уже требуют некоторого времени на вычисление. Стал вопрос о оценке стоимости вызова УДРки, чтобы оптимизатор правильно строил планы выполнения запросов. И если раньше обычно в запросах не фигурировало больше одной УДР, что позволяло поставить им всем цену 100500 и на том успокоиться, оптимизатор минимизировал вызовы этих процедур, то сейчас есть по два-три УДР в одном запросе, что требует правильно расставить стоимость вызовов УДР, чтобы оптимизатор уже ориентировался между ними в том числе.

В доках написано все, кроме того, КАК получить значение percall_cost
Гугл привел меня сюда, там есть Calculating Cost. Типа цена равна ((secost/sacost)*facost) , вот только метод вычисления этих трех значений, я считаю, не раскрыт.

SET EXPLAIN ON;
SELECT count(*) from bigtable;
Time the query.
1. Let secost be the cost the optimizer assigned for the scan. Read the sqexplain.out file to get secost.
Причем тут каунт? Каунт не должен вообще требовать времени на вычисление. Может тут имелось в виду SELECT count(*) from bigtable where SomeUDR(SomeParams) ?

2. Let sacost be the time required to complete the SQL statement.
Какой statement? Все тот же count(*) ... where UDR() ? В чем измерять, в секундах/миллисекундах/... ?

3. Execute and time your function. Let facost be the actual time required to execute the function once.
Опять-таки, в каких единицах измерять? Допустим, я по хайрез-таймеру померяю время одного вычисления, либо посчитаю время 1000 выполнений и поделю это на 1000, но в каких единицах это считать?

Если кто-нибудь в состоянии понять, как это вычисляется, подскажите, плиз.

Или тут п2 и п3 участвуют в дроби, где их единицы измерения должны упраздниться и останется только соотношение, на которое умножается cost, поэтому в п2 и п3 единицы могут быть любые, но - одинаковые? Но тогда получается, что sacost/facost=count, тогда sacost=count*facost, заменяем sacost, получаем secost*facost/(count*facost)=secost/count, т.е. ерунда получается, просто cost, выданный оптимизатором делится на число вызовов UDR. Зачем тогда все эти замеры времени и прочая движуха. Плюс, оптимизатор у каунта с УДР с непроставленной стоимостью ставит мизерный cost, и если его еще поделить на число строк то получается цена=0. Т.е. вся эта инструкция сильно смахивает на бред.

Тестовый каунт, 1840 строк, время выполнения 4.1 секунды, кост в эксплейне=2, следуя этой методике кост процедуры, выполняющейся в среднем 2.2мс равен 0.002 попугая, т.е. 0 ???
2 апр 17, 00:43    [20357648]     Ответить | Цитировать Сообщить модератору
 Re: Как посчитать percall_cost ?  [new]
falcon111
Member

Откуда:
Сообщений: 117
В общем, померял я все UDRки, составил таблицу относительных стоимостей, самой дешевой назначил цену 1000, остальным 1000*коэффициент относительной вычислительно-затратности. Как рассчитать нормальную стоимость оптимизатора не понятно, пока не пойму как - будет хоть так.
3 апр 17, 22:17    [20363095]     Ответить | Цитировать Сообщить модератору
Все форумы / Informix Ответить