ANALYZE란?

ANALYZE는 인덱스, 테이블, 클러스터의 통계정보를 생성 한다.

ANALYZE가 생성한 통계정보들은 비용기준(Cost-based)의 옵티마이저가 가장 효율적인 실행계획을 수립하기 위해 최소비용을 계산할 때 사용 된다.

각 오브젝트의 구조를 확인하는 것과 체인(Chain) 생성 여부를 확인할 수 있으므로 시스템의 저장공간 관리를 도와준다.

ANALYZE는 다음과 같은 통계정보를 생성하여 데이터 사전에 저장 한다.
  • - 테이블 : 총 로우의수, 총 블럭의 수, 비어있는 블럭에 쓰여질 수 있는 빈 공간의 평군, 체인이 발생된 로우의 수, 로우의 평균 길이
  • - 인덱스 : 인덱스의 깊이(Depth), Leaf block의 개수, Distinct Key의 수, Leaf Blocks/Key의 평균, Data blocks/key의 평균, Clustering Factor, 가장 큰 key 값, 가장 작은 key 값
  • - 컬럼 : Distinct한 값의 수, 히스토그램 정보
  • - 클러스터 : Cluster Key당 길이의 평균
문법

object-clause : TABLE, INDEX, CLUSTER중에서 해당하는 오브젝트를 기술하고 처리할 오브젝트 명을 기술 한다.

operation : operation 옵션에는 다음 3가지중 한가지 기능을 선택할 수 있다.

  • COMPUTE : 각각의 값들을 정확하게 계산 한다. 가장 정확한 통계를 얻을 수 있지만 처리 속도가 가장 느리다.
                        (테이블에 저장되어 있는 모든 행을 대상으로 통계정보를 수집한다.)
  • ESTIMATE : 자료사전의 값과 데이터 견본을 가지고 검사해서 통계를 예상 한다. COMPUTE보다 덜 정확 하지만 처리속도가 훨씬 빠르다
                        (오라클 서버의 자동화 알고리즘에 의해 데이터를 추출하여 통계정보를 수집한다.)
  • DELETE : 테이블의 모든 통계 정보를 삭제 한다
                     (수집되어 있는 통계정보를 삭제한다.)

정보수집

주기적인 ANALYZE 작업을 수행 시켜 주어야 한다.

테이블을 재생성 하거나, 새로 클러스터링을 한 경우, 인덱스를 추가하거나 재생성한 경우, 다량의 데이터를 SQL이나 배치 애플리케이션을 통해 작업한 경우 ANALYZE를 수행 시켜 주는 것이 좋다.

사용자는 USER_TABLES, USER_COLUMNS, USER_INDEXS, USER_CLUSTER 등의 자료사전 뷰를 통해 정보를 확인할 수 있다

테이블을 ANALYZE 시킨다면 거기에 따르는 인덱스들도 같이 실시하는 것이 좋다.


오라클에서는 20,000건 이하의 행수를 가진 데이터에 대해서는 COMPUTE STATISTICS절의 사용을 권장하며 20,000건 이상되는 경우에는 ESTIMATE STATISTICS절의 사용을 권장하고 있다. 또한, 통계정보의 분석은비 일과시간에 수행하는게 원칙이며 일과 시간에 수행해야 하는 경우라면 ESTIMATE STATISTICS절의 사용을 권장한다.



테이블 정보수집 예제
SQL> ANALYZE TABLE emp COMPUTE STATISTICS ;

새로운 정보를 구하기 전에 기존 정보를 삭제
SQL> ANALYZE TABLE emp DELETE STATISTICS;


특정 column에 대한 data 분포 수집
SQL> ANALYZE TABLE emp COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;


통계 정보의 확인 예제

 SQL> SELECT NUM_ROWS
, BLOCKS
, EMPTY_BLOCKS
, AVG_SPACE
, CHAIN_CNT
, AVG_ROW_LEN
, SAMPLE_SIZE
, LAST_ANALYZED
FROM USER_TABLES
WHERE TABLE_NAME = 'CMS_CATEGORY';
 
SQL> SELECT NUM_DISTINCT
, DENSITY
, LOW_VALUE
, HIGH_VALUE
, LAST_ANALYZED
, COLUMN_NAME
FROM USER_TAB_COL_STATISTICS
WHERE TABLE_NAME = 'CMS_CATEGORY';
 
오라클을 통해 작업할 시
insert시점에서 정상적으로 인덱싱이 되지 않는 경우가 발생한다.
특히 결합인덱스를 많이 사용하고 있는 경우 발생될 확률이 높다.
 
