powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
8 сообщений из 8, страница 1 из 1
Помогите оптимизировать запрос
    #33312387
Spider84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Удалось таки мне запустить функцию. Теперь очень интересует вопрос её оптимизации по скорости.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
do_delete alias for $ 1 ;
now_day timestamp;
csess cake.session;
ugraph cake.user_graph;
begin
 -- текуйщий день
 now_day = CURRENT_DATE;

 --закрытые сессии
 select into csess * from session where s_end is not null;
 for ugraph in SELECT u.login,extract(epoch from k.kdatetime),k.diff_in,k.diff_out FROM keepalive k, users u, session s WHERE k.id_session in (select id from session where s_end is not null) and s.id_user=u.id and k.kdatetime<now_day order by u.login,k.kdatetime 
loop
 return next ugraph;
end loop;
return ugraph;
end

Можно как-то ускорить это дело?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #33312415
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Spider84Удалось таки мне запустить функцию. Теперь очень интересует вопрос её оптимизации по скорости.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
declare
do_delete alias for $ 1 ;
now_day timestamp;
csess cake.session;
ugraph cake.user_graph;
begin
 -- текуйщий день
 now_day = CURRENT_DATE;

 --закрытые сессии
 select into csess * from session where s_end is not null;
 for ugraph in SELECT u.login,extract(epoch from k.kdatetime),k.diff_in,k.diff_out FROM keepalive k, users u, session s WHERE k.id_session in (select id from session where s_end is not null) and s.id_user=u.id and k.kdatetime<now_day order by u.login,k.kdatetime 
loop
 return next ugraph;
end loop;
return ugraph;
end

Можно как-то ускорить это дело?

А на сколько это надо ускорить?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #33312566
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще то лучшн на joinы пеервести запрос.. и избавится от in (select...), индексы там построить если нет и т.д.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #33312570
msa@n-e.ru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wbearвообще то лучшн на joinы пеервести запрос.. и избавится от in (select...), индексы там построить если нет и т.д.

А зачем от in (select...) избавляться?
Индекс построить и написать

WHERE k.id_session in (select id from session where session.id = k.id_session and s_end is not null)
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #33312830
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как раз Postgres знаменит тем, что на вложенных селектах тормозит. Join'ы у него на порядок быстрее.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #33312888
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тормозил он не на "вложенных селектах", а конкретно на WHERE ... IN (SELECT ...), но это уже в версии 7.4 поправили.
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #33313148
Spider84
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
SELECT u.login,extract(epoch from k.kdatetime),k.diff_in,k.diff_out FROM keepalive k LEFT JOIN session s ON s.id=k.id_session LEFT JOIN users u ON s.id_user=u.id WHERE s.s_end is not null and k.kdatetime<now_day order by u.login,k.kdatetime 

так правильно?
...
Рейтинг: 0 / 0
Помогите оптимизировать запрос
    #33313336
FishingIsGood
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Spider84так правильно?

А почему не просто в лоб? Зачем там нужен "LEFT..."?

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT u.login,extract(epoch from k.kdatetime),k.diff_in,k.diff_out
FROM keepalive k, users u, session s, session s1
WHERE k.id_session in = s1.id
and s1.s_end is not null
and s.id_user = u.id
and k.kdatetime < now_day
order by u.login, k.kdatetime

Могу, конечно, что то упустить, т.к. "невнимательность" - это мое второе имя...

Sad SpiritТормозил он не на "вложенных селектах", а конкретно на WHERE ... IN (SELECT ...), но это уже в версии 7.4 поправили.

Ну будем считать, что я запутался в терминологии. До 7.4 он на "in (select..." тормозил безбожно, а сейчас (8.0) подтормаживает немножко. До сих пор заметное количество запросов переписанных из "in (select..." в "exists(select..." работают быстрее. А join'ы в PostgreSQL - произведение искусства. Кстати, было бы интересно услышать от товарища Spider84 результаты тестов - из моего опыта похожие запросы переписанные на join'y именно на PostgreSQL работают заметно быстрее, но я, как и все смертные, могу ошибаться.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Помогите оптимизировать запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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