powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как создать индекс с substr ?
10 сообщений из 10, страница 1 из 1
Как создать индекс с substr ?
    #33265964
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По большой таблице выполняется токой запрос:
Код: plaintext
SELECT substr(cdate, 1 , 4 ) as cyear FROM tbl GROUP BY cyear ORDER BY cyear;

Какой индекс под него создать ?
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33267364
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с чего ты взял что вообще будет использоватся какой нибудь индекс в этом запросе?
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33267642
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wbearс чего ты взял что вообще будет использоватся какой нибудь индекс в этом запросе?

C того, что в postgres есть оптимизатор который использует подходящий индекс если возможно.

Идеально было бы создать индекс по substr(cdate,1,4), но такой индекс создать не удается. ERROR: parser: parse error at or near "1"

Код: plaintext
create index tbl_ind on tbl (substr(cdate, 1 , 4 ));

Как вариант я даже рассматривал создание дополнительного столбца cyear, но это экстенсивный путь. Мне почему то кажется, что такой индекс создать можно, просто я ошибаюсь в синтаксисе.
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33267846
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava_P wbearс чего ты взял что вообще будет использоватся какой нибудь индекс в этом запросе?C того, что в postgres есть оптимизатор который использует подходящий индекс если возможно.Использует подходящий индекс если посчитает такой план более быстрым.

Slava_PИдеально было бы создать индекс по substr(cdate,1,4), но такой индекс создать не удается. ERROR: parser: parse error at or near "1"
Код: plaintext
create index tbl_ind on tbl (substr(cdate, 1 , 4 ));
На восьмерке работает. Какая у вас версия постгреса?
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33267847
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот нашел в документации:

The function in the index definition can take more than one argument, but they must be table columns, not constants .

И как это обойти ?
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33267985
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Postgres 7.3.4
на 8 пока не хочу уходить подожду пока выйдет 8.2.4 :)
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33268075
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создать свою immutable функцию substr_1_4(text) типа as 'select subsrt($1,1,4)' language 'sql' и сделать индекс по ней.
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33268499
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatСоздать свою immutable функцию substr_1_4(text) типа as 'select subsrt($1,1,4)' language 'sql' и сделать индекс по ней.

Пробовал такой вариант.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE INDEX biling_3 ON biling ( subyear(cdate) );
EXPLAIN SELECT DISTINCT subyear(cdate) as cyear FROM biling;
                                QUERY PLAN
---------------------------------------------------------------------------
 Unique  (cost= 41710 . 80 .. 41774 . 84  rows= 1281  width= 16 )
   ->  Sort  (cost= 41710 . 80 .. 41742 . 82  rows= 12807  width= 16 )
         Sort Key: subyear(cdate)
         ->  Seq Scan on biling  (cost= 0 . 00 .. 40837 . 07  rows= 12807  width= 16 )

Запрос выполняется довольно долго. В таблице более 700 тыс. записей.
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33268963
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Slava_P[quot LeXa NalBat]
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
CREATE INDEX biling_3 ON biling ( subyear(cdate) );
EXPLAIN SELECT DISTINCT subyear(cdate) as cyear FROM biling;
                                QUERY PLAN
---------------------------------------------------------------------------
 Unique  (cost= 41710 . 80 .. 41774 . 84  rows= 1281  width= 16 )
   ->  Sort  (cost= 41710 . 80 .. 41742 . 82  rows= 12807  width= 16 )
         Sort Key: subyear(cdate)
         ->  Seq Scan on biling  (cost= 0 . 00 .. 40837 . 07  rows= 12807  width= 16 )

Запрос выполняется довольно долго. В таблице более 700 тыс. записей.Сделайте set enable_sort to off; set enable_seqscan to off; Но кардинального ускорения ожидать не стоит.
...
Рейтинг: 0 / 0
Как создать индекс с substr ?
    #33270155
Slava_P
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LeXa NalBatСделайте set enable_sort to off; set enable_seqscan to off; Но кардинального ускорения ожидать не стоит.

Сделал действительно стало использовать индех, но радикального ускорения, как и было обещано, не вышло. Но зато я стал немного больше понимать работу postgres и то хорошо :)
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как создать индекс с substr ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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