Search

8-4-4. 조인 횟수를 줄이자

-- [SQL-8-4-4-a] EXPLAIN (ANALYZE,BUFFERS,COSTS OFF) SELECT t1.shop_id ,TO_CHAR(t2.ord_dtm,'YYYYMM') ord_ym ,MAX(t1.shop_nm) shop_nm ,SUM(t2.ord_amt) ord_amt_sum FROM startdbpg.ms_shop_big t1 INNER JOIN startdbpg.tr_ord_big t2 ON (t1.shop_id = t2.shop_id) WHERE t2.ord_dtm >= '2024-01-01'::date AND t2.ord_dtm < '2024-04-01'::date GROUP BY t1.shop_id ,TO_CHAR(t2.ord_dtm,'YYYYMM') ORDER BY t1.shop_id ,TO_CHAR(t2.ord_dtm,'YYYYMM');
SQL
복사
-- [SQL-8-4-4-b]: [SQL-8-4-4-a]를 GROUP BY 후 조인 패턴으로 변경 EXPLAIN (ANALYZE,BUFFERS,COSTS OFF) SELECT t1.shop_id ,t2.ym ,t1.shop_nm ,t2.ord_amt_sum FROM startdbpg.ms_shop_big t1 INNER JOIN ( SELECT a.shop_id ,TO_CHAR(a.ord_dtm,'YYYYMM') ym ,SUM(a.ord_amt) ord_amt_sum FROM startdbpg.tr_ord_big a WHERE a.ord_dtm >= '2024-01-01'::date AND a.ord_dtm < '2024-04-01'::date GROUP BY a.shop_id ,TO_CHAR(a.ord_dtm,'YYYYMM') ) t2 ON (t1.shop_id = t2.shop_id) ORDER BY t1.shop_id ,t2.ym;
SQL
복사
-- [SQL-8-4-4-c]: [SQL-8-4-4-b]에 힌트 적용 EXPLAIN (ANALYZE,BUFFERS,COSTS OFF) SELECT /*+ HashJoin(t1 t2) */ t1.shop_id ,t2.ym ,t1.shop_nm ,t2.ord_amt_sum FROM startdbpg.ms_shop_big t1 INNER JOIN ( SELECT a.shop_id ,TO_CHAR(a.ord_dtm,'YYYYMM') ym ,SUM(a.ord_amt) ord_amt_sum FROM startdbpg.tr_ord_big a WHERE a.ord_dtm >= '2024-01-01'::date AND a.ord_dtm < '2024-04-01'::date GROUP BY a.shop_id ,TO_CHAR(a.ord_dtm,'YYYYMM') ) t2 ON (t1.shop_id = t2.shop_id) ORDER BY t1.shop_id ,t2.ym;
SQL
복사