이런경우 오라클의 Analyzed를 통해서 해결이 가능하고
어느정도의 실행속도를 향상 시킬 수있다.
(실제 오라클사에서도 3개월에 한번씩은 Analyze를 실행하라 권고하고 있다.)
 

[Analyzed 확인 방법]
1-1. 테이블 통계정보
SELECT TABLE_NAME
     , BLOCKS  
-- 해당 데이터가 저장되어 있는 블록 수.
     , NUM_ROWS  -- 데이터 행 수.
     , AVG_ROW_LEN  -- 하나의 행의 평균 길이.
     , TO_CHAR( LAST_ANALYZED, 'YYYYMMDD' )
  FROM USER_TABLES
[WHERE TABLE_NAME = '테이블명']

1-2. 테이블 통계정보
SELECT TABLE_NAME
          , COLUMN_NAME  
-- 컬럼명
          , LOW_VALUE       -- 해당 컬럼에 저장되어 있는 최소값.
          , HIGH_VALUE      -- 해당 컬럼에 저장되어 있는 최대값.
          , NUM_DISTINCT   -- 유일한 값의 수. (히스토그램 기준)
  FROM USER_TAB_COLUMNS
[WHERE TABLE_NAME = '테이블명']

2. 인덱스 통계정보
SELECT INDEX_NAME
     , BLEVEL                        
-- 인덱스의 깊미(Depth)
     , LEAF_BLOCKS              -- 리프 블록의 수.
     , DISTINCT_KEYS            -- 인덱스 컬럼의 유일한 값의 수.
     , CLUSTERING_FACTOR  -- 조건을 만족하는 데이터를 검색할 때 인덱스 키 값이 각 블록에 얼마나 잘 분산 저장되어 있는지를 나타내는 정도.
     , NUM_ROWS                 -- 전체 행수.
     , TO_CHAR( LAST_ANALYZED, 'YYYYMMDD' )
  FROM USER_INDEXES
 
ex) SELECT TABLE_NAME
                , NUM_ROWS
                , TO_CHAR( LAST_ANALYZED, 'YYYYMMDD' )
      FROM USER_TABLES;
TABLE_NAME                       NUM_ROWS TO_CHAR(
------------------------------ ---------- --------
ABS_TYPE                               38 20040101
ANNIVERS                              183 20040101
APPRFLDRHISTORY                       570 20040101
APPRFOLDER                          16885 20040101
APPRFOLDER_ERR                       3670 20040101
APPRFORM                              359 20040101
.
.
.
USR_INFO_ADMIN                          0 20040101
VAR_DEPT_INFO                           0 20040101
VIEW_TYPE                               0 20040101
WASTEBOX                                0 20040101
ZIP_CODE                            44195 20040101
252 rows selected.
 
※ 참고 : desc user_tables 에서 보통 num_rows 로도 확인 가능
             
 
[특정 Table만 Analyze 하는 방법]
 
ANALYZE TABLE DOCUMENT COMPUTE STATISTICS
ex) DOCUMENT Table 만 Analyze
 
ANALYZE INDEX XPKDOCBOX COMPUTE STATISTICS
ex) XPKDOCBOX Index 만 Analyze
 
[전체 Table Analyze 하는 간단한 방법]
 
1. vi analyze_all.sql
    SELECT 'analyze table || table_name || estimate statistics;' FROM USER_TABLES
 
2. @analyze_all.sql
 
3. set heading off
     set echo off
     set feedback off
     set pagesize 300  (line 이 300 미만일 경우)
     spool analyze_table.sql
     /
     spool off
 
4. vi analyze_table.sql
    필요없는 Line 제거 및 정리
 
5. @analyze_table.sql
 

[전체 Index Analyze 하는 간단한 방법]
 
1. vi analyze_all.sql
    SELECT 'analyze index || index_name || estimate statistics;' FROM USER_INDEXES
 
2. @analyze_all.sql
 
3. set heading off
     set echo off
     set feedback off
     set pagesize 300  (line 이 300 미만일 경우)
     spool analyze_index.sql
     /
     spool off
 
4. vi analyze_index.sql
    필요없는 Line 제거 및 정리
 
5. @analyze_index.sql

 

===========================================================================================================================
===========================================================================================================================

 

출처 : http://blog.naver.com/vxxv122?Redirect=Log&logNo=130128144052

 

정의

→ 비용기반 옵티마이저에서 통계정보를 모아주기 위한 튜닝 도구.

    테이블과 인덱스, 클러스터, 컬럼에 대한 통계정보를 수집.

권한

→ Analyze Any 시스템 권한

통계 수집

1 . 테이블

→ Analyze Table 테이블명 Compute Statistics;

* Row수, 사용된 Block수, 사용안된 Block수, 사용가능한 평균공간, 변경된 Row수, 컬럼당 distinct 값수

  컬럼당 두번째로 가장 작은 값, 컬럼당 두번째로 가장 큰 값

   (질문) 왜 두번째로 가장 작은값과 큰값을 ?

2 . 인덱스

→ Analyze Index 인덱스명 Estimate Statistics;

* 인덱스 레벨, 레벨 Block수, distinct Key수, Key당 Leaf와 Data Block수 평균, Clustering Factor, 최소 Key 값

  최대 Key값

3 . 클러스터

→ Analyze Cluster 클러스터명 Delete Statistics;

* Cluster Key당 길이의 평균

4 . 컬럼

→ Analyze Table 테이블명 Compute Statistics For Table;

→ Analyze Table 테이블명 Compute Statistics For Columns 컬럼명 Size 75;

→ Analyze Table 테이블명 Compute Statistics For All Indexed Columns Size 75;

* 디볼트 버켓 수는 75개

  Distinct 한 값의 수, 히스토그램 정보

유효성 검사

→ Analyze Table 테이블명 Validate Structure [Cascade];

* 검사하려는 테이블과 관련된 모든 테이블을 검사하려면 Cascade 옵션 사용.

옵션

1 . Compute

→ 테이블에 저장되어 있는 모든 행을 대상으로 통계정보 수집

2 . Estimate

→ 오라클 서버의 자동화 알고리즘에 의해 데이터를 추출하여 통계정보를 수집

3 . Delete

→ 수집되어 있는 통계정보를 삭제

* 20,000건 이하의 Row는 Compute 권장, 이상은 Estimate 권장.

확인

1 . User_Tables

2 . User_Tab_Columns

3 . User_Indexes, Index_Stats, Index_histogram

4 . User_Cluster

5 . DBA_Analyze_Objects


 


===========================================================================================================================
===========================================================================================================================



출처 : http://www.oracleclub.com/article/23928

 

1. 개요
- TABLE, COLUMN, 그리고 INDEX 에 대한 통계 정보를 수집 하게 하는 PROCEDURE
 
2. SYNTAX 
DBMS_STATS.GATHER_TABLE_STATS (OWNNAME          VARCHAR2, 
                               TABNAME          VARCHAR2, 
                               PARTNAME         VARCHAR2 DEFAULT NULL,
                               ESTIMATE_PERCENT NUMBER   DEFAULT TO_ESTIMATE_PERCENT_TYPE 
                                                                            (GET_PARAM('ESTIMATE_PERCENT')), 
                               BLOCK_SAMPLE     BOOLEAN  DEFAULT FALSE,
                               METHOD_OPT       VARCHAR2 DEFAULT GET_PARAM('METHOD_OPT'),
                               DEGREE           NUMBER   DEFAULT TO_DEGREE_TYPE(GET_PARAM('DEGREE')),
                               GRANULARITY      VARCHAR2 DEFAULT GET_PARAM('GRANULARITY'), 
                               CASCADE          BOOLEAN  DEFAULT TO_CASCADE_TYPE(GET_PARAM('CASCADE')),
                               STATTAB          VARCHAR2 DEFAULT NULL, 
                               STATID           VARCHAR2 DEFAULT NULL,
                               STATOWN          VARCHAR2 DEFAULT NULL,
                               NO_INVALIDATE    BOOLEAN  DEFAULT  TO_NO_INVALIDATE_TYPE (
                                                                 GET_PARAM('NO_INVALIDATE')),
                               FORCE            BOOLEAN DEFAULT FALSE);

 

3. PARAMETER 설명
- DBMS_STATS.SET_PARAM 에 의해서 디폴트 파라미터 설정 변경이 가능하다.
- 수동 통계정보 생성 시에 저정을 하지 않았을 때 적용되는 DEFAULT 값에 영향을 미치는 값
    => CASCADE
    => DEGREE
    => ESTIMATE_PERCENT
    => METHOD_OPT
    => NO_INVALIDATE
    => GRANULARITY
- 자동 통계정보(GATHER_STATS_JOB) 시에만 영향을 미친다.
    => AUTOSTATS_TARGET [ AUTO   : ORACLE이 자동으로 대상 OBJECT 결정, 
                          ALL    : 대상 시스템의 모든 OBJECTS
                          ORACLE : SYS/SYSTEM OBJECT 만 ]

 

1) DEFAULT 값 확인
    SELECT DBMS_STATS.GET_PARAM('METHOD_OPT') FROM DUAL ;

 

    DBMS_STATS.GET_PARAM('METHOD_OPT')
    ----------------------------------
    FOR ALL COLUMNS SIZE AUTO
 
2) DEFAULT 값 변경 
    EXECUTE DBMS_STATS.SET_PARAM('METHOD_OPT', 'FOR ALL COLUMNS SIZE 1') ;

 

    PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
 
3) 변경된 DEFAULT 값 확인

    SELECT DBMS_STATS.GET_PARAM('METHOD_OPT') FROM DUAL ;

 

    DBMS_STATS.GET_PARAM('METHOD_OPT')
    ---------------------------------- 
    FOR ALL COLUMNS SIZE 1
    

Parameter

Description

OWNNAME분석할 테이블 소유자
TABNAME테이블 이름
PARTNAME파티션 이름, 지정 하지 않으면 NULL 값
ESTIMATE_PERCENT- 분석할 Row의 Percentage, NULL 이면 Compute(Row 전체)
- 유효값은 1/1000000 ~ 100 
- 디폴트로, DBMS_STATS.AUTO_SAMPLE_SIZE 에 의해서 최적의 값을 결정
BLOCK_SAMPLE- random block sampling or random row sampling 결정
- random block sampling 이 좀더 효과적이다.
- 데이터의 블록 별 분포도가 안좋을 시에는 부적절한 정보 생성
- 디폴트 값이 False로, random row sampling 을 수행한다.
METHOD_OPT- Histogram 생성시 사용하는 옵션
    * FOR ALL [ INDEXED | HIDDEN ] COLUMNS [ size_clause ]
    * FOR COLUMN [ size clause ] column | attribute [size clause] [, column|attribute [ size clause ]…]
- Size_clause := SIZE { integer | REPEAT | AUTO | SKEWONLY }
    => Integer  : Histogram Bucket 수, Max 는 1,254
    => REPEAT   : 이미 Histogram 이 있는 칼럼에 대해서만 생성
    => AUTO     : 데이터 분산도와 칼럼 부하 정도에 따라서 생성 결정
    => SKEWONLY : 데이터 분산도에 따라서 생성 결정
- 디폴트 값은 FOR ALL COLUMNS SIZE AUTO 이다.
- 즉, Histogram 의 생성여부를 Oracle 이 알아서 판단하게 된다.
- 이 경우 EX) method_opt => FOR ALL COLUMNS SIZE 1
    => 모든 컬럼에 대해서 Histogram bucket 의 수를 1로 한다.
      즉, 컬럼 내에 존재하는 여러 가지 값들의 cardinality 는 모두 동일한 값으로 간주한다. ( histogram 을 사용하지 않는다.) 
      이것은 where 조건에 들어오는 특정 컬럼에 대한 값의 변화에 따라서 PLAN 이 변경될 가능성을 없애고자 함이다.
- FOR ALL COLUMNS SIZE 1 로 설정하여 Histogram 정보가 생성되지 않도록 조치 한다.
DEGREE- 병렬처리 정도
- 디폴트 값은 NULL 이고, CREATE TABLE, ALTER TABLE 시 설정된 DEGREE 값에 의해 정해진다.
- AUTO_DEGREE 값은 병렬처리 정도를 자동으로 결정한다.
- 이것은 1 or DEFAULT_DEGREE [ Object Size 와 CPU Count 에 의해 결정 ]
GRANULARITY- Parition table 에 대한 분석시 사용
    => ‘ALL’                  : Global, Partition, Subpartition 통계정보 수집 – Parition Table 대상
    => ‘AUTO’                 : 디폴트 값으로 ,Partition Type 에 따라서 결정 – 일반 Table 대상
    => ‘DEFAULT’              : Global, Partition 통계정보 수집, Old Version 과 호환을 위해 사용
    => ‘GLOBAL’               : Global 통계정보 수집
    => ‘GLOBAL AND PARTITION’ : SubPartition 에 대한 통계정보는 수집되지 않는다.
    => ‘PARTITION’            : Partition 통계정보 수집
    => ‘SUBPARTITION’         : SubPartition 통계정보 수집
CASCADE- 대상 테이블의 인덱스에 대한 통계수집 여부
- 인덱스 통계정보는 병렬처리가 불가능하다.
- TRUE : 대상 테이블에 관련된 index 에 대해서 통계정보 수집
STATTAB- 통계수집을 통한 기존 통계정보 Update 전에, 기존에 존재하는 통계정보를 저장할 User Stat Table 을 지정
STATID- Stattab 와 연관된 구분자 값
STATOWN- Stattab 에 지정한 User Stat Table 의 소유자가 다를 경우 지정
NO_VALIDATE- 의존적인 Cursor를 Invalidate 할지 , 안할지 결정
    => True : 관련된 Cursor 를 invalidate 하지 않는다.
    => False : 디폴트 값으로, 관련된 Cursor 를 Invalidate 한다. 
- Default 로 DBMS_STATS.AUTO_INVALIDATE 값이고, 의미는 DBMS 가 의존적 Cursor를 언제 invalidate 할지 자동으로 결정
- 이때 작용하는 Parameter는 _OPTIMIZER_INVALIDATION_PERIOD 이고, Default 롤 18000 초(5시간) 이다.
- 즉, 통계 정보 수집에 의해 통계 정보가 변경된 후 약 5시간에 걸쳐 랜덤한 시점에 해당 Cursor가 실행될 때 invalidation이 발생한다. 
- 이것을 Auto Invalidation이라고 부른다.
- 일정 시간에 걸쳐 랜덤하게 Cursor를 Invalidation함으로써 특정 시점에 Hard Parse가 한꺼번에 몰리는 현상을 피할 수 있다. 
FORCE- Lock 걸린 Table 에 대해서도 강제로 통계정보 생성

 

4. Test
1) Mission
    CASCADE => TRUE
        E 인덱스에 대한 통계정보도수집하라.
    
    CASCADE => FALSE
        E 인덱스에 대한 통계정보도수집하라.
    
    METHOD_OPT =>'FOR ALL COLUMNS SIZE 1'
        E 칼럼(HIGH AND LOW COLUMN VALUE)에 대한 통계정보도 수집하라.
    
    METHOD_OPT =>'FOR COLUMNS'
        E컬럼에 대한통계정보를 수집하지 마라

 

2) Test 
2-1) 일반 테이블
    SHOW USER

 

    USER IS"SYS"

 

    ① SCOTT의 BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고, 테이블, 칼럼(HIGHAND LOW COLUMN VALUE), 
       연관 인덱스의 통계정보를 생성한다.( COMPUTE STATISTICS )

       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT', 
                                         TABNAME    => 'BIG_TABLE', 
                                         CASCADE    => TRUE,
                                         METHOD_OPT => 'FOR ALL COLUMNS SIZE 1');
 
    ② SCOTT의 BIG_TABLE의 15% ROW를 가지고, 테이블, 칼럼, 연관인덱스의 통계정보를 생성한다.( SAMPLE 15 PERCENT )
       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME          => 'SCOTT',
                                         TABNAME          => 'BIG_TABLE', 
                                         CASCADE          => TRUE, 
                                         ESTIMATE_PERCENT => 15);

 

    ③ SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블의 통계정보를 수집하라. 
       인덱스와 칼럼에 대한 통계정보는 제외
       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
                                         TABNAME    => 'BIG_TABLE', 
                                         CASCADE    => FALSE, 
                                         METHOD_OPT => 'FOR COLUMNS');
 
    ④ SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블과인덱스에 대한 통계정보를 수집하라. 
       칼럼에 대한 통계정보는 제외
       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
                                         TABNAME    => 'BIG_TABLE', 
                                         CASCADE    => TRUE, 
                                         METHOD_OPT => 'FOR COLUMNS');

 

    ⑤ SCOTT의 BIG_TABLE의 전체 테이블과 모드 인덱스를 가지고, 테이블과 컬럼(NO HISTOGRAM),

       그리고 인덱스에 대한 통계정보를 수집하라.
       잠시 후에 인덱스 칼럼들의 HISTOGRAM 통계정보를 수집하라.

       EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME => 'SCOTT',
                                         TABNAME => 'BIG_TABLE', 
                                         CASCADE => TRUE);

       잠시 후에..

       EXEC DBMS_STATS.GATHER_TABLE_STATS(OWNNAME    =>'SCOTT',
                                          TABNAME    => 'BIG_TABLE', 
                                          CASCADE    => TRUE,
                                          METHOD_OPT => 'FOR ALL INDEXED COLUMNSSIZE 1');

 

    ⑥ SCOTT 의 BIG_TABLE 의 전체 테이블과 모드 인덱스를 가지고, 테이블과 인덱스칼럼(ONLY HIGH AND LOW )에

       대한 통계정보를 수집하라. 인덱스에 대한 통계정보는수집하지 마라.
        EXECDBMS_STATS.GATHER_TABLE_STATS(OWNNAME    => 'SCOTT',
                                          TABNAME    => 'BIG_TABLE', 
                                          CASCADE    => FALSE,
                                          METHOD_OPT => 'FOR ALL INDEXED COLUMNSSIZE 1');
 
