DB 튜닝 시 참고 사항 ( full scan )

2021. 9. 6. 20:33W.IT/W.데이터베이스

 프로그램 속도 이슈가 발생하여, 원인 분석 결과.. DB 쿼리 쪽에서 시간이 많이 걸리고 있었습니다.

정확한 분석을 위해 해당 쿼리에 대한 plan을 떠보았고 조건문에 있는 칼럼 값들은 분명 index로 잘 잡혀있는데 막상 실행은 full scan으로 하고 있는 것입니다..... 

 

그래서!! 여러 방면으로 테스트한 결과 아래와 같은 결과가 나왔습니다.

 


1. 별칭으로 JOIN 했을 경우

 

iSQL> SELECT

    2   B.CELL_NO, A.CLBAK, A.ID

    3   FROM 테이블1 A, 테이블2 B

    4   WHERE A.SEQ = 75291

    5   AND A.SEQ = B.SEQ

    6   AND B.KEY = '010';

 

    CELL_NO                    CLBAK                    ID                        

----------------------------------------------------------------------------------------------

        010                           3                       A                               

1 row selected.

------------------------------------------------------------

 

PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 90, COST: 673755.73 )

JOIN ( METHOD: HASH, COST: 282173.95 )

SCAN ( TABLE: 테이블1 A, INDEX: 테이블1_PK, RANGE SCAN, ACCESS: 1, DISK_PAGE_COUNT: 1152, COST: 32.60 )

HASH ( ITEM_SIZE: 64, ITEM_COUNT: 1, DISK_PAGE_COUNT: 64, ACCESS: 1, COST: 282173.95 )

SCAN ( TABLE: 테이블2 B, FULL SCAN, ACCESS: 1315799, DISK_PAGE_COUNT: 20800, COST: 14125.22 )

------------------------------------------------------------

 

 


2. JOIN을 하지 않았을 경우

 

iSQL> SELECT

    2   B.CELL_NO, A.CLBAK, A.ID

    3   FROM 테이블1 A, 테이블2 B

    4   WHERE A.SEQ = 75291

    5   AND B.SEQ= 75291

    6   AND B.KEY = '010';

 

    CELL_NO                    CLBAK                    ID                        

----------------------------------------------------------------------------------------------

        010                           3                       A                               

1 row selected.

------------------------------------------------------------

 

PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 90, COST: 414122.47 )

JOIN ( METHOD: STORE_NL, COST: 22540.69 )

SCAN ( TABLE: 테이블1 A, INDEX: 테이블1_PK, RANGE SCAN, ACCESS: 1, DISK_PAGE_COUNT: 1152, COST: 32.60 )

STORE ( ITEM_SIZE: 40, ITEM_COUNT: 1, DISK_PAGE_COUNT: 0, ACCESS: 1, COST: 22540.69 )

SCAN ( TABLE: 테이블2 B, INDEX: 테이블2_PK, RANGE SCAN, ACCESS: 1, DISK_PAGE_COUNT: 20800, COST: 140.34 )

 


3. INNER JOIN을 사용했을 경우

 

iSQL> SELECT

    2   B.CELL_NO, A.CLBAK, A.ID

    3   FROM 테이블1 A

    4   INNER JOIN 테이블2 B

    5   ON A.SEQ= 75291

    6   AND A.SEQ = B.SEQ

    7   AND B.KEY = '010';

 

    CELL_NO                    CLBAK                    ID                        

----------------------------------------------------------------------------------------------

        010                           3                       A                               

1 row selected.

------------------------------------------------------------

 

PROJECT ( COLUMN_COUNT: 3, TUPLE_SIZE: 90, COST: 809263.70 )

JOIN ( METHOD: INDEX_NL, COST: 417681.91 )

SCAN ( TABLE: 테이블1 A, INDEX: 테이블1_PK, RANGE SCAN, ACCESS: 1, DISK_PAGE_COUNT: 1152, COST: 32.60 )

SCAN ( TABLE: 테이블2 B, INDEX: 테이블2_PK, RANGE SCAN, ACCESS: 1, DISK_PAGE_COUNT: 20800, COST: 14125.22 )

------------------------------------------------------------

 


 

결론,

Table을 JOIN 할 때 각 테이블 별로 조건문 처리 또는 INNER JOIN으로 수행해야 한다.



 제 글에서 부족하거나 잘못된 부분이 있다면 댓글로 남겨주시길 부탁드립니다.

※ 제 글은 제가 코딩하면서 지속해서 확인하기 위한 히스토리 성 정보들이자 회사 생활 중 실제 프로그램을 코딩하며 중요하거나 필요했던 정보들을 공유하기 위해 적은 글입니다.