The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Как добиться, чтобы в запросах LIKE 'что%' использовался индекс ?
Из-за сложности и многообразия locale в постгресе запрещено использовать индекс
для запросов вида LIKE 'что%' для всех locale кроме 'C'. А что делать если хочется ? 
В 8.01 стало возможным использовать operator class [1] !  Мы будем использовать
varchar_pattern_ops, B-tree индекс
в этом случае, будет строиться без использования collation правил из locale, а
на основе сравнения буквы с буквой.

   test=#  \d ru_words 
       w      | text | 
       Indexes:
          "w_idx" btree (lower(w) varchar_pattern_ops)

   test=# create index w_idx on ru_words (lower(w) varchar_pattern_ops);
      CREATE INDEX

   test=# vacuum analyze test;

   test=# explain analyze select w from ru_words where lower(w) like 'что%';

       Index Scan using w_idx on ru_words...
         Index Cond: ((lower(w) ~>=~ 'что'::character varying) AND (lower(w) ~<~ 'чтп'::character varying))
         Filter: (lower(w) ~~ 'что%'::text)
 
05.04.2005 , Автор: Олег Бартунов , Источник: http://www.sai.msu.su/~megera/oddmu...
Ключи: postgresql, time
Раздел:    Корень / Программисту и web-разработчику / SQL и базы данных / PostgreSQL специфика / Оптимизация и администрирование PostgreSQL

Обсуждение [ RSS ]
  • 1, Остров (?), 16:13, 23/04/2005 [ответить]  
  • +/
    Добавляйте в заголовок "PostgreSQL" иначе путаете многоих...
     
  • 2, ku (??), 22:04, 23/11/2011 [ответить]  
  • +/
    Создаю индекс так:
    create unique index idx_username on usersfrontend using btree (lower(username) varchar_pattern_ops);

    Итоговая таблица:
    \d+ usersfrontend
                                               Table "public.usersfrontend"
       Column   |            Type             |                        Modifiers                        | Description
    ------------+-----------------------------+---------------------------------------------------------+-------------
    id         | integer                     | not null default nextval('usersfrontend_seq'::regclass) |
    username   | character varying(16)       | not null                                                |
    Indexes:
        "idx_username" UNIQUE, btree (lower(username::text) varchar_pattern_ops)
        "idx_usersfrontend_uniq" UNIQUE, btree (id)
        "idx_username_password" btree (username, password)

    Ну вот что в итоге:
    explain analyze select username from usersfrontend where lower(username) like 'Dex%';                                              QUERY PLAN                                              
    -------------------------------------------------------------------------------------------------------
    Seq Scan on usersfrontend  (cost=0.00..2.39 rows=1 width=7) (actual time=0.085..0.085 rows=0 loops=1)
       Filter: (lower((username)::text) ~~ 'Dex%'::text)
    Total runtime: 0.124 ms

    Что не так?

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Спонсоры:
    Слёрм
    Inferno Solutions
    Hosting by Ihor
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2019 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру