powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подскажите как победить != в запросе...
6 сообщений из 6, страница 1 из 1
Подскажите как победить != в запросе...
    #32965536
greeka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такие запросы:
Запрос №1
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
set enable_seqscan=false;
explain
SELECT * from bb_forums as mm
where mm.forum_id  >  2000070 

Index Scan using bb_forums_pkey on bb_forums mm  (cost= 0 . 00 .. 6 . 10  rows= 1  width= 123 )
   Index Cond: (forum_id >  2000070 )


Запрос №2
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
set enable_seqscan=false;
explain
SELECT * from bb_forums as mm
where mm.forum_id  !=  2000070 

Seq Scan on bb_forums mm  (cost= 100000000 . 00 .. 100000003 . 04  rows= 82  width= 123 )
   Filter: (forum_id <>  2000070 )

...
Рейтинг: 0 / 0
Подскажите как победить != в запросе...
    #32965555
greeka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос №3

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
set enable_seqscan=false;
explain
 SELECT * from member as mm
 where mm.member_ >  2000070 ::bigint or mm.member_ <  2000070 ::bigint

Index Scan using member_pkey, member_pkey on member mm  (cost= 0 . 00 .. 123 . 46  rows= 64  width= 672 )
   Index Cond: ((member_ >  2000070 ::bigint) OR (member_ <  2000070 ::bigint))

Скажите плиз, в чем причина, того, что выброка в запросе №1 и №3 идет по индексу, а в №2 по Seq Scan...

Запрос вида:
Код: plaintext
1.
2.
3.
4.
set enable_seqscan=false;
explain
SELECT * from bb_forums as mm
where mm.forum_id  <>  2000070 

Вернет:
Код: plaintext
1.
2.
Seq Scan on bb_forums mm  
  Filter: (forum_id <>  2000070 )
...
Рейтинг: 0 / 0
Подскажите как победить != в запросе...
    #32965616
greeka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
 set enable_seqscan=false;
explain
SELECT * from bb_forums as mm
where mm.forum_id  <  2000070  or mm.forum_id> 2000070 

Index Scan using bb_forums_pkey, forum_id_bb_forums_index on bb_forums mm  (cost= 0 . 00 .. 162 . 12  rows= 83  width= 123 )
   Index Cond: ((forum_id <  2000070 ) OR (forum_id >  2000070 ))
( 2  rows)
...
Рейтинг: 0 / 0
Подскажите как победить != в запросе...
    #32966122
4321
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по моему все правильно - выбираются почти все записи - т.е. таблица будет считана практически вся. Зачем тратить время на чтение и индексов?


вот к примеру:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
explain

SELECT *  FROM  main WHERE m_id >  160 ::int4;

QUERY PLAN
Seq Scan on main  (cost= 0 . 00 .. 22 . 80  rows= 1024  width= 14 )
  Filter: (m_id >  160 )
________
explain

SELECT *  FROM  main WHERE m_id >  1601 ::int4;

QUERY PLAN
Index Scan using m_id_i on main  (cost= 0 . 00 .. 5 . 30  rows= 1  width= 14 )
  Index Cond: (m_id >  1601 )
(на моих тестовых данных переход на Index Scan происходит на ~m_id > 230)
...
Рейтинг: 0 / 0
Подскажите как победить != в запросе...
    #32966376
greeka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
4321по моему все правильно - выбираются почти все записи - т.е. таблица будет считана практически вся. Зачем тратить время на чтение и индексов?


А set enable_seqscan=false; что, ничего не значит?...
Суть не в том, как она будет читаться, а в том, что если выборка идет по != то индексы не используются , а если через <> то тогда все нормально...
...
Рейтинг: 0 / 0
Подскажите как победить != в запросе...
    #32966785
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
set enable_seqscan=false;
это:
если стоит вопрос у планера использовать индекс или секскан то в случае set enable_seqscan=false; секскан отсекается.
на операцию "не равно" (!= и <> )индекс не используется(видимо по он отсекается планером в самом начале по причинам которые описал 4321 ), при этом f<n or f>n оно определяет как 2 операции (меньше и больше) соответственно юзает индекс.

это из той же серии что и in (select ...) vs join..on

побеждать это ненадо..т.к в большенстве случаев в запросе с != использование индекса будет медленнее секскана..
посмотри тоже самое с explain analyze
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Подскажите как победить != в запросе...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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