powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Частичные индексы
11 сообщений из 11, страница 1 из 1
Частичные индексы
    #34570919
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица, с полем field int8. В данном поле ~0.1% ненулевые. Однако данное поле активно используется в выборках.

Запрос для тестов:
Код: plaintext
explain select * from table where field= 156456 

Был индекс
Код: plaintext
1.
2.
CREATE INDEX "index" ON "public"."table"
  USING btree ("field")
Вот для примера explain
Код: plaintext
1.
2.
->  Index Scan using index on table  (cost= 0 . 00 .. 578 . 27  rows= 8752  width= 293 ) 
       Index Cond: (field =  156456 )     

Решил попробовать создать частичный индекс.
Код: plaintext
1.
CREATE INDEX "index" ON "public"."table"
  USING btree ("field") WHERE field > 0 
Затем был выполнен analyze, после чего ехplain стал таким
Код: plaintext
1.
->  Seq Scan on table    (cost= 0 . 00 .. 1293236 . 65  rows= 8748  width= 303 )                       
       Filter: (pid =  156456 )  
Те индекс не используется совсем.

Меняем запрос для тестов:
Код: plaintext
1.
2.
explain select * from table where field> 0 
->  Index Scan using index on table  (cost= 0 . 00 .. 329 . 23  rows= 4374  width= 303 ) 
               Index Cond: (field>  0 ) 

PG 8.2.4
Это особенность оптимизатора PG или я что-то неправильно сделал?
...
Рейтинг: 0 / 0
Частичные индексы
    #34571077
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChameLe0nЕсть таблица, с полем field int8. В данном поле ~0.1% ненулевые. Однако данное поле активно используется в выборках.

Запрос для тестов:
Код: plaintext
explain select * from table where field= 156456 

Был индекс
Код: plaintext
1.
2.
CREATE INDEX "index" ON "public"."table"
  USING btree ("field")
Вот для примера explain
Код: plaintext
1.
2.
->  Index Scan using index on table  (cost= 0 . 00 .. 578 . 27  rows= 8752  width= 293 ) 
       Index Cond: (field =  156456 )     

Решил попробовать создать частичный индекс.
Код: plaintext
1.
CREATE INDEX "index" ON "public"."table"
  USING btree ("field") WHERE field > 0 
Затем был выполнен analyze, после чего ехplain стал таким
Код: plaintext
1.
->  Seq Scan on table    (cost= 0 . 00 .. 1293236 . 65  rows= 8748  width= 303 )                       
       Filter: (pid =  156456 )  
Те индекс не используется совсем.

Меняем запрос для тестов:
Код: plaintext
1.
2.
explain select * from table where field> 0 
->  Index Scan using index on table  (cost= 0 . 00 .. 329 . 23  rows= 4374  width= 303 ) 
               Index Cond: (field>  0 ) 

PG 8.2.4
Это особенность оптимизатора PG или я что-то неправильно сделал?
Чего-то поля разные в запросах, да и запросы разные. Ясен пень, что в разных запросах ПГ может по-разному решать использовать или не использовать индекс.

ЗЫ Лучше приводить EXPLAINE ANALYZE.
...
Рейтинг: 0 / 0
Частичные индексы
    #34571181
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЧего-то поля разные в запросах, да и запросы разные
Приведено сугубо для примера. Кусок explain привел. Остальное неважно.
...
Рейтинг: 0 / 0
Частичные индексы
    #34571212
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторЯсен пень, что в разных запросах ПГ может по-разному решать использовать
Это очевидно. Также я думаю очевидно что данный частичный индекс подходит для обеих запросов(where field=156456, where field>0). Кривой вариант - попробовать where field>0 and field=<число>
...
Рейтинг: 0 / 0
Частичные индексы
    #34571240
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ChameLe0n
Код: plaintext
       Filter: (pid =  156456 )
Те индекс не используется совсем.Так ведь индекс по полю field, а не pid.
...
Рейтинг: 0 / 0
Частичные индексы
    #34571785
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ChameLe0nПриведено сугубо для примера. Кусок explain привел. Остальное неважно

Ошибся немного....

Код: plaintext
1.
->  Seq Scan on table    (cost= 0 . 00 .. 1293236 . 65  rows= 8748  width= 303 )                       
       Filter: (pid =  156456 ) 

