Я не знаю, как оптимизировать этот запрос. Я использую его, чтобы вставить выбранные столбцы в другую таблицу. Однако этот запрос полностью зависает и кажется, что он не будет завершен sh. Я не могу запустить EXPLAIN
с ANALYZE
из-за зависания. И мои sql знания находятся на пределе, мне очень трудно читать планы запросов. Каждый из подзапросов, когда запускается по отдельности, работает нормально. Я даже могу запустить комбинацию из трех ie: первый подзапрос с объединениями или первый объединений с финалом. Но когда все трое работают вместе, оно зависает и кажется, что оно никогда не заканчивается. Я позволил этому бежать в течение 5 минут без удачи. В первом подзапросе содержится 53527 записей, в таблице dim_products - 109. Я изменил порядок соединений, если это может помочь, но это не так. Любая помощь приветствуется.
explain (costs,verbose)SELECT a.addon_id,t.transaction_id
from (
SELECT product_id, addon_id
FROM scv.fact_addons
) a
join scv.dim_products p using (product_id)
join (
SELECT t.transaction_id, e.identifier
from (
select p.productsku as identifier, d.ticket_id from etl.products p
join scv.dim_tickets d on d.ticket_number = p.ticketno
where etl_batch_file_id = 509
) e
join (
select transaction_id, ticket_id
from scv.fact_ticket_transactions t
) t using (ticket_id)
) t using (identifier);
"Nested Loop (cost=1.72..66.06 rows=6 width=8)"
" Output: fact_addons.addon_id, t.transaction_id"
" -> Nested Loop (cost=1.43..2.44 rows=1 width=8)"
" Output: p.product_id, t.transaction_id"
" -> Nested Loop (cost=1.01..1.79 rows=1 width=8)"
" Output: p.product_id, d.ticket_id"
" Inner Unique: true"
" -> Nested Loop (cost=0.58..1.10 rows=1 width=13)"
" Output: p.product_id, p_1.ticketno"
" Inner Unique: true"
" -> Index Scan using "index_etl.products_on_etl_batch_file_id" on etl.products p_1 (cost=0.44..0.70 rows=1 width=17)"
" Output: p_1.id, p_1.sale_id, p_1.ticketno, p_1.transaction_date, p_1.item_quantity, p_1.item_single_value, p_1.productsku, p_1.family_name, p_1.type_description, p_1.product_description, p_1.product_serial, p_1.from_date, p_1.to_date, p_1.etl_batch_file_id, p_1.imported, p_1.created_at, p_1.updated_at, p_1.customer_id"
" Index Cond: (p_1.etl_batch_file_id = 509)"
" -> Index Scan using dim_products_identifier on scv.dim_products p (cost=0.14..0.40 rows=1 width=12)"
" Output: p.product_id, p.identifier, p.description, p.type_description, p.brand_id, p.family_name, p.valid_from_date, p.valid_to_date, p.valid_from_date_id, p.valid_to_date_id, p.created_date, p.updated_date"
" Index Cond: ((p.identifier)::text = (p_1.productsku)::text)"
" -> Index Scan using idx_unique_tickets on scv.dim_tickets d (cost=0.43..0.69 rows=1 width=13)"
" Output: d.ticket_id, d.sale_id, d.ticket_number, d.sale_date, d.sale_date_id"
" Index Cond: ((d.ticket_number)::text = (p_1.ticketno)::text)"
" -> Index Only Scan using idx_ticket_xaction_ticket_id_transaction_id on scv.fact_ticket_transactions t (cost=0.42..0.55 rows=2 width=8)"
" Output: t.ticket_id, t.transaction_id"
" Index Cond: (t.ticket_id = d.ticket_id)"
" -> Index Only Scan using idx_fact_addons_product_addon_id on scv.fact_addons (cost=0.29..34.21 rows=588 width=8)"
" Output: fact_addons.product_id, fact_addons.addon_id"
" Index Cond: (fact_addons.product_id = p.product_id)"