Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Частичные индексы / 11 сообщений из 11, страница 1 из 1
04.06.2007, 06:32
    #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
04.06.2007, 09:32
    #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
04.06.2007, 10:16
    #34571181
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичные индексы
авторЧего-то поля разные в запросах, да и запросы разные
Приведено сугубо для примера. Кусок explain привел. Остальное неважно.
...
Рейтинг: 0 / 0
04.06.2007, 10:28
    #34571212
ChameLe0n
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичные индексы
авторЯсен пень, что в разных запросах ПГ может по-разному решать использовать
Это очевидно. Также я думаю очевидно что данный частичный индекс подходит для обеих запросов(where field=156456, where field>0). Кривой вариант - попробовать where field>0 and field=<число>
...
Рейтинг: 0 / 0
04.06.2007, 10:38
    #34571240
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичные индексы
ChameLe0n
Код: plaintext
       Filter: (pid =  156456 )
Те индекс не используется совсем.Так ведь индекс по полю field, а не pid.
...
Рейтинг: 0 / 0
04.06.2007, 12:56
    #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
04.06.2007, 13:04
    #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
04.06.2007, 13:48
    #34572008
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Частичные индексы
Проверил, видимо тип констант в предикате индекса должен совпадать с типом соответствующей переменной.

Создавайте так: CREATE INDEX "index" ON "public"."table" USING btree ("field") WHERE field > 0::int8
...
Рейтинг: 0 / 0
04.06.2007, 16:16
    #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
04.06.2007, 17:20
    #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
05.06.2007, 08:48
    #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
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Частичные индексы / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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