следует читать как

Код: plaintext
1.
->  Seq Scan on table    (cost= 0 . 00 .. 1293236 . 65  rows= 8748  width= 303 )                       
       Filter: (field=  156456 )  
...
Рейтинг: 0 / 0
Частичные индексы
    #34571810
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переделал запрос:
Код: plaintext
explain  select * from only table where field> 0  and field= 156456 

explain:

Код: plaintext
1.
2.
3.
4.
 QUERY PLAN                                                                                  
 ------------------------------------------------------------------------------------------- 
 Index Scan using index on table  (cost= 0 . 00 .. 8 . 27  rows= 1  width= 303 ) 
   Index Cond: ((field>  0 ) AND (field=  156456 ))    
...
Рейтинг: 0 / 0
Частичные индексы
    #34572008
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил, видимо тип констант в предикате индекса должен совпадать с типом соответствующей переменной.

Создавайте так: CREATE INDEX "index" ON "public"."table" USING btree ("field") WHERE field > 0::int8
...
Рейтинг: 0 / 0
Частичные индексы
    #34572684
Vladimir Sitnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeXa NalBatСоздавайте так: CREATE INDEX "index" ON "public"."table" USING btree ("field") WHERE field > 0::int8
А у меня вполне работает такой индекс (на обычных запросах "where field=1234")
Код: plaintext
CREATE INDEX "index" ON "public"."table" USING btree ("field") WHERE field is not null
Может, стоит более ясно излагать базе то, что мы от неё хотим?
...
Рейтинг: 0 / 0
Частичные индексы
    #34572951
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Vladimir SitnikovА у меня вполне работает такой индекс ... WHERE field is not nullУ меня тоже "field::int8 is not null" работает, а "field::int8>0" не работает, при этом "field::int8>0::int8" работает.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
create table t_test ( id bigint, name text );
set enable_seqscan to off;
set enable_bitmapscan to off;

create index i_test_1 on t_test ( id ) where id is not null;
explain select * from t_test where id= 3 ;
drop index i_test_1;

create index i_test_2 on t_test ( id ) where id> 0 ;
explain select * from t_test where id= 3 ;
drop index i_test_2;

create index i_test_3 on t_test ( id ) where id> 0 ::bigint;
explain select * from t_test where id= 3 ;
drop index i_test_3;

drop table t_test;
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
CREATE TABLE
SET
SET
CREATE INDEX
                               QUERY PLAN
-------------------------------------------------------------------------
 Index Scan using i_test_1 on t_test  (cost= 0 . 00 .. 17 . 05  rows= 6  width= 40 )
   Index Cond: (id =  3 )
( 2  rows)

DROP INDEX
CREATE INDEX
                              QUERY PLAN
-----------------------------------------------------------------------
 Seq Scan on t_test  (cost= 100000000 . 00 .. 100000023 . 75  rows= 6  width= 40 )
   Filter: (id =  3 )
( 2  rows)

DROP INDEX
CREATE INDEX
                               QUERY PLAN
------------------------------------------------------------------------
 Index Scan using i_test_3 on t_test  (cost= 0 . 00 .. 8 . 30  rows= 6  width= 40 )
   Index Cond: (id =  3 )
( 2  rows)

DROP INDEX
DROP TABLE

Vladimir SitnikovМожет, стоит более ясно излагать базе то, что мы от неё хотим?Нет, лучше пусть постгрес сам научится наконец-то преобразовывать типы... не только корректно, но и оптимально с т.з. производительности.
...
Рейтинг: 0 / 0
Частичные индексы
    #34574004
ChameLe0n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про
Код: plaintext
field::int8 is not null
Вообще не идет речи, так как в этой колонке нет значении NULL

LeXa NalBatНет, лучше пусть постгрес сам научится наконец-то преобразовывать типы... не только корректно, но и оптимально с т.з. производительности.
Согласен с LeXa. Думал эта болезнь у PG излечилась в 8 версии.

LeXa NalBatСоздавайте так: CREATE INDEX "index" ON "public"."table" USING btree ("field") WHERE field > 0::int8
Помогло, благодарю за помощь.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Частичные индексы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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