2-2) PARTITIONTABLE 의 경우 
    ① 추가적으로 GRANULARITY 정보를 'ALL', 'AUTO', 'PARITION', 'GLOBAL AND PARTITION', 'GLOBAL', 'SUBPARTITION'을

       통해서 통계수집 대상 TABLE SEGMENT를 선정 가능하다.
 
 
    ② 참고 
        - LOCK VS DBMS_STATS.GATHER_TABLE_STATS
            : DML 이 LOCK 이 발생 하여도 GATHER_TABLE_STATS 는 정상적으로 진행된다.

            BEGIN
                FOR I IN 1001 .. 5000 LOOP
                    INSERT INTO CHECK_LOCK VALUES ( I , I , 'LOCK');
                END LOOP ;
            END ;
            /

        - @CHECK_USER_LOCK.SQL
            ENTER VALUE FOR USER_NAME: SCOTT10
            OLD  46: AND B.USERNAME =UPPER('&USER_NAME')
            NEW  46: AND B.USERNAME =UPPER('SCOTT10')
            
            USERNAME    SID LOCK_TYPE       MODE_HELD   MODE_REQUE LOCK_ID1 LOCK_ID2
            ---------- ---- --------------- ----------- ---------- -------- --------
            SCOTT10     151 DML             ROW-X (SX)  NONE       51782    0
            SCOTT10     151 TRANSACTION     EXCLUSIVE   NONE       131077   307

        - EXECUTE DBMS_STATS.GATHER_TABLE_STATS(OWNNAME =>'SCOTT10',TABNAME => 'CHECK_LOCK');
        
        ==> DML LOCK 과는 무관하게 진행 된다.



'삽질! > DATABASE' 카테고리의 다른 글

[튜닝] CBO 통계의 수집  (0) 2013.09.17
Posted by OpenHunis
,

VI 명령어 정리

삽질!/OS 2013. 9. 17. 16:30

VI 명령어


VI 커맨드 라인 명령어


COMMAND LINE 명령어 내용

vi ${FILE_NAME} vi를 시작하여 지정한 파일 편집

vi -r ${FILE_NAME} 읽기 전용(read-only) 편집기로서 vi를 시작하여 지정한 파일 편집

view ${FILE_NAME} 읽기 전용(read-only) 편집기로서 vi를 시작하여 지정한 파일 편집

vi -r 되살릴 수 있는 모든 파일 이름 보여주기

vi -r ${FILE_NAME} vi를 시작하여 지정한 파일 되살리기

VI 편집 명령어


삽입


명령어 내용

i 입력 모드로 전환, 커서 위치 앞에서 삽입

I 입력 모드로 전환, 현재 줄의 앞에 삽입

a 입력모드로 전환, 커서 위치 뒤에서 삽입

A 입력모드로 전환, 현재 줄의 뒤에 삽입

o 입력모드로 전환, 현재 줄의 아래에서 시작

O 입력모드로 전환, 현재 줄의 위에서 시작

:set autoindent 자동으로 들여쓰기 적용

:set noautoindent 자동으로 들여쓰기 미적용

편집하고 있는 파일을 바꾸기


명령어 내용

:e ${FILE_NAME} 지정한 파일의 편집

:e! ${FILE_NAME} 지정한 파일의 편집, 자동 점검의 생략

내용 고치기


명령어 내용

r 단지 한 글자만 변경(입력 모드로 바뀌지 않음)

R 입력하는 대로 겹쳐 써서 변경

s 삽입에 의해 한 단어의 변경

S 전체 줄을 삽입에 의한 변경

C 커서의 위치로부터 줄 끝까지 삽입에 의한 변경

cc 전체 줄을 삽입에 의한 변경

cmove 커서부터 move까지 삽입에 의해 변경

~ 대,소문자 바꾸기

고치기의 취소 또는 반복


명령어 내용

u 편집 버퍼를 수정했던 마지막 명령을 취소

U 현재 줄을 저장

. 편집 버퍼를 수정했던 마지막 명령을 반복

문자 삭제


명령어 내용

x 커서가 있는 문자 삭제

X 커서의 왼쪽 문자 삭제

D 커서부터 줄의 끝까지 삭제

dd 현재 줄의 전체 삭제

dmove 커서부터 move까지 삭제

dG 커서부터 편집 버퍼의 끝까지 삭제

d1G 커서부터 편집 버퍼의 맨 앞까지 삭제

:<line>d 지정한 줄의 삭제

:<line>,<line>d 지정한 범위의 삭제

여러 줄의 복사와 이동


명령어 내용

:<line>co<target> 지정한 줄을 복사하여 target 줄 밑에 삽입

:<line>,<line>co<target> 지정한 범위를 복사하여 target 줄 밑에 삽입

:<line>m<target> 지정한 줄로 이동하여 target 줄 밑에 삽입

:<line>,<line>m<target> 지정한 범위로 이동하여 target 줄 밑에 삽입

데이터를 처리하기 위한 셀 명령의 사용


