Oracle - HINT2

(DB) Oracle/SQL 2017. 1. 18. 22:43

                            [ TABLE HINT]
 


<<Optimization Approaches and Goals - Optimization  접근과 목적>>
  

/*+ ALL_ROWS */
 
  ALL_ROWS는
Full Table Scan을 선호하며 CBO(Cost Based Optimization)는 default로
  ALL_ROWS를 선택 합니다.         
        
   SQL>SELECT /*+ ALL_ROWS */  ename, hiredate FROM emp  WHERE ename like '%%%'
       
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: ALL_ROWS (Cost=1 Card=5 Bytes=80)
   1    0   TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=5 Bytes=80)
 
 
 
/*+ CHOOSE */

  Hint Level의 CHOOSE는 RBO(Rule Based Optimization)인지 CBO(Cost Based Optimization)
  인지를 선택 합니다.

   만약 주어진 table의 통계 정보가 없다면 Rule Based 접근 방식을 사용 합니다.
 
 
 
/*+ FIRST_ROWS */

   Full Table Scan보다는 index scan을 선호하며
   Interactive Application인 경우 best response time을 제공 합니다.

   또한 sort merge join보다는 nested loop join을 선호 합니다.
 
   SQL>SELECT /*+ FIRST_ROWS */  ename FROM emp WHERE empno=7876
 
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=1 Card=1 Bytes=20)
   1    0   TABLE ACCESS (BY INDEX ROWID) OF 'EMP' (Cost=1 Card=1 Bytes=20)
   2    1     INDEX (RANGE SCAN) OF 'PK_EMP' (UNIQUE) (Cost=1 Card=1)
 
 
 
/*+ RULE */


   Rule Based 접근 방식을 사용하도록 지정 합니다.



<<Access Methods - 접근 방법>>
 
 
/*+ CLUSTER(table_name) */

  Cluster Scan을 선택하도록 지정한다. 따라서 clustered object들에만 적용 됩니다.
 

 
/*+ FULL(table_name) */

  Table을 Full Scan하길 원할 때 사용 합니다.

 

/*+ HASH(table) */

  Hash scan을 선택하도록 지정한다.
  이 hint는 HASHKEYS parameter를 가지고 만들어진 cluster내에 저장된 table에만 적용이 됩니다.
 
 

/*+ INDEX(table_name index_name) */

  지정된 index를 강제적으로 쓰게끔 지정 합니다.
 
 
 
/*+ INDEX_ASC(table_name index_name) */

  지정된 index를 오름차순으로 쓰게끔 지정 합니다.
  Default로 Index Scan은 오름차순 입니다
 

 
/*+ INDEX_DESC(table_name index_name) */
 
  지정된 index를 내림차순으로 쓰게끔 지정 합니다.
 
 
   SQL>SELECT /*+ index_desc(emp pk_emp) */  empno
           FROM   emp
           WHERE  rownum = 1 ;
        
    위 문장은 제일 큰 것 하나만 조회되므로,
max function의 기능을 대신할 수 있습니다.    



 /*+ INDEX_FFS(table index) */

  Full table scan보다 빠른 Full index scan을 유도 합니다.
 
 

/*+ ROWID(table) */


  Rowid로 Table Scan을 하도록 지정 합니다.



<<Join Orders>>


/*+ ORDERED */


  From절에 기술된 테이블 순서대로 join이 일어나도록 유도 합니다.

 



<<Join Operations>>
 
 
/*+ USE_HASH (table_name) */

  각 테이블간 HASH JOIN이 일어나도록 유도 합니다.
 
 

/*+ USE_MERGE (table_name) */


  지정된 테이블들의 조인이 SORT-MERGE형식으로 일어나도록 유도 합니다.



<<Parallel Execution>>
 
 
/*+ NOPARALLEL(table_name) */
 
  NOPARALLEL hint를 사용하면, parallel query option을 사용하지 않도록 할 수 있다.
 
  SQL>SELECT /*+ NOPARALLEL */ *  FROM emp;
 
 
 
