Я пытаюсь ускорить запросы к полю объекта в Postgres.
Таблица, которую я ищу, имеет следующую структуру:
- page_id: integer
- lang: varchar (2)
- images: jsonb
Поле изображений JSONB содержит такие объекты:
{
"-1": {
"ns": 6,
"known": "",
"title": "File:Architrave nuraghe.jpg",
"missing": "",
"contentmodel": "wikitext",
"pagelanguage": "it",
"pagelanguagedir": "ltr",
"pagelanguagehtmlcode": "it"
},
"-2": {
"ns": 6,
"known": "",
"title": "File:Commons-logo.svg",
"missing": "",
"contentmodel": "wikitext",
"pagelanguage": "it",
"pagelanguagedir": "ltr",
"pagelanguagehtmlcode": "it"
},
}
Мне нужно получить все страницы, которые используют определенный файл - который я делаю так:
select * from (
select lang, page_id, img.b::jsonb->>'title' as file
from (
select *
from pages where jsonb_typeof(images_jsonb) ='object') a,
jsonb_each(images_jsonb) as img(a, b)
) as q
where file = 'File:Vigoleno castello2.jpg';
Он работает нормально, но он очень медленный - план запроса выглядит так:
QUERY PLAN
-------------------------------------------------------------------------------
Nested Loop (cost=0.00..199113.78 rows=3998 width=39)
-> Seq Scan on pages (cost=0.00..193066.80 rows=3998 width=39)
Filter: (jsonb_typeof(images_jsonb) = 'object'::text)
-> Function Scan on jsonb_each img (cost=0.00..1.50 rows=1 width=32)
Filter: ((b ->> 'title'::text) = 'File:Vigoleno castello2.jpg'::text)
(5 rows)
Я думаю, что индексация в поле объекта, и я немного прочитал об индексации по объекту, но не могу найти что-то об индексации по полям полей.
Я думал о нормализации в другую таблицу в качестве альтернативной стратегии, но я бы хотел этого избежать (держать в курсе дела c et c - это немного бремя).
Есть идеи?