Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
Помещаю запрос внутрь функции, в результате select * from функция(‘параметр1’, ‘параметр2’) возвращает записи на порядок медленнее, чем отдельно взятый select с прописанными параметрами внутри-примерно 13 с вместо 1,6 с. Схожая ситуация осуждалась тут но не дообсудилась... Собственно сама функция: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Код: plaintext 1. 2. 3. 4. таблица tbl_test – 1822471 записей вложенный селект возвращает 446 записей сам запрос возвращает 4506 записей индексы по id_object , enter и datetime Все это под win xp + postgresql 8.1 Если WHERE a.datetime заменить на WHERE a.datetime +’0’ , то время выполнения функции становится нормальным (как и отдельного селекта) Собственно хотелось бы понять, это легальный способ оживления ф-ии? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2006, 22:29 |
|
||
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
Просто функции компилят план выполнения до подстановки параметров (как и prepare), поэтому не всегда выбирается оптимальный план. Я в таких случаях использую внутри процедуры execute (и полностью конструирую запрос), либо вообще отказываюсь от процедур. Селяви. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 10:55 |
|
||
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
bubucha-- создается впечатление, что тут индексы не пользуюся, или что-то с типати --я сделал не так, ибо если вместо $1 и $2 прописать '2005-08-01' '2005-09-01', то --все становится ок.Просто постгрес выбирает другой план выполнения запроса. bubuchaЕсли WHERE a.datetime заменить на WHERE a.datetime +’0’ , то время выполнения функции становится нормальным (как и отдельного селекта) Собственно хотелось бы понять, это легальный способ оживления ф-ии?Такой способ имхо кажется некрасивым. Любой способ запинывания планов средствами sql не дает 100% гарантию, что сейчас и в будущем при любых данных будет использоваться требуемый план. :-( Для этого субд могла БЫ предоставить программистам писать не на sql, а на "plan". :-) В постгресе этого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 11:03 |
|
||
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
bubucha Код: plaintext 1. 2. 3. 4. Код: plaintext 1. 2. 3. 4. вложенный селект возвращает 446 записей сам запрос возвращает 4506 записей индексы по id_object , enter и datetime напрашивается либо составной индекс: (enter,datetime[,idobject]) либо условный (datetime[,idobject]) WHERE enter = 'T'; - в зависимости от прочей кухни. - Если всегда (за редкими исключениями) интересуемся только WHERE enter = 'T';, то условный - он поменьше должен быть. Если по разному - то составной. При этом индекс просто по enter можно и прибить (сдается - он низкоселективен). Да, и если никогда не фильтруем только по datetime, а всегда с условием по enter =...- то можно прибить и индекс просто по datetime. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 11:33 |
|
||
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
Funny_FalconПросто функции компилят план выполнения до подстановки параметров (как и prepare), поэтому не всегда выбирается оптимальный план. Т.е. это и есть причина разного поведения отдельностоящего селекта и селекта InSide функции. LeXa NalBatТакой способ имхо кажется некрасивым. Угу... возможно, что такое поведение ф-ии, говорит о необходимости поменять чень в консерватории (переписать запрос, пересмотреть индексы...), что в принципе и подтвердает 4321 4321напрашивается либо составной индекс: Да, именно так и есть, при составном индексе datatime,idobject , все встает на свои места и пропадает необходимость помогать планировщику. Видимо буду смотреть в эту сторону. Спасибо всем большое за помощь! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2006, 15:25 |
|
||
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
bubucha Да, именно так и есть, при составном индексе datatime,idobject , все встает на свои места и пропадает необходимость помогать планировщику. зы, посмотрев вот на это, bubuchaЕсли WHERE a.datetime заменить на WHERE a.datetime +’0’ , то время выполнения функции становится нормальным (как и отдельного селекта)можно предположить, что по датам у вас в запросе селективность не большая (почти все записи (т.е. от ~20%) попадают в задаваемый диапазон дат, и запрет хранимке (+0) на использование именно этого индекса приводит ее в чувство). тогда мое предположение о низкой селективности индекса по enter таки не верно. (т.к. общее действие фильтра довольно сильно, по вашим утверждениям усекает набор) было бы понятнее, если бы был приведен результат EXPLAIN ANALYZE (для запроса, ес-но, а не для хранимки - бо последнее пока невозможно). (таки напрашивается индекс именно по (enter,datetime[,idobject]), и именно в такой последовательности. кстати, на чем пишем морду? (если на аксе - интересен способ раздачи прав по..., ибо акс с т.з. количества нерулимых коннектов - песня) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 10:51 |
|
||
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
2 4321 Приведенный мною пример запроса и функции сильно урезан, дабы разобратся с непоняткой в разном подходе планировщика к селекту и функции. Сама табла содержит еще пяток полей, а реальный запрос - это еще пяток join-ов к разным таблам. Предположительно сам запрос - редко выполняемый (т.е. вялый сбор статистики, неспешными товарищами). Звиняюсь, что ввел в заблуждение не вполе корректной постановкой вопроса, ибо был зациклен именно на тормозе ф-ии. Соответственно индексы стоят на всех полях, по которым либо отбор, либо join. (т.е. отдельные индексы по каждому полю, а не составные). Попробовал на реальных данных - наилучший результат достигается при убиении индекса по idobject :-\ (при одинаковых исходных условиях)... по этому, я решил пока отложить пляски с индексами, до окончательного определения со структурой и ваяния основных рабочих запросов авторкстати, на чем пишем морду? (если на аксе - интересен способ раздачи прав по..., ибо акс с т.з. количества нерулимых коннектов - песня) прототип скорее всего аккесс, окончательный вариан - фиг знает, скорее всего дельфи, но есть мысль попробовать perl+tk (хотя второе может и безумие) Спасибо за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 13:46 |
|
||
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
bubucha Соответственно индексы стоят на всех полях, по которым либо отбор, либо join. (т.е. отдельные индексы по каждому полю, а не составные).1. использование 2-х индексов одной таблицы (одного ее вхождения) в одном запросе - дело затратное (а для пг еще и сравнительно новое - с 8.0), так, чтаа... Если вы сами бегали по индексам (в том же аксе - Seek-ами), то должны представлять возможность оптимизатора поюзать тот или иной индекс при запросе с фильтрацией по нескольким полям. если запросы распределены (по частоте) по фильтрам скажем так: WHERE enter='что-нть' AND ....все что угодно - чаще всего WHERE enter='что-нть' AND datetime Betwenn ... + все что угодно - тоже часто, или чуть пореже ... и т.п. - то и индекс нужен по (enter,datetime[,]) - так как он будет в большинстве случаев использован и для тех и для других. т.е. в случае 2-х полей два сложных индекса (перестановочные по полям) в общем случае предпочтительнее 2х индексов по каждому из полей. (надо смотреть по задаче). конечно для большого числа полей это все не совсем так просто (т.к. число перестановок растет очень быстро, но все они и не нужны - есть типовые запросы задачи). срубить индекс по object_id - плохо, т.к. он скорее всего у вас в FK, ПОсему нужно сделать хотя бы один индекс по (object_id[,]) - для быстрого джойна вашей записи к object-у, если понадобится. Извините за назойливость ЗЫ. я пока занимаюсь перелицовывание чисто мдб-ных прилад. Проблема в том, что мне нужна позаписное ограничение доступа (по текущей "роли", выбранной юзером, а не по юзеру), а акс сам открывает свои коннекты (если пользовать обычную его работу - т.е. слегка подновить старые прилады). Как-то ассоциировать юзера с выбранной им в _другом_коннекте_ ролью - затруднительно. А заставлять его помнить различные "ролевые" логины и пароли - имхо - извращение. Т.ч. пока разделением ролевой видимости занимается прилада (она помнит выбранную роль). Но, думаю, это не совсем верно. (хотя по юзеру я и могу усечь видимость еще на сервере дополнительно сам - вьюхами) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 14:12 |
|
||
|
Запрос в ф-ии стал на порядок медленнее...
|
|||
|---|---|---|---|
|
#18+
4321ЗЫ. я пока занимаюсь перелицовывание чисто мдб-ных прилад. Проблема в том, что мне нужна позаписное ограничение доступа (по текущей "роли", выбранной юзером, а не по юзеру), а акс сам открывает свои коннекты (если пользовать обычную его работу - т.е. слегка подновить старые прилады). оч. интересно! Правда не про роли и права, а вобще про "перелицовывание чисто мдб-ных прилад". Не поделитесь ли ссылками на тему "pg & ms access", выходящие за рамки документации из поставки ODBC? Есть множество нерешенных вопросов, к котоым и подступиться неясно как. Например: - как можно (если вообще можно) работать с ХП, возвращающими refcursor? - отдача всех данных (вместо первых n записей) через Refcursor - это свойство ODBC или моя ошибка? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2006, 14:42 |
|
||
|
|

start [/forum/topic.php?fid=53&gotonew=1&tid=2005833]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
60ms |
get topic data: |
12ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 253ms |
| total: | 432ms |

| 0 / 0 |
