Каков наилучший индекс Postgres для выполнения обратного сопоставления с шаблоном в столбце? - PullRequest
0 голосов
/ 03 мая 2020

Использование Postgres 12.

У меня есть таблица actions с шаблонами сопоставления с образцами в столбце action. Я хочу SELECT все строки, где шаблон в столбце соответствует моей строке. Есть тысячи строк, и это занимает несколько секунд.

CREATE TABLE testing (
    id serial,
    sid uuid NOT NULL,
    action varchar(50) NOT NULL
);

INSERT INTO testing (sid, action) 
VALUES 
    ('a2a15c9d-68ba-46d2-9750-4039a0f65bd4', 'servicea:Get%'),
    ('a2a15c9d-dddd-46d2-9750-4039a0f65bd4', 'serviceb:Get%'),
    ('a2a15c9d-dddd-46d2-9750-4039a0f65bd4', 'servicec:Update%'),
    ('a2a15c9d-aaaa-46d2-9750-4039a0f65bd4', 'serviced:Get%'),
    ('a2a15c9d-baaa-46d2-9750-4039a0f65bd4', 'servicee:Update%'),
    ('a2a15c9d-68ba-46d2-9750-4039a0f65bd4', 'servicef:Get%'),
    ('12312333-68ba-46d2-9750-4039a0f65bd4', 'serviceg:%Items'),
    ('12312333-68ba-46d2-9750-4039a0f65bd4', 'serviceg:Get%'),
    ('a2a15c9d-68ba-46d2-9750-4039a0f65bd4', '%:%'),
    ('a2a15c9d-dddd-46d2-9750-4039a0f65bd4', 'serviceb:%'),
    ('a2a15c9d-dddd-46d2-9750-4039a0f65bd4', '%'),
    ('a2a15c9d-abcd-46d2-9750-4039a0f65bd4', 'serviced:Get%'),
    ('a2a15c9d-baaa-46d2-9750-4039a0f65bd4', 'serviced:Update%'),
    ('a2a15c9d-68ba-46d2-9750-4039a0f65bd4', 'servicef:Get%'),
    ('12312333-68ba-46d2-9750-4039a0f65bd4', 'serviceg:Delete%')
;

Я создал фиктивный SQL дамп данных для ~ 1 000 000 строк здесь для целей тестирования.

Запрос будет выглядеть следующим образом:

SELECT * FROM testing WHERE 'serviced:GetItem' ~~* testing.action;

Это отлично работает для небольшой таблицы, но даже с миллионами строк он начинает занимать ~ 600 мс в ОЗУ MacBook Pro 32 ГБ (без индекса).

Какой индекс, по вашему мнению, лучше всего подходит для этого случая?

ps, реальный вариант использования похож на AWS Политики, и таблиц еще больше (для действий, ресурсов и для принципам), поэтому задержка имеет решающее значение для пользовательского API.

...