powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Инженерия данных [игнор отключен] [закрыт для гостей] / Построение индекса для выборки по НЕ равно
3 сообщений из 3, страница 1 из 1
Построение индекса для выборки по НЕ равно
    #40138796
ajkon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще проект для которого возник вопрос живёт в PostgreSQL, но, в моей картине мира, ответы будут общими для всех популярных SQL баз.

Получил в наследство легаси проект с "шиной данных для бедных" построенной на SQL базе.
В базе есть таблица примерно такого вида:
Код: SQL
1.
2.
3.
4.
5.
CREATE TABLE config_table (
    config_id INT PRIMARY KEY,
    prod_version_id INT NOT NULL,
    blablabla BYTEA
);
Один процесс в эту таблицу пишет (чаще изменяет prod_version_id и blablabla, чем дописывает новые строки), множество других процессов читают и кэшируют у себя значения из blablabla. О том что значение в blablabla изменилось они могут понять по изменившемуся значению prod_version_id.

Для этого отправляют запросы вида:
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
    config_id,
    prod_version_id,
    blablabla
FROM
    config_table
WHERE
    (config_id=1 AND prod_version_id!=2001)
    OR (config_id=2 AND prod_version_id!=3002)
    OR (config_id=3 AND prod_version_id!=1001)
Вот таких пар
Код
1.
(config_id=4 AND prod_version_id!=5006)
могут быть единицы сотен.

Вопрос: какой индекс правильнее всего использовать для оптимизации таких запросов.
...
Изменено: 07.10.2024, 13:55 - ajkon
Рейтинг: 0 / 0
Построение индекса для выборки по НЕ равно
    #40138811
Фотография SeaGate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ajkon [игнорируется] 

Обычно подобное решается через заведение отдельного поля LAST_UPDATED где дата последнего обновления или возрастающий счетчик.
Соответственно, при чтениях просто указывается LAST_UPDATED > последней_даты_чтения для кэша. Если есть какие-то нюансы с тем, что читать не все config_id необходимо и производительность не удовлетворительная, то можно и config_id добавить в условие и создать подходящий индекс: config_id, last_updated.

Индексы на не равно: обычно это решается через переписывания не равно в больше/меньше, например:
prod_version_id != 5006 - prod_version_id < 5006 or prod_version_id > 5006.
Индекс будет на config_id, prod_version_id. Но нужно смотреть план выполнения, т.к. в PostgreSQL не должно быть concatenation/or-expansion трансформаций, что есть в Oracle. Т.е. возможно переписать в UNION ALL, в зависимости от плана.

Далее, почему prod_version_id != 5006? Возможно ли использовать prod_version_id > 5006, или по каким-то причинам поле не возрастает?
Тогда опять будет индекс на config_id, prod_version_id и смотреть план.

Если всё-таки нужно не равно и переписывать ничего нельзя, то просто создать индекс на config_id, prod_version_id.
По плану в PostgreSQL будет использоваться доступ по config_id (оно уникально из-за primary key) + фильтр по prod_version_id, т.е. это проверяется на основании индекса и уже затем по отфильтрованным данным будет доступ в таблицу для получения blablabla.
...
Рейтинг: 0 / 0
Построение индекса для выборки по НЕ равно
    #40138821
ajkon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeaGate  09.10.2024, 14:30
[игнорируется]
Индексы на не равно: обычно это решается через переписывания не равно в больше/меньше, например:
prod_version_id != 5006 - prod_version_id < 5006 or prod_version_id > 5006.
Индекс будет на config_id, prod_version_id. Но нужно смотреть план выполнения, т.к. в PostgreSQL не должно быть concatenation/or-expansion трансформаций, что есть в Oracle.
Спасибо!
На больше-меньше заменить попробую и в план поштырю.
Индекс на config_id, prod_version_id и так уже сделал, но нужно было подтверждение от опытных базоводов, что это хорошее и по сути единственное решение )
SeaGate  09.10.2024, 14:30
[игнорируется]
Возможно ли использовать prod_version_id > 5006, или по каким-то причинам поле не возрастает?
Продовая версия может откатываться и тогда prod_version_id будет становиться меньше, чем был до этого.

P.S.
Да, решение сначала фильтровать по проиндексированному LAST_UPDATED было бы идеальным, но в силу некоторых извратов в бизнес-логике (которые длино описывать и не хочется сюда тащиеть) к этому проекту не подходит (
...
Изменено: 10.10.2024, 17:48 - ajkon
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Инженерия данных [игнор отключен] [закрыт для гостей] / Построение индекса для выборки по НЕ равно
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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