производительность запросов в отдельности хорошая, но при совместном выполнении она не заканчивается - PullRequest
0 голосов
/ 10 февраля 2020

Я не знаю, как оптимизировать этот запрос. Я использую его, чтобы вставить выбранные столбцы в другую таблицу. Однако этот запрос полностью зависает и кажется, что он не будет завершен 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)"
...