powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / 2 условия во WHERE - если вместе, то тормозят, а по отдельности - нет
5 сообщений из 5, страница 1 из 1
2 условия во WHERE - если вместе, то тормозят, а по отдельности - нет
    #40039488
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот 2 запроса:
Код: sql
1.
2.
3.
WHERE t1.closed IS NULL
    AND t1.expire < (now() - '12 hours'::interval)
LIMIT 500


по отдельности выдают так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
                                                        QUERY PLAN                                                        
--------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..1618.85 rows=500 width=8) (actual time=0.116..0.678 rows=500 loops=1)
   ->  Seq Scan on tasks_clients t1  (cost=0.00..59058.84 rows=18241 width=8) (actual time=0.115..0.628 rows=500 loops=1)
         Filter: (closed IS NULL)
         Rows Removed by Filter: 933
 Planning Time: 0.126 ms
 Execution Time: 0.722 ms
(6 строк)

Время: 1,407 мс



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
                                                         QUERY PLAN                                                         
----------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..28.05 rows=500 width=8) (actual time=0.011..0.298 rows=500 loops=1)
   ->  Seq Scan on tasks_clients t1  (cost=0.00..68261.22 rows=1216770 width=8) (actual time=0.010..0.249 rows=500 loops=1)
         Filter: (expire < (now() - '12:00:00'::interval))
         Rows Removed by Filter: 279
 Planning Time: 0.171 ms
 Execution Time: 0.355 ms
(6 строк)


А вместе вот так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
                                                         QUERY PLAN                                                         
----------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=0.00..1886.82 rows=500 width=8) (actual time=0.154..789.843 rows=271 loops=1)
   ->  Seq Scan on tasks_clients t1  (cost=0.00..68261.22 rows=18089 width=8) (actual time=0.153..789.777 rows=271 loops=1)
         Filter: ((closed IS NULL) AND (expire < (now() - '12:00:00'::interval)))
         Rows Removed by Filter: 1226713
 Planning Time: 0.277 ms
 Execution Time: 789.904 ms
(6 строк)


отсеивается 1.2 миллиона строк, растут ms...
Потому что он не может найти 500 строк и бежит по всей таблице...
Я пробовал в начало WHERE подсунуть:
Код: sql
1.
t1.added > (now() - '1 mon'::interval)


но эффекта 0 (а вот это странно)
что ещё можно сделать?
...
Рейтинг: 0 / 0
2 условия во WHERE - если вместе, то тормозят, а по отдельности - нет
    #40039490
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78,

проще всего добавить индекс

on (expire) where closed IS NULL;



--
Maxim Boguk
лучшая поддержка PostgreSQL: dataegret.ru
...
Рейтинг: 0 / 0
2 условия во WHERE - если вместе, то тормозят, а по отдельности - нет
    #40039512
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чё так можно было?
не, быстрее не стало...
индекс на expire и closed уже есть, ничего не изменилось (
что примечательно, он и БЕЗ индекса на expire также работает...

а почему сужение added то не работает?
...
Рейтинг: 0 / 0
2 условия во WHERE - если вместе, то тормозят, а по отдельности - нет
    #40039514
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tip78
а чё так можно было?
не, быстрее не стало...
индекс на expire и closed уже есть, ничего не изменилось (
что примечательно, он и БЕЗ индекса на expire также работает...

а почему сужение added то не работает?


рекомендую прикладывать созданный индекс (полную команду создания)
и explain результаты

и еще покажите
explain analyze select from ваша таблица WHERE t1.closed IS NULL
AND t1.expire < (now() - '12 hours'::interval)
;

без лимита
...
Рейтинг: 0 / 0
2 условия во WHERE - если вместе, то тормозят, а по отдельности - нет
    #40039516
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сработало!
надо было не added, а expire
и индекс такой:
Код: sql
1.
create index on tasks_clients (expire) where closed IS NULL;


а с обычным индексом на expire НЕ работает...
спасибо!
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / 2 условия во WHERE - если вместе, то тормозят, а по отдельности - нет
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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