명령어 내용

<n>!!command n번 줄에서 command의 실행

!move command 커서부터 move까지 command 실행

!move fmt 커서부터 move까지 줄들을 형식 맞추기

데이타 저장


명령어 내용

:w 원래의 파일로 데이타를 저장

:w ${FILE_NAME} 지정한 파일로 데이타를 저장

:w>>${FILE_NAME} 지정한 파일에 데이타를 추가

:wq 데이타를 저장하고 종료

:q! 데이타를 저장하지 않고 종료

디스플레이 제어


명령어 내용

:set number 내부 줄 번호 보여주기

:set nonumber 내부 줄 번호 숨기기

마지막으로 지운 것 복사하기


명령어 내용

p 마지막으로 지워진 것을 커서의 뒤/아래에 삽입

P 마지막으로 지워진 것을 커서의 앞/위에 삽입

xp 두 문자를 바꿈

deep 두 단어를 바꿈

ddp 두 줄을 바꿈

패턴 검색


명령어 내용

/rexp 지정된 정규 표현식에 대해 앞으로 검색

/ 이전의 패턴에 대해 앞으로 검색을 반복

?rexp 지정된 정규 표현식에 대해 뒤로 검색

? 이전의 패턴에 대해 뒤로 검색을 반복

n / 또는 ? 명령에 대해 같은 방향으로 반복

N / 또는 ? 명령에 대해 반대 반향으로 반복

약어의 사용


명령어 내용

:ab short long short를 long에 대한 약어로 변경

:ab 현재 약어 목록을 표시

:una short 약어 short를 표시

줄 길이의 조정


명령어 내용

r<Return> 문자를 뉴라인으로 변경

J 아래 라인을 현재 라인과 합치기

:set wm=n 오른쪽으로 n문자 위치에서 자동적으로 줄 나눔

커서 이동


명령어 내용

h or <Left Key> 커서를 한 칸 왼쪽으로 이동

j or <Down Key> 커서를 한 칸 아래로 이동

k or <Up Key> 커서를 한 칸 위로 이동

l or <Right Key> 커서를 한 칸 오른쪽으로 이동

<Backspace> 커서를 한 칸 왼쪽으로 이동

<Space> 커서를 한 칸 오른쪽으로 이동

- 커서를 이전 줄의 처음으로 이동

+ 커서를 다음 줄의 처음으로 이동

<Return> 커서를 다음 줄의 처음으로 이동

0 커서를 현재 줄의 맨 앞으로 이동

$ 커서를 현재 줄의 맨 끝으로 이동

^ 커서를 현재 줄의 첫글자(공백이나 탭이 아닌)로 이동

w 커서를 다음 단어의 첫 글자로 이동

e 커서를 다음 단어의 끝 글자로 이동

b 커서를 이전 단어의 첫 글자로 이동

W w와 같은(문장 부호 무시)

E e와 같음(문장 부호 무시)

B b와 같음(문장 부호 무시)

( 다음 문장의 처음으로 이동

) 이전 문장의 처음으로 이동

{ 다음 문단의 처음으로 이동

} 이전 문단의 처음으로 이동

H 커서를 화면 맨 위로 이동

M 커서를 중간으로 이동

L 커서를 맨 아래로 이동

^ f 한 화면 아래로 이동

^b 한 화면 위로 이동

^d 반 화면 아래로 이동

^u 반 화면 위로 이동

n^d n줄만큼 아래로 이동

n^u n줄만큼 위로 이동

편집 버퍼를 통한 이동


명령어 내용

:!command vi를 중단하고 지정한 셸 명령을 실행

:!! vi를 중단하고 이전의 셸 명령을 실행

:!sh vi를 중단하고 셸을 실행

:!csh vi를 중단하고 새로운 C-셸을 실행

패턴에 의한 치환


명령어 내용

:s/<pattern>/<replace>/ 현재 줄의 치환

:<line>s/<pattern>/<replace> 지정한 줄의 치환

:<line>,<line>s/<pattern>/<replace>/ 정한 범위의 치환

:%s/<pattern>/<replace>/ 모든 줄의 치환

데이터 읽기


명령어 내용

:<line>r ${FILE_NAME} 파일의 내용을 지정한 줄 다음에 삽입

:r ${FILE_NAME} 파일의 내용을 현재의 줄 다음에 삽입

:<line>r !command command의 결과를 지정한 줄 다음에 삽입

:r !command command의 결과를 현재의 줄 다음에 삽입

:r !look <pattern> 지정한 pattern으로 시작된 단어 삽입

정규식에서 사용하는 패턴 기호


명령어 내용

. 뉴라인을 제외한 모든 단일 문자와 대응

