powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как заставить PG использовать индекс при условии с оператором ~~ ?
7 сообщений из 7, страница 1 из 1
Как заставить PG использовать индекс при условии с оператором ~~ ?
    #32988053
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица с индексом:
create table mytable (charfield char(20) not null);
create index mtchf on mytable (charfield);
В таблице сейчас около 10K записей.

Вопрос.
Почему запрос типа
select * from mytable where charfield ~~ '300%'
который возвращает все записи, начинающиеся на 300 не использует индекс,
Seq Scan on mytable (cost=0.00..562.64 rows=34 width=383)
Filter: (charfield ~~ '300%'::text)

а запрос
select * from mytable where charfield = '30012'
индекс использует ?
Index Scan using mtchf on mytable (cost=0.00..133.25 rows=34 width=383)
Index Cond: (charfield = '30012'::bpchar)


В чем я ошибся ? Нужно было индекс другого типа применить или вместо ~~ написать другой какой-то оператор ?
...
Рейтинг: 0 / 0
Как заставить PG использовать индекс при условии с оператором ~~ ?
    #32988111
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Как заставить PG использовать индекс при условии с оператором ~~ ?
    #32988192
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо !
Надо было написать
create index mtchf on mytable (charfield bpchar_pattern_ops);
...
Рейтинг: 0 / 0
Как заставить PG использовать индекс при условии с оператором ~~ ?
    #32994367
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема 1.
Если вместо оператора ~~ использовать =, то индекс с таким паттерном уже не используется. Т.е. для таблицы приходится строить 2 индекса для условий с ~~ и =. Что не есть хорошо :-(

Проблема 2.
Что делать, если в таблице два поля типа charfield, например, charfield1, charfield2. А условие должно звучать
where charfield1 ~~ '301%' or charfield2 ~~ '303%'
Все - при таком условии индексы не используются ни в какую.
Хоть создать составной индекс по charfield1, charfield2, хоть пару индексов по обеим полям, хоть все три. И что делать ?
...
Рейтинг: 0 / 0
Как заставить PG использовать индекс при условии с оператором ~~ ?
    #32995037
фффф
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
strizh
Проблема 2.
Что делать, если в таблице два поля типа charfield, например, charfield1, charfield2. А условие должно звучать
where charfield1 ~~ '301%' or charfield2 ~~ '303%'
Все - при таком условии индексы не используются ни в какую.
Хоть создать составной индекс по charfield1, charfield2, хоть пару индексов по обеим полям, хоть все три. И что делать ?
Скорее всего разбиение запроса на два с UNION поможет:
Код: plaintext
1.
2.
3.
select * from ... where charfield1 ~~ '301%' 
UNION [ALL]
select * from ... where charfield2 ~~ '303%'
...
Рейтинг: 0 / 0
Как заставить PG использовать индекс при условии с оператором ~~ ?
    #32996097
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
strizhПроблема 2.
Что делать, если в таблице два поля типа charfield, например, charfield1, charfield2. А условие должно звучать
where charfield1 ~~ '301%' or charfield2 ~~ '303%'
Все - при таком условии индексы не используются ни в какую.
Хоть создать составной индекс по charfield1, charfield2, хоть пару индексов по обеим полям, хоть все три. И что делать ?Индексы используются!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
=> create table t1 ( f1 text, f2 text );
CREATE TABLE
=> create index i11 on t1 ( f1 );
CREATE INDEX
=> create index i12 on t1 ( f1 varchar_pattern_ops );
CREATE INDEX
=> create index i21 on t1 ( f2 );
CREATE INDEX
=> create index i22 on t1 ( f2 varchar_pattern_ops );
CREATE INDEX
=> set enable_seqscan to off;
SET
=> explain select * from t1 where f1 like 'foo%' or f2 like 'bar%';
                                                                                QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Index Scan using i12, i22 on t1  (cost= 0 . 00 .. 7 . 37  rows= 1  width= 64 )
   Index Cond: (((f1 ~>=~ 'foo'::character varying) AND (f1 ~<~ 'fop'::character varying)) OR ((f2 ~>=~ 'bar'::character varying) AND (f2 ~<~ 'bas'::character varying)))
   Filter: ((f1 ~~ 'foo%'::text) OR (f2 ~~ 'bar%'::text))
( 3  rows)
...
Рейтинг: 0 / 0
Как заставить PG использовать индекс при условии с оператором ~~ ?
    #32998889
strizh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, помогло !
Действительно, должны быть все 4 индекса.
а set enable_s ... на скорость в данном случае не влияет :-)
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как заставить PG использовать индекс при условии с оператором ~~ ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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