172 похожих чатов

Коллеги, а есть ли способ заставить PG использовать конкретный индекс?

Причем, указать надо именно в SELECT, вещи типа set enable_seqscan=false не подходят.

34 ответов

14 просмотров

нет

Tagg-Steel Автор вопроса
doc
нет

А если пойти таким путем - этот селект запихнуть в функцию и там установить enable_seqscan, а оттуда вернуть результат?

Tagg-Steel Автор вопроса
doc
а что изменится?

В функции этот селект выполнится с использованием индекса, или я что-то не так понимаю?

Tagg Steel
В функции этот селект выполнится с использованием ...

почему он там должен с использованием индекса выполниться?

Tagg-Steel Автор вопроса
doc
почему он там должен с использованием индекса выпо...

Потому что перед выполнением я поставлю переменную set enable_seqscan=false

Tagg Steel
Потому что перед выполнением я поставлю переменную...

так выключение секскана это не заставить использовать конкретный индекс. это просто заставить использовать индексы

Tagg-Steel Автор вопроса
doc
так выключение секскана это не заставить использов...

У меня простой запрос, where identity_id = 45, к примеру. Так как в таблице мало значений, то имеющийся индекс не используется. А надо, чтобы использовался.

Tagg Steel
У меня простой запрос, where identity_id = 45, к п...

Кому надо? Вам? Вы и используйте. Пг не надо.

Tagg Steel
У меня простой запрос, where identity_id = 45, к п...

надо разбираться, почему база принимает такое решение. в вашем случае из-за размеров таблицы выгоднее сделать SS, т.к. он затронет меньше страничек, чем IS на маленьких размерах (1-2 страницы по 8кБ) IS-ы редко используются

Tagg-Steel Автор вопроса
Виктор Егоров
надо разбираться, почему база принимает такое реше...

Это понятно, но я хочу заставить его использовать индекс даже если в таблице 2 строки - чтобы выбрал сразу нужную и не лез бы ко второй.

Tagg Steel
У меня простой запрос, where identity_id = 45, к п...

мало это сколько? если там несколько сотен записей, то индекс не нужен, проще последоватлеьно прочитать.

Tagg Steel
Это понятно, но я хочу заставить его использовать ...

данные хранятся в виде страниц, на которых множество строк записано. если все на одной странице умещается, то в индекс нет смысла лезть

Tagg Steel
Это понятно, но я хочу заставить его использовать ...

вы механику работы IndexScan-а в базе понимаете? база работает с блоком, а раз он уже в кэше, то найти запись – пара лишних циклов то, что вы хотите — это надо лезть в как минимум ещё 2 дополнительных блока. это дороже. вы хотите странного

Tagg-Steel Автор вопроса
doc
мало это сколько? если там несколько сотен записей...

В системе используется защита строк. таблица, о которой я говорю, содержит разрешения на просмотр таблиц, в том числе и самой себя. Для этой таблицы имеется своя policy, которая пропускает стоку если она “текущая”(определяется по переменным сессии), а если не “текущая” - то загружается “текущая” строка и из нее берутся разрешения. Все работает, когда используется индекс - когда записей много, а когда мало - мроисходит, понятное дело, зацикливание.

Tagg Steel
В системе используется защита строк. таблица, о ко...

хм, велосипед? https://www.postgresql.org/docs/current/sql-createpolicy.html

Tagg Steel
В системе используется защита строк. таблица, о ко...

не понял почему происходит зацикливание, вообще ваш кейс звучит оч странно) наличия индекса только на производительность влияет, а не на корректность

Tagg-Steel Автор вопроса

Я про это и задавал вопрос - можно ли селект вынести в функцию и в ней отключить seqscan

Tagg Steel
Я про это и задавал вопрос - можно ли селект вынес...

пробуйте, но знайте, что вы что-то странное делаете и скорее всего некорректное. сейчас работает, завтра нет

Tagg-Steel Автор вопроса
doc
пробуйте, но знайте, что вы что-то странное делает...

Есть еще мысль-сделать то поле, по которому поиск, PRIMARY_KEY. Правильно ли я понимаю, что по PK он выберет всегда одну запись и не будет делать SEQ SCAN ни в каком случае?

Tagg-Steel Автор вопроса
Tagg Steel
В системе используется защита строк. таблица, о ко...

расскажи что за защита строк, которая зависит от способа сканирования?

Tagg Steel
Почему?

я же расписал механику на пальцах — зачем лезть в индекс, если таблица из одного блока? поход в индекс в 3 раза увеличивает работу для таблицы из 1 блока.

Tagg-Steel Автор вопроса
doc
расскажи что за защита строк, которая зависит от с...

Я же написал - ест таблица, в которой есть дескрипторы - некие числа, которые определяют, можно или нет данному юзеру показывать конкретную запись. Потем сравнения этих дескрипторв с колумном в каждой строке таблиц, котрые под защитой строк. Таблиц много, все работает, но также надо, чтобы под этой защитой строк оказалась и сама таблица, где дескрипторы прав.

Tagg Steel
Я же написал - ест таблица, в которой есть дескрип...

а я написал, что вы велосипед изобретаете – этот функционал есть в базе. и дал ссылку на доку

Tagg-Steel Автор вопроса
Виктор Егоров
а я написал, что вы велосипед изобретаете – этот ф...

То, что Вы написали, мы и используем. Я писал - запрос используется в policy

Tagg Steel
Я же написал - ест таблица, в которой есть дескрип...

Как должны провериться права на таблицу, если они лежат в этой таблице?

Tagg Steel
Я же написал - ест таблица, в которой есть дескрип...

ну окей, а почему это при послкдовательном сканировании не работает?

Tagg-Steel Автор вопроса
Tagg-Steel Автор вопроса
Tagg Steel
А что мешает это делать?

Я про саму логику действа. Вы хотите соблюдать права доступа при чтении таблицы, которую нужно прочитать для соблюдения прав доступа

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта