Использование 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.