У меня следующий запрос, который извлекает несколько столбцов данных из объекта JSON (facebook_results
столбец Postgres 10 типа json
).
Иногда массивы в этом объекте содержат более 10000 элементов.
Цель этого состоит в том, чтобы получить плоскую карту денормализованных данных из каждого столбца в объекте, и где есть массив, я хочу получить все столбцы с объектами, содержащимися внутри него (и, очевидно, просто дублировать данные вниз). для внешних ключей).
Ни один из самых внутренних ключей не содержит массивов, поэтому мне не нужно беспокоиться об этом. Я забочусь только о массивах matches
и nodes
, которые должны быть расширены.
Сейчас запрос работает, но он очень, очень медленный. Я предполагаю, потому что это из-за плохо написанного выполнения запроса, который является рекурсивным или имеет ненужные замедления сложности.
SELECT
id AS slice_id,
json_array_elements(facebook_results -> 'table' -> 'matches') -> 'table' -> 'size' AS match_size,
json_array_elements(facebook_results -> 'table' -> 'matches') -> 'table' -> 'score' AS match_score,
json_array_elements(facebook_results -> 'table' -> 'matches') -> 'table' -> 'width' AS match_width,
json_array_elements(facebook_results -> 'table' -> 'matches') -> 'table' -> 'format' AS match_format,
json_array_elements(facebook_results -> 'table' -> 'matches') -> 'table' -> 'domain' AS match_domain,
json_array_elements(json_array_elements(facebook_results -> 'table' -> 'matches') -> 'table' -> 'nodes') -> 'table' -> 'crawl_date' AS node_crawl_date,
json_array_elements(json_array_elements(facebook_results -> 'table' -> 'matches') -> 'table' -> 'nodes') -> 'table' -> 'url' AS node_url
FROM slices
WHERE id = 169
Вот пример того, что содержится в столбце facebook_results
:
{
"table":{
"matches": [
{
"table":{
"nodes":[
{
"table":{
"crawl_date":"2013-06-21",
"url":"http://example.com"
}
}
],
"size":7962624,
"score":47.059,
"width":3456,
"format":"MP4",
"domain":"example.com"
}
}
]
}
}
У кого-нибудь есть идеи, как мне это оптимизировать?