* 영 또는 그 이상의 선행 문자와 대응

^ 줄의 시작과 대응

$ 줄의 끝과 대응

\< 단어의 시작과 대응

\> 단어의 끝과 대응

[ ] 묶여진 문자중의 하나와 대응

[^ ] 묶여진 문자를 제외한 아무것하고나 대응

\ 이어지는 기호를 문자 그대로 해석

줄 번호


명령어 내용

[n]G 줄번호 n으로 건너뛰기

1G 편집 버퍼의 첫 줄로 건너뛰기

G 편집 버퍼의 마지막 줄로 건너뛰기

:map g lG g가 lG와 같도록 매크로 정의

Posted by OpenHunis
,

■ CBO 내부 구조

  ○ Estimator는 Cardinality, Selectivity, Cost를 계측
  ○ Plan의 조사는 정교한 내부 알고리즘에 의하여 일정 시간 내에 완료
  ○ 최종적으로 가장 Cost가 작은 Plan이 선택


◆ Cardinality
  - 어떤 Row set에 속하는 Row들의 갯수
◆ Selectivity
  - 어떤 Row set에 특정한 조건을 적용하는 경우 그 조건을 만족하는 Row들의 비율
  - 쿼리의 술어(Predicate)나 컬럼값들의 분포도와 밀접한 관련이 있음.
◆ Cost
  - 하나의 SQL문장을 수행하기 위해 필요한 리소스의 소요량(I/O횟수, CPU사용량, 메모리 사용량, 네트워크 전송량)
  - Cardinality 및 Selectivity를 기반으로 계산

1 1 1 1 1 1 1 1 2 1

Cardinality : 값이 다른 것이 몇 개 있는가? 여기서는 카디널리티가 2임.
Selectivity : 특정 값이 뽑힐 확률. 2가 뽑힐 확률은 2/10 = 0.5임. 즉 여기서는 Selectivity가 0.5임.




■ CBO와 통계정보
  ○ Cardinality, Selectivity, 그리고 궁극적으로 Cost 계산을 위해서는 데이터의 정확한 통계 정보 필요
  ○ 통계정보는 Static Dictionary에 저장
    - 자동으로 바뀌지 않아, 사용자에 의한 수집이 필요. 바꾸려면 DDL을 날려줘야 함.
    - 두가지 방법 : Analyze명령 또는 DBMS_STATS 패키지 이용


◆ Analyze 명령

SQL> analyze table scott.emp compute statistics;
SQL> analyze table scott.emp estimate statistics;

통계정보를 새로 만들 때는 compute.
이전에 만들어져 있는 통계정보를 검증할 때는 estimate.

◆ DBMS_STATS 패키지

SQL> exec dbms_stats.gather_table_stats ('scott', 'emp');


◆ 히스토그램

SQL> analyze table scott.emp compute statistics for columns ename;

히스토그램은 특별한 통계정보로써, 데이터가 한쪽으로 쏠리면 기존의 통계정보는 먹지 않는데, 이때 사용할 수 있는 것이 히스토그램임.
단점은 히스토그램 만드는데 오랜 시간이 걸리고, 저장공간 또한 많이 차지하기 때문에 일반 통계정보를 만들어서 잘 작동하면 그거 쓰면 되고, 그게 만족스럽지 못할 때 그때 히스토그램을 쓰면 된다.


□ 히스토그램 가이드라인
  - 데이터 분포의 불균형이 심한 컬럼에만 사용
  - 추가적 저장공간이 필요하므로 상당한 성능 개선이 있는 경우에만 사용
  - 바인드 변수를 사용하는 경우 Histogram은 사용되지 않음.


■ 정리
  - 어떤 테이블에 1억건의 데이터가 들어있다는 통계정보가 있는데, 9천 건을 삭제해도 통계정보는 그대로이다. 이유는 DML이기 때문이다. 그러나 truncate같은 DDL을 날린다면 통계정보가 바뀐다. 그래서 통계정보만 바꿔주는 dbms_stats 패키지나 analyze명령을 날려주면 통계정보가 변경된다. 그러나 이거 한번 날려줄 때마다 서버에 부하가 심하다. 그리하여 업무시간에는 절대 통계정보를 업데이트 하면 안된다.
  - 10g는 위 명령이 자동으로 1시간에 한번씩 업데이트 된다. 9i는 관리자가 수동으로 날려줘야 한다. 그러나 우리가 배웠던 cron을 이용하여 자동으로 업무 이외 시간에 돌려주게끔 하면 된다.
  - 테이블이나 인덱스가 급격히 바뀌었을 때 통계정보를 변경해서 분석해주면 된다.


출처:겨울섬님 블로그

Posted by OpenHunis
,