Search

8-3-4. 프로브 입력 최적화

-- [SQL-8-3-4-a] EXPLAIN (ANALYZE,BUFFERS,COSTS OFF) SELECT TO_CHAR(t1.ord_dtm,'YYYYMM') ord_ym ,t2.item_id ,SUM(t2.ord_qty) ord_qty_sum FROM startdbpg.tr_ord_big t1 INNER JOIN startdbpg.tr_ord_det_big t2 ON (t1.ord_no = t2.ord_no) WHERE t1.ord_dtm >= '2023-01-01'::date AND t1.ord_dtm < '2023-02-01'::date GROUP BY TO_CHAR(t1.ord_dtm,'YYYYMM') ,t2.item_id;
SQL
복사
-- [SQL-8-3-4-b]: work_meme을 32MB로 늘린 후 [SQL-8-3-4-a]를 재실행 SHOW work_mem; -- 4MB SET work_mem = '32MB'; -- 4MB의 8배인 32MB로 설정 -- [SQL-8-3-4-a] EXPLAIN (ANALYZE,BUFFERS,COSTS OFF) SELECT TO_CHAR(t1.ord_dtm,'YYYYMM') ord_ym ,t2.item_id ,SUM(t2.ord_qty) ord_qty_sum FROM startdbpg.tr_ord_big t1 INNER JOIN startdbpg.tr_ord_det_big t2 ON (t1.ord_no = t2.ord_no) WHERE t1.ord_dtm >= '2023-01-01'::date AND t1.ord_dtm < '2023-02-01'::date GROUP BY TO_CHAR(t1.ord_dtm,'YYYYMM') ,t2.item_id;
SQL
복사
-- [SQL-8-3-4-c] SELECT t1.attname -- 컬럼명 ,t1.correlation -- 테이블의 실제 데이터 정렬과 해당 컬럼의 정렬에 대한 상관계수 FROM pg_stats t1 WHERE t1.tablename = 'tr_ord_big' AND t1.attname in ('ord_dtm','ord_no') ORDER BY t1.correlation DESC;
SQL
복사
-- [SQL-8-3-4-d] SELECT MIN(x.ord_no::numeric) ord_no_min ,MAX(x.ord_no::numeric) ord_no_max FROM startdbpg.tr_ord_big x WHERE x.ord_dtm >= '2023-01-01'::date AND x.ord_dtm < '2023-02-01'::date;
SQL
복사
-- [SQL-8-3-4-e] SET work_mem = '4MB'; EXPLAIN (ANALYZE,BUFFERS,COSTS OFF) SELECT TO_CHAR(t1.ord_dtm,'YYYYMM') ord_ym ,t2.item_id ,SUM(t2.ord_qty) ord_qty_sum FROM startdbpg.tr_ord_big t1 INNER JOIN startdbpg.tr_ord_det_big t2 ON (t1.ord_no = t2.ord_no) WHERE t1.ord_dtm >= '2023-01-01'::date AND t1.ord_dtm < '2023-02-01'::date AND t2.ord_no >= 10713997 -- > ord_no_min을 조건값으로 사용 AND t2.ord_no <= 11351304 -- > ord_no_max를 조건값으로 사용 GROUP BY TO_CHAR(t1.ord_dtm,'YYYYMM') ,t2.item_id;
SQL
복사
-- [SQL-8-3-4-f] EXPLAIN (ANALYZE,BUFFERS,COSTS OFF) WITH w1 AS MATERIALIZED ( SELECT MIN(x.ord_no::numeric) ord_no_min ,MAX(x.ord_no::numeric) ord_no_max FROM startdbpg.tr_ord_big x WHERE x.ord_dtm >= '2023-01-01'::date AND x.ord_dtm < '2023-02-01'::date ) SELECT TO_CHAR(t1.ord_dtm,'YYYYMM') ord_ym ,t2.item_id ,SUM(t2.ord_qty) ord_qty_sum FROM startdbpg.tr_ord_big t1 INNER JOIN startdbpg.tr_ord_det_big t2 ON (t1.ord_no = t2.ord_no) WHERE t1.ord_dtm >= '2023-01-01'::date AND t1.ord_dtm < '2023-02-01'::date AND t2.ord_no >= (SELECT x1.ord_no_min FROM w1 x1) AND t2.ord_no <= (SELECT x2.ord_no_max FROM w1 x2) GROUP BY TO_CHAR(t1.ord_dtm,'YYYYMM') ,t2.item_id;
SQL
복사