/*+ PARALLEL(table_name, degree) */

 
  PARALLEL hint를 사용하면 query에 포함된 table의 degree를 설정할 수 있습니다.
 
  예를 들어, 다음과 같이 hint를 적어 degree 4로 parallel query option을  실행하도록 할 수 있습니다.
  이 때 parallel이란 글자와 괄호( '(' )사이에 blank를 넣지 않도록 주의해야 합니다.
  
  SQL>SELECT /*+ PARALLEL(emp, 4) */   * FROM emp;
 
 
 
* DEGREE의 의미 및 결정
 
Parallel Query에서 degree란 하나의 operation 수행에 대한 server process의 개수 입니다.
이러한 degree 결정에 영향을 주는 요인들에는 다음과 같은 것들이 있습니다.
 
(1)  system의 CPU 갯수
(2)  system의 maximum process 갯수
(3)  table이 striping되어 있는 경우, 그 table이 걸쳐있는 disk의 갯수
(4)  data의 위치 (즉, memory에 cache되어 있는지, disk에 있는지)
(5)  query의 형태 (예를 들어 sorts 혹은 full table scan)
 
한 사용자만이 parallel query를 사용하는 경우, sorting이 많이 필요한
작업과 같은 CPU-bound 작업의 경우는 CPU 갯수의 1 ~ 2배의 degree가 적당하며,
sorting보다는 table scan과 같은 I/O bound 작업의 경우는 disk drive 갯수의 1 ~ 2배가 적당합니다.
 
동시에 수행되는 parallel query가 많은 경우에는 위의 각 사용자의 degree를
줄이거나 동시에 사용하는 사용자 수를 줄여야 합니다.

                                                   자료출처 : http://www.oracleclub.com/

'(DB) Oracle > SQL' 카테고리의 다른 글

Oracle - JOIN 개념  (0) 2017.01.18
Oracle - PLAN_INDEX  (0) 2017.01.18
Oracle - HINT  (0) 2017.01.18
Oracle - DDL  (0) 2017.01.18
Oracle - SQL개념  (0) 2017.01.18
Posted by 농부지기
,

Oracle - HINT

(DB) Oracle/SQL 2017. 1. 18. 22:42

SQL문 HINT

1. JOIN  Hint             

2. Index Hint             

3. SubQuery Hint     

4. Order By Hint       

 

 

JOIN Hint

1.  /*+ USE_MERGE( b c) */             : b, c table을 SORT_MERGE 조인 해라

2. /*+ ORDERED USE_NL(x y) */       : x, y table간에 NESTED LOOPS 조인

3. /*+ USE_CONCAT */                     :

    

 

 

Index Hint

 

SubQuery Hint

1./*+ PUSH_SUBQ */  : subquery를 먼저 풀어서 main query에 공급자(제공자)역활을 할 수있도록 한다.

                                             간혹, 적용되지 않는 경우도 있다.

 

Order By

1. /*+ ordered */  : from 절에 기술된 순서(테이블 순서)대로 driving(join 순서)되라는 hint

   

 

 

'(DB) Oracle > SQL' 카테고리의 다른 글

Oracle - JOIN 개념  (0) 2017.01.18
Oracle - PLAN_INDEX  (0) 2017.01.18
Oracle - HINT2  (0) 2017.01.18
Oracle - DDL  (0) 2017.01.18
Oracle - SQL개념  (0) 2017.01.18
Posted by 농부지기
,

Oracle - DDL

(DB) Oracle/SQL 2017. 1. 18. 22:41

                               [ SQL- DDL 문장 ]


☞ DML 종류

 

1. CREATE TABLE : 새로운 데이블을 생성
2. DROP TABLE : 기존 테이블의 구조 및 모든 행을 삭제 
3. ALTER TABLE : 기존 테이블을 변경 - 컬럼의 추가,수정,삭제, 제약조건 추가,삭제,활성화,비활성화
4. TRUNCATE : 기존 테이블의 구조는 남기고 모든 행을 삭제
5. RENAME : object의 이름을 바꿈
6. COMMENT : 테이블이나 컬럼에 주석문 달기

※ 이러한 명령어는 모두 데이터 정의 명령어(DDL)로서 실행 시 자돈 COMMIT되고 ROLLBACK 될 수
   없으므로 주의해서 실행

 

 

☞ DROP TABLE

 

형식 : DROP TABLE 테이블명 [CASCADE CONSTRAINTS] ;
            - CASCADE CONSTRAINTS 옵션은 종속된 제약조건을 삭제

 

☞ ALTER TABLE

 

(1) 칼럼에 대한 변경
ㅇ 칼럼의 추가 : ALTER TABLE 테이블명 ADD (컬럼 datatype [DEFAULT 형식][CONSTRAINT 정의]
                                                                  [,컬럼 datatype]...);
ㅇ 칼럼의 수정 : 기존에 존재하는 컬럼의 크기와 데이터 타입의 변경
               : ALTER TABLE 테이블명 MODIFY(컬럼 datatype [DEFAULT 형식]
                                                   [NOT NULL 제약조건][,컬럼datatype]...);
ㅇ 칼럼의 삭제 : ALTER TABLE 테이블명 CROP COLUMN 컬럼
※ 한번에 하나씩, PK 칼럼을 삭제할 경우 CASCADE CONSTRAINTS 옵션을 사용할 것

ㅇ 사용불가 상태로 전환 : ALTER TABLE 테이블명 SET UNUSED [ COLUMN ] 칼럼 ;
    -  SET UNUSED 상태의 칼럼 제거 : ALTER TABLE 테이블명 DROP UNUSED COLUMNS ;
                                   : DROP의 시간 소요를 단축할 수 있음.

(2) Constraint에 대한 변경
ㅇ 제약조건의 추가 : ALTER TABLE 테이블명 ADD [CONSTRAINT 제약 조건명] 제약조건유형 (칼럼명);
   ※ NOT NULL 제약조건은 테이블 레벨 제약조건으로 기술 불가, MODIFY절 활용
ㅇ 제약조건의 삭제 : ALTER TABLE 테이블명 DROP CONSTRAINT 제약 조건명 [CASCADE] ;
ㅇ 제약조건의 활성화{비활성화} : ALTER TABLE 테이블명 ENABLE{DISABLE} CONSTRAINT 제약 조건명;
ㅇ CASCADE 옵션 : 참조하는 CHILD까지도 같이 수정 및 삭제시 활용
ㅇ NOVALIDATE CONSTRAINT 옵션 : 기존에 입력된 데이터에 대해서는 제약 조건을 Check하지 않고
                                향후 수정 혹은 새로 입력되는 데이터에 대해서만 제약 조건을
                                Check하여 수행력 향상
                              : ALTER TABLE 테이블명 ENABLE NOVALIDATE CONSTRAINT 제약 조건명;


☞ TRUNCATE

 

TRUNCATE TABLE 테이블명 ;


☞ RENAME

 

RENAME 이전이름 TO 새로운 이름



☞ COMMENT

 

ㅇ 테이블이나 칼럼에 주석문 달기
    - 테이블에 달기 : COMMENT ON TABLE 테이블명 IS '주석문장' ;
    - 칼럼에 달기   : COMMENT ON TABLE 테이블명.칼럼명 IS '주석문장' ;


 

 

'(DB) Oracle > SQL' 카테고리의 다른 글

Oracle - JOIN 개념  (0) 2017.01.18
Oracle - PLAN_INDEX  (0) 2017.01.18
Oracle - HINT2  (0) 2017.01.18
Oracle - HINT  (0) 2017.01.18
Oracle - SQL개념  (0) 2017.01.18
Posted by 농부지기
,