Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2018, 16:25   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию Как заставить Postgres использовать определенный индекс

Есть запрос, использую СУБД Postgresql
Код:
SELECT DISTINCT
"Field1"
FROM
"Table"
WHERE "Field2" LIKE 'val1%' AND "Field3" ='val2' 
LIMIT 100
В базе есть индекс по полю Field1 и составной индекс по 2 полям
(Field2 и Field3).
Если в запросе указать ограничение LIMIT, то используется индекс
по полю Field1 и потребляется много ресурсов.
Если в запросе убрать ограничение LIMIT, то используется составной
индекс (Field2 и Field3) ресурсов тратиться в 2 раза меньше, но
время выполнения запроса в несколько раз больше.
Вопрос можно ли в запросе оставить LIMIT 100 и
обязать Postgres использовать составной индекс?
polin11 вне форума Ответить с цитированием
Старый 06.06.2018, 17:28   #2
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

Например, если изменить запрос на
Код:
SELECT DISTINCT
"Field1",  "Field2"
FROM
"Table"
WHERE "Field2" LIKE 'val1%' AND "Field3" ='val2' 
LIMIT 100
то используется составной индекс (Field2 и Field3), но время выполнения также увеличивается в несколько раз
polin11 вне форума Ответить с цитированием
Старый 07.06.2018, 01:49   #3
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 164
По умолчанию

К сожалению даже такой сокращенный запрос
Код:
SELECT DISTINCT "Field1"
FROM "Table"
WHERE "Field2" LIKE 'val1%'  
LIMIT 100

Планировщик использует индекс по полю Field1, а не индекс по полю Field2.
Fileld2 поле типа text, индекс добавлен с классом операторов text_pattern_ops.

Для примера , если изменить запрос
Код:
SELECT DISTINCT "Field1", "Field2"
FROM "Table"
WHERE "Field2" LIKE 'val1%'  
LIMIT 100

или
Код:
SELECT DISTINCT "Field1"
FROM "Table"
WHERE "Field2" LIKE 'val1%'

даже такой запрос, с другим фильтром "Field2" = 'val1'
Код:
SELECT DISTINCT "Field1"
FROM "Table"
WHERE "Field2" = 'val1' 
LIMIT 100

То во всех случаях используется индекс по полю Field2, но в этих случаях время выполнения запроса слишком большое
polin11 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хеш-таблица, метод цепочек, первичный индекс и вторичный индекс - C# AnatoliyAnatoliy Помощь студентам 2 09.01.2018 15:30
C++ Как узнать изменился ли определенный символ? BuBucha Помощь студентам 1 18.05.2017 14:57
Как повернуть на определенный угол график Gamst Общие вопросы Delphi 4 01.02.2012 16:19
как получить данные из Postgres в Лист Эксель briz_tomsk Microsoft Office Excel 0 16.04.2009 14:18
как суммировать только определенный месяц? Алька Microsoft Office Excel 2 08.05.2007 08:50