powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Нужен быстрый способ выполнения запроса
5 сообщений из 5, страница 1 из 1
Нужен быстрый способ выполнения запроса
    #33403180
Ilia KAntor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хочу первые 5 результатов:
SELECT * FROM table WHERE x BETWEEN -1000,1000 ORDER BY y

Всего результатов порядка 5 тысяч.
Размер таблицы порядка 500+ тысяч.
Т.е селективность условия - порядка 1/100

Два наиболее вероятных плана:
1) Создать индекс по (y,x), использовать его для выборки по ORDER BY и фильтровать BETWEEN
2) Создать индекс по (x,y), использовать его для выборки по BETWEEN, отсортировать по ORDER BY с хинтом FIRST_ROWS и получить первые 5 результатов

В первом случае фильтрация отбрасывает ~99 рядов из 100, во втором - совершенно не улыбает сортировка 5 тысяч, если нужно только 5.

Хотелось бы получить план, который выберет сразу то, что нужно.

P.S В реальном приложении аргументы BETWEEN сильно меняются. Кэширование не особо применимо, а запрос выполняется достаточно часто, чтобы оптимизация стала необходимой.

P.P.S Хотелось бы решение на уровне проектирования БД, а не "как настроить RDBMS". Может, GIST поможет ?
...
Рейтинг: 0 / 0
Нужен быстрый способ выполнения запроса
    #33403222
mwolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.А планы показать слабо?
2.LIMIT-а в запросе я тоже не увидел
3."В реальном приложении аргументы сильно меняются". Юзер может задать весь диапазон? Тогда о какой селективности может идти речь?
...
Рейтинг: 0 / 0
Нужен быстрый способ выполнения запроса
    #33403286
Ilia KAntor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) это ничего не изменит, я их расшифровки запостил специально.
2) что-то непонятно в формулировке? Хинт можно убрать ораклячий ;))
3) да, может задать весь, а может BETWEEN -1001, 1002 и т п
Я так в среднем указал селективность.

Пожалуста, не надо придираться к условию, я постарался сделать его максимально понятным.
Это именно та задача, которую нужно оптимизировать.
...
Рейтинг: 0 / 0
Нужен быстрый способ выполнения запроса
    #33403381
Andrey Daeron
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ilia KAntorХочу первые 5 результатов:
SELECT * FROM table WHERE x BETWEEN -1000,1000 ORDER BY y

Всего результатов порядка 5 тысяч.
Размер таблицы порядка 500+ тысяч.
Т.е селективность условия - порядка 1/100

Два наиболее вероятных плана:
1) Создать индекс по (y,x), использовать его для выборки по ORDER BY и фильтровать BETWEEN
2) Создать индекс по (x,y), использовать его для выборки по BETWEEN, отсортировать по ORDER BY с хинтом FIRST_ROWS и получить первые 5 результатов

В первом случае фильтрация отбрасывает ~99 рядов из 100, во втором - совершенно не улыбает сортировка 5 тысяч, если нужно только 5.

Хотелось бы получить план, который выберет сразу то, что нужно.

P.S В реальном приложении аргументы BETWEEN сильно меняются. Кэширование не особо применимо, а запрос выполняется достаточно часто, чтобы оптимизация стала необходимой.

P.P.S Хотелось бы решение на уровне проектирования БД, а не "как настроить RDBMS". Может, GIST поможет ?
Как вариант:
Код: plaintext
1.
SELECT * FROM table WHERE x BETWEEN - 1000 , 1000  ORDER BY y LIMIT  5 
Я бы посоветовал создать таблицу, напихать мусора и попробывать в реальной жизни, ибо:
Код: plaintext
1.
2.
3.
The query optimizer takes LIMIT into account when generating a query plan, 
so you are very likely to get different plans (yielding different row orders) 
depending on what you give for LIMIT and OFFSET.
.
Мне кажется, что нужно создать индекс по x, и по (x,y) (для запросов с узким диапазоном по х) и/или по (y) (для случая бездиапазонного запроса). СУБД может считать иначе.
На сколько я понял документацию, то GIST не поможет, если данные x и y - целые числа (integer). Для этих типов GIST создан для использования в многоколоночных индексах, а обычный btree быстрее.
...
Рейтинг: 0 / 0
Нужен быстрый способ выполнения запроса
    #33403433
Ilia KAntor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, запрос именно такой.

SELECT * FROM table WHERE x BETWEEN -1000,1000 ORDER BY y LIMIT 5


LIMIT действительно учитывается оптимизатором для выбора между планами 1 и 2 (описанными выше).

Таблица самая что ни на есть реальная существует. Все данные реальны.
Спасибо за совет.

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


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