Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

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

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

Ответ
 
Опции темы
Старый 06.06.2018, 17:25   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 96
Репутация: -53
По умолчанию Как заставить 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, 18:28   #2
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 96
Репутация: -53
По умолчанию

Например, если изменить запрос на
Код:

SELECT DISTINCT
"Field1",  "Field2"
FROM
"Table"
WHERE "Field2" LIKE 'val1%' AND "Field3" ='val2' 
LIMIT 100

то используется составной индекс (Field2 и Field3), но время выполнения также увеличивается в несколько раз
polin11 вне форума   Ответить с цитированием
Старый 07.06.2018, 02:49   #3
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 96
Репутация: -53
По умолчанию

К сожалению даже такой сокращенный запрос
Код:

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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хеш-таблица, метод цепочек, первичный индекс и вторичный индекс - C# AnatoliyAnatoliy Помощь студентам 2 09.01.2018 16:30
C++ Как узнать изменился ли определенный символ? BuBucha Помощь студентам 1 18.05.2017 15: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


14:08.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru