powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос в ф-ии стал на порядок медленнее...
9 сообщений из 9, страница 1 из 1
Запрос в ф-ии стал на порядок медленнее...
    #34229190
bubucha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помещаю запрос внутрь функции, в результате 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.
CREATE OR REPLACE FUNCTION public.trn_test(timestamp,timestamp) RETURNS SETOF public.tbl_test_p AS
$BODY$

SELECT a.*
FROM public.tbl_test a

INNER JOIN (SELECT aa.id_object
FROM public.tbl_test aa 
WHERE aa.datetime BETWEEN $ 1  AND $ 2 
and aa.enter='T' group by aa.id_object
HAVING count(*)> 1 ) m ON
m.id_object = a.id_object

-- создается впечатление, что тут индексы не пользуюся, или что-то с типати
--я сделал не так, ибо если вместо $1 и $2 прописать '2005-08-01' '2005-09-01', то
--все становится ок.
WHERE a.datetime  BETWEEN $ 1  AND $ 2  AND a.volume> 1 

$BODY$
LANGUAGE 'sql' VOLATILE;
Сама таблица:
Код: plaintext
1.
2.
3.
4.
 datetime timestamp NOT NULL,
 idobject int4 NOT NULL,
 enter char( 1 ) NOT NULL,
 volume float4 NOT NULL,

таблица tbl_test – 1822471 записей
вложенный селект возвращает 446 записей
сам запрос возвращает 4506 записей
индексы по id_object , enter и datetime
Все это под win xp + postgresql 8.1

Если WHERE a.datetime заменить на WHERE a.datetime +’0’ ,
то время выполнения функции становится нормальным (как и отдельного селекта)

Собственно хотелось бы понять, это легальный способ оживления ф-ии?
...
Рейтинг: 0 / 0
Запрос в ф-ии стал на порядок медленнее...
    #34229770
Funny_Falcon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто функции компилят план выполнения до подстановки параметров (как и prepare), поэтому не всегда выбирается оптимальный план.
Я в таких случаях использую внутри процедуры execute (и полностью конструирую запрос), либо вообще отказываюсь от процедур.
Селяви.
...
Рейтинг: 0 / 0
Запрос в ф-ии стал на порядок медленнее...
    #34229809
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bubucha-- создается впечатление, что тут индексы не пользуюся, или что-то с типати
--я сделал не так, ибо если вместо $1 и $2 прописать '2005-08-01' '2005-09-01', то
--все становится ок.Просто постгрес выбирает другой план выполнения запроса.

bubuchaЕсли WHERE a.datetime заменить на WHERE a.datetime +’0’ ,
то время выполнения функции становится нормальным (как и отдельного селекта)

Собственно хотелось бы понять, это легальный способ оживления ф-ии?Такой способ имхо кажется некрасивым.

Любой способ запинывания планов средствами sql не дает 100% гарантию, что сейчас и в будущем при любых данных будет использоваться требуемый план. :-( Для этого субд могла БЫ предоставить программистам писать не на sql, а на "plan". :-) В постгресе этого нет.
...
Рейтинг: 0 / 0
Запрос в ф-ии стал на порядок медленнее...
    #34229943
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bubucha
Код: plaintext
1.
2.
3.
4.
SELECT aa.id_object
FROM public.tbl_test aa 
WHERE aa.datetime BETWEEN $ 1  AND $ 2 
and aa.enter='T'
Сама таблица:
Код: plaintext
1.
2.
3.
4.
 datetime timestamp NOT NULL,
 idobject int4 NOT NULL,
 enter char( 1 ) NOT NULL,
 volume float4 NOT NULL,
таблица tbl_test – 1822471 записей
вложенный селект возвращает 446 записей
сам запрос возвращает 4506 записей
индексы по id_object , enter и datetime

напрашивается либо составной индекс:
(enter,datetime[,idobject])
либо условный
(datetime[,idobject]) WHERE enter = 'T';

- в зависимости от прочей кухни. - Если всегда (за редкими исключениями) интересуемся только WHERE enter = 'T';, то условный - он поменьше должен быть. Если по разному - то составной.

При этом индекс просто по enter можно и прибить (сдается - он низкоселективен).
Да, и если никогда не фильтруем только по datetime, а всегда с условием по enter =...- то можно прибить и индекс просто по datetime.
...
Рейтинг: 0 / 0
Запрос в ф-ии стал на порядок медленнее...
    #34230796
bubucha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Funny_FalconПросто функции компилят план выполнения до подстановки параметров (как и prepare), поэтому не всегда выбирается оптимальный план.

Т.е. это и есть причина разного поведения отдельностоящего селекта и селекта InSide функции.
LeXa NalBatТакой способ имхо кажется некрасивым.
Угу... возможно, что такое поведение ф-ии, говорит о необходимости поменять чень в консерватории (переписать запрос, пересмотреть индексы...), что в принципе и подтвердает 4321
4321напрашивается либо составной индекс:
Да, именно так и есть, при составном индексе datatime,idobject , все встает на свои места и пропадает необходимость помогать планировщику. Видимо буду смотреть в эту сторону.

Спасибо всем большое за помощь!
...
Рейтинг: 0 / 0
Запрос в ф-ии стал на порядок медленнее...
    #34232179
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bubucha Да, именно так и есть, при составном индексе datatime,idobject , все встает на свои места и пропадает необходимость помогать планировщику.

зы, посмотрев вот на это,
bubuchaЕсли WHERE a.datetime заменить на WHERE a.datetime +’0’ ,
то время выполнения функции становится нормальным (как и отдельного селекта)можно предположить, что по датам у вас в запросе селективность не большая (почти все записи (т.е. от ~20%) попадают в задаваемый диапазон дат, и запрет хранимке (+0) на использование именно этого индекса приводит ее в чувство).
тогда мое предположение о низкой селективности индекса по enter таки не верно. (т.к. общее действие фильтра довольно сильно, по вашим утверждениям усекает набор)
было бы понятнее, если бы был приведен результат EXPLAIN ANALYZE (для запроса, ес-но, а не для хранимки - бо последнее пока невозможно).
(таки напрашивается индекс именно по (enter,datetime[,idobject]), и именно в такой последовательности.



кстати, на чем пишем морду? (если на аксе - интересен способ раздачи прав по..., ибо акс с т.з. количества нерулимых коннектов - песня)
...
Рейтинг: 0 / 0
Запрос в ф-ии стал на порядок медленнее...
    #34232707
bubucha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 4321
Приведенный мною пример запроса и функции сильно урезан, дабы разобратся с непоняткой в разном подходе планировщика к селекту и функции. Сама табла содержит еще пяток полей, а реальный запрос - это еще пяток join-ов к разным таблам. Предположительно сам запрос - редко выполняемый (т.е. вялый сбор статистики, неспешными товарищами). Звиняюсь, что ввел в заблуждение не вполе корректной постановкой вопроса, ибо был зациклен именно на тормозе ф-ии.
Соответственно индексы стоят на всех полях, по которым либо отбор, либо join. (т.е. отдельные индексы по каждому полю, а не составные).
Попробовал на реальных данных - наилучший результат достигается при убиении индекса по idobject :-\ (при одинаковых исходных условиях)... по этому, я решил пока отложить пляски с индексами, до окончательного определения со структурой и ваяния основных рабочих запросов
авторкстати, на чем пишем морду? (если на аксе - интересен способ раздачи прав по..., ибо акс с т.з. количества нерулимых коннектов - песня)
прототип скорее всего аккесс, окончательный вариан - фиг знает, скорее всего дельфи, но есть мысль попробовать perl+tk (хотя второе может и безумие)

Спасибо за участие.
...
Рейтинг: 0 / 0
Запрос в ф-ии стал на порядок медленнее...
    #34232777
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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-у, если понадобится.
Извините за назойливость


ЗЫ. я пока занимаюсь перелицовывание чисто мдб-ных прилад. Проблема в том, что мне нужна позаписное ограничение доступа (по текущей "роли", выбранной юзером, а не по юзеру), а акс сам открывает свои коннекты (если пользовать обычную его работу - т.е. слегка подновить старые прилады). Как-то ассоциировать юзера с выбранной им в _другом_коннекте_ ролью - затруднительно. А заставлять его помнить различные "ролевые" логины и пароли - имхо - извращение.
Т.ч. пока разделением ролевой видимости занимается прилада (она помнит выбранную роль). Но, думаю, это не совсем верно. (хотя по юзеру я и могу усечь видимость еще на сервере дополнительно сам - вьюхами)
...
Рейтинг: 0 / 0
Запрос в ф-ии стал на порядок медленнее...
    #34232849
tadmin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4321ЗЫ. я пока занимаюсь перелицовывание чисто мдб-ных прилад. Проблема в том, что мне нужна позаписное ограничение доступа (по текущей "роли", выбранной юзером, а не по юзеру), а акс сам открывает свои коннекты (если пользовать обычную его работу - т.е. слегка подновить старые прилады).
оч. интересно!
Правда не про роли и права, а вобще про "перелицовывание чисто мдб-ных прилад".
Не поделитесь ли ссылками на тему "pg & ms access", выходящие за рамки документации из поставки ODBC?
Есть множество нерешенных вопросов, к котоым и подступиться неясно как.
Например:
- как можно (если вообще можно) работать с ХП, возвращающими refcursor?
- отдача всех данных (вместо первых n записей) через Refcursor - это свойство ODBC или моя ошибка?
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос в ф-ии стал на порядок медленнее...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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