Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

Ответ
 
Опции темы
Старый 06.06.2018, 17:25   #1
polin11
Форумчанин
 
Регистрация: 07.06.2015
Сообщений: 86
Репутация: -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
Сообщений: 86
Репутация: -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
Сообщений: 86
Репутация: -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


05:19.


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

RusProfile.ru


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