database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 40198 게시물 읽기
No. 40198
full scan 이유를 알고 싶습니다.(between)
작성자
초보디비(chunsesori)
작성일
2013-07-17 16:31
조회수
7,998

INDEX 관련하여 질문올립니다.

조회하고자하는 테이블은 하나입니다.
옵티마이저는 CBO(ALL_ROWS)입니다.

데이터딕셔너리 

[옵티마이저 정보]
------------------------------------ ----------- ------------------------------
optimizer_capture_sql_plan_baselines boolean     FALSE
optimizer_dynamic_sampling           integer     2
optimizer_features_enable            string      11.2.0.3
optimizer_index_caching              integer     0
optimizer_index_cost_adj             integer     100
optimizer_mode                       string      ALL_ROWS
optimizer_secure_view_merging        boolean     TRUE
optimizer_use_invisible_indexes      boolean     FALSE
optimizer_use_pending_statistics     boolean     FALSE
optimizer_use_sql_plan_baselines     boolean     TRUE

데이터딕션너리의 모든 칼럼을 조회하니 지저분하네요. 
utraedit에 copy해서 보심 잘보이는데ㅜㅜ;;

[테이블 정보]
 
OWNER               |TABLE_NAME                    |TABLESPACE_NAME               |CLUSTER_NAME                  |IOT_NAME                      |STATUS  |  PCT_FREE|  PCT_USED| INI_TRANS| MAX_TRANS|INITIAL_EXTENT|NEXT_EXTENT|MIN_EXTENTS|MAX_EXTENTS|PCT_INCREASE| FREELISTS|FREELIST_GROUPS|LOG|B|  NUM_ROWS|    BLOCKS|EMPTY_BLOCKS| AVG_SPACE| CHAIN_CNT|AVG_ROW_LEN|AVG_SPACE_FREELIST_BLOCKS|NUM_FREELIST_BLOCKS|DEGREE              |INSTANCES           |CACHE     |TABLE_LO|SAMPLE_SIZE|LAST_ANALYZE|PAR|IOT_TYPE    |T|S|NES|BUFFER_|FLASH_C|CELL_FL|ROW_MOVE|GLO|USE|DURATION       |SKIP_COR|MON|CLUSTER_OWNER                 |DEPENDEN|COMPRESS|COMPRESS_FOR|DRO|REA|SEG|RESULT_
--------------------|------------------------------|------------------------------|------------------------------|------------------------------|--------|----------|----------|----------|----------|--------------|-----------|-----------|-----------|------------|----------|---------------|---|-|----------|----------|------------|----------|----------|-----------|-------------------------|-------------------|--------------------|--------------------|----------|--------|-----------|------------|---|------------|-|-|---|-------|-------|-------|--------|---|---|---------------|--------|---|------------------------------|--------|--------|------------|---|---|---|-------
OPS$PKTIBG2         |FTIOIR                        |KTI2_USER                     |                              |                              |VALID   |        10|          |         1|       255|        163840|    1048576|          1| 2147483645|            |          |               |NO |N|    380680|     19356|           0|         0|         0|       1538|                        0|                  0|         1          |         1          |    N     |ENABLED |      38068|23-JUN-13   |NO |            |N|N|NO |DEFAULT|DEFAULT|DEFAULT|DISABLED|YES|NO |               |DISABLED|YES|                              |DISABLED|DISABLED|            |NO |NO |YES|DEFAULT   
   

[INDEX 정보]   
OWNER               |INDEX_NAME                    |INDEX_TYPE                 |TABLE_OWNER         |TABLE_NAME                    |TABLE|UNIQUENES|COMPRESS|PREFIX_LENGTH|TABLESPACE_NAME               | INI_TRANS| MAX_TRANS|INITIAL_EXTENT|NEXT_EXTENT|MIN_EXTENTS|MAX_EXTENTS|PCT_INCREASE|PCT_THRESHOLD|INCLUDE_COLUMN| FREELISTS|FREELIST_GROUPS|  PCT_FREE|LOG|    BLEVEL|LEAF_BLOCKS|DISTINCT_KEYS|AVG_LEAF_BLOCKS_PER_KEY|AVG_DATA_BLOCKS_PER_KEY|CLUSTERING_FACTOR|STATUS  |  NUM_ROWS|SAMPLE_SIZE|LAST_ANALYZE|DEGREE                                  |INSTANCES                               |PAR|T|G|S|BUFFER_|FLASH_C|CELL_FL|USE|DURATION       |PCT_DIRECT_ACCESS|ITYP_OWNER                    |ITYP_NAME                     |PARAMETERS                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |GLO|DOMIDX_STATU|DOMIDX|FUNCIDX_|JOI|IOT|DRO|VISIBILIT|DOMIDX_MANAGEM|SEG
--------------------|------------------------------|---------------------------|--------------------|------------------------------|-----|---------|--------|-------------|------------------------------|----------|----------|--------------|-----------|-----------|-----------|------------|-------------|--------------|----------|---------------|----------|---|----------|-----------|-------------|-----------------------|-----------------------|-----------------|--------|----------|-----------|------------|----------------------------------------|----------------------------------------|---|-|-|-|-------|-------|-------|---|---------------|-----------------|------------------------------|------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---|------------|------|--------|---|---|---|---------|--------------|---
OPS$PKTIBG2         |IDX_FTIOIR_02                 |NORMAL                     |OPS$PKTIBG2         |FTIOIR                        |TABLE|NONUNIQUE|DISABLED|             |KTI2_IND                      |         2|       255|        163840|    1048576|          1| 2147483645|            |             |              |          |               |        10|NO |         1|        710|        53421|                      1|                      3|           193171|VALID   |    376591|     376591|23-JUN-13   |1                                       |1                                       |NO |N|N|N|DEFAULT|DEFAULT|DEFAULT|NO |               |                 |                              |                              |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |YES|            |      |        |NO |NO |NO |VISIBLE  |              |YES

[INDEX 칼럼정보]
INDEX_OWNER         |INDEX_NAME                    |TABLE_OWNER         |TABLE_NAME                    |COLUMN_NAME                   |COLUMN_POSITION|COLUMN_LENGTH|CHAR_LENGTH|DESC
--------------------|------------------------------|--------------------|------------------------------|------------------------------|---------------|-------------|-----------|----
OPS$PKTIBG2         |IDX_FTIOIR_02                 |OPS$PKTIBG2         |FTIOIR                        |REMT_PROC_DATE                |              1|            8|          8|ASC
OPS$PKTIBG2         |IDX_FTIOIR_02                 |OPS$PKTIBG2         |FTIOIR                        |BRN_NO                        |              2|            3|          3|ASC
OPS$PKTIBG2         |IDX_FTIOIR_02                 |OPS$PKTIBG2         |FTIOIR                        |INST_NO                       |              3|            3|          3|ASC



between을 이용하여 아래와 같이 조회한경우 INDEX RANGE SCAN을 합니다.

SQL> SELECT
  2    count(*)
  3  FROM FTIOIR
  4  WHERE REMT_PROC_DATE BETWEEN '20120616' AND '20130715';


Execution Plan
----------------------------------------------------------
Plan hash value: 3219804720

-----------------------------------------------------------------------------------
| Id  | Operation         | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |               |     1 |     9 |     4   (0)| 00:00:01 |
|   1 |  SORT AGGREGATE   |               |     1 |     9 |            |          |
|*  2 |   INDEX RANGE SCAN| IDX_FTIOIR_02 |   520 |  4680 |     4   (0)| 00:00:01 |
-----------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access("REMT_PROC_DATE">='20120616' AND
              "REMT_PROC_DATE"<='20130715')


Statistics
----------------------------------------------------------
          0  recursive calls
          0  db block gets
          5  consistent gets
          0  physical reads
          0  redo size
        527  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

SQL> 


그러나 아래와 같이 INDEX 정보외에 필터링 정보를 추가할경우 INDEX를 타지않고
TABLE FULL SCAN을 합니다.

SQL> SELECT
  2    count(*)
  3  FROM FTIOIR
  4  WHERE REMT_PROC_DATE BETWEEN '20120616' AND '20130715'
  5      AND REMT_TYPE = 'O';

Elapsed: 00:00:01.17

Execution Plan
----------------------------------------------------------
Plan hash value: 48264840

-----------------------------------------------------------------------------
| Id  | Operation          | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |    11 |  9236   (4)| 00:02:47 |
|   1 |  SORT AGGREGATE    |        |     1 |    11 |            |          |
|*  2 |   TABLE ACCESS FULL| FTIOIR | 38388 |   412K|  9236   (4)| 00:02:47 |
-----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("REMT_PROC_DATE">='20120616' AND "REMT_TYPE"='O' AND
              "REMT_PROC_DATE"<='20130715')


Statistics
----------------------------------------------------------
          1  recursive calls
          1  db block gets
      19616  consistent gets
      19611  physical reads
          0  redo size
        528  bytes sent via SQL*Net to client
        520  bytes received via SQL*Net from client
          2  SQL*Net roundtrips to/from client
          0  sorts (memory)
          0  sorts (disk)
          1  rows processed

또 아래 처럼 BETWEEN 조회 내용을 COUNT(*)에서 *로 변경할경우 TABLE full scan을 합니다.

SQL> SELECT
  2  *
  3  FROM FTIOIR
  4  WHERE REMT_PROC_DATE BETWEEN '20120616' AND '20130715';

78976 rows selected.

Elapsed: 00:00:14.74

Execution Plan
----------------------------------------------------------
Plan hash value: 85254115

----------------------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |        | 76777 |   112M|  9259   (4)| 00:02:47 |
|*  1 |  TABLE ACCESS FULL| FTIOIR | 76777 |   112M|  9259   (4)| 00:02:47 |
----------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("REMT_PROC_DATE">='20120616' AND
              "REMT_PROC_DATE"<='20130715')


Statistics
----------------------------------------------------------
        213  recursive calls
          1  db block gets
      24757  consistent gets
      19611  physical reads
          0  redo size
   65754035  bytes sent via SQL*Net to client
      58435  bytes received via SQL*Net from client
       5267  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
      78976  rows processed


아래 2개의 SQL TABLE full scan하는 이유를 알고 싶습니다.

많은 고수님의 조언부탁드립니다. (between이 무조건 index 안 태운다는 내용은 말고 ㅡㅡㅋ)
이 글에 대한 댓글이 총 2건 있습니다.

소프트파싱으로 해보시

채용근(taiji97)님이 2013-07-18 00:04에 작성한 댓글입니다.

안녕하세요. INDEX 질문 관련한 짧은 소견 입니다.

CBO 환경하에서는 옵티마이저가 통계정보등 종합적으로 판단하여 Plan을 생성하는데요.

질문하신 Index와 검색조건을 보니 Index는 3개의 컬럼(REMT_PROC_DATE, BRN_NO , INST_NO)
으로된 결합 Index 이고 검색조건에 따른 결과 ROW는 78976 인가 보네요.

일반적으로 Index를 이용하면 속도가 빠르다고 생각하는데 Index는 싱글블럭 I/O에 랜덤하게 Table을 Access하기 때문에 일량이 많으면 오히려 Full Scan보다 불리할수 있습니다.

질문하신 부분을 보니

Q1). between을 이용하여 아래와 같이 조회한경우 INDEX RANGE SCAN을 합니다.
SQL> SELECT                                               
  2    count(*)                                           
  3  FROM FTIOIR                                          
  4  WHERE REMT_PROC_DATE BETWEEN '20120616' AND '20130715';

 A1) REMT_PROC_DATE 가 Index 선두 컬럼으로 되어있고 Count만 하면 되니 즉, Index만 스캔만 해도 원하는 결과를 얻을수 있으니 옵티마이저가 Index를 이용하였을 거구요.

Q2) 그러나 아래와 같이 INDEX 정보외에 필터링 정보를 추가할경우 INDEX를 타지않고
TABLE FULL SCAN을 합니다.


SQL> SELECT
  2    count(*)
  3  FROM FTIOIR
  4  WHERE REMT_PROC_DATE BETWEEN '20120616' AND '20130715'
  5      AND REMT_TYPE = 'O'

A2)  REMT_TYPE = 'O' 조건을 추가 했는데 Full Table Scan을 한 이유는 아마도  REMT_TYPE 컬럼은 IDX_FTIOIR_02 Index에 없기 때문에 IDX_FTIOIR_02 Index를 이용하더라도 다시 rowid를 이용하여 랜덤하게 78976번 정도 Table Access 해서 검색조건에 해당하는지 체크를 해야하기 때문에 옵티마이저가 생각하기에 Full Table Scan이 유리하다고 판단한듯 합니다.

Q3) 또 아래 처럼 BETWEEN 조회 내용을 COUNT(*)에서 *로 변경할경우 TABLE full scan을 합니다.


SQL> SELECT
  2  *
  3  FROM FTIOIR
  4  WHERE REMT_PROC_DATE BETWEEN '20120616' AND '20130715';

A3) 2번 답변과 비슷한데 Select List 전체를 가져오라고 했기 때문에 인텍스를 히용하더라도 결과를 뽑기위해 랜덤하게 Table Access 해서 결과를 가져와야 하기 때문에 Full Table Scan이 유리하다고 판단한듯 합니다.

Index를 이용하면 유리하다고 판단 되시면 힌트를 이용하여 옵티마이저가 Index를 이용하도록 유도하시면 될듯 합니다.

 

forever님이 2013-07-18 17:58에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
40201프로시져 루핑관련 질문입니다. [8]
량디
2013-07-19
7064
40200orage for oracle 5.0 시리얼 번호 알수 없나요? [1]
김가영
2013-07-19
8782
40199DB에서 결과가 되돌아 오지 않는 경우는? [1]
줄리아
2013-07-18
6074
40198full scan 이유를 알고 싶습니다.(between) [2]
초보디비
2013-07-17
7998
40197고정 ROW을 지정 할수있나요? [1]
이상덕
2013-07-17
6656
40196쿼리에서 없는 항목도 나와야 하는데.. [3]
한상원
2013-07-15
6379
40195[Jeus] 9i에서 11g로 업그레이드 하였는데요~
조기영
2013-07-15
5901
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다