'2017/01/18'에 해당되는 글 81건

  1. 2017.01.18 Oracle - 예제_SELECT_GROUP
  2. 2017.01.18 Oracle - 예제_SELECT
  3. 2017.01.18 Oracle - 예제_MERGE
  4. 2017.01.18 Oracle - 예제_INSERT
  5. 2017.01.18 Oracle - 예제_DELETE
  6. 2017.01.18 Oracle - ROWNUM 개념
  7. 2017.01.18 Oracle - SUB QUERY 개념
  8. 2017.01.18 Oracle - JOIN 개념
  9. 2017.01.18 Oracle - PLAN_INDEX
  10. 2017.01.18 Oracle - HINT2

                              [SELECT GROUP 예제]

 

☞ GROUP 관련 기본문장형태

 

   SELECT 칼럼명, GROUP 함수
   
FROM   테이블명
   
WHERE  조건식
   
GROUP BY 칼럼명
   
HAVING 조건식
   
ORDER BY 칼럼이나 표현식 ;

☞ SUBGROUP으로 데이터 분류

 

   ※ SELECT절에 그룹함수가 오면 SELECT절의 나머지 컬럼은 GROUP BY절에 기술되어야 함
   ※ GROUP에 대한 조건은 WHERE절에서 기술할 수 없고, HAVING절에서 기술하여야 함
   예시)
     
SELECT dept_id , AVG(salary)
     
FROM   EMP_PAY
     
GROUP BY dept_id
     
HAVING AVG(salary) >= 2000 ;

GROUP된 데이터 조건 검색

 

   예시) 각 직책별로 급여의 총합을 구하되 직책이 부장인 사람은 제외하시오.
           단, 급여총합이 10000이상인 직책만 나타내며, 급여총합에 대한 오름차순으로 정렬하시오.

   SQL>
SELECT title , SUM(salary) 급여총합
        
FROM   EMP_PAY
        
WHERE  title NOT LIKE ‘%부장’
        
GROUP BY title
        
HAVING SUM(salary) >= 10000
        
ORDER BY SUM(salary) ;

☞ ROLLUP과 CUBE를 이용한 데이터 집계

 

   예시)
   
SELECT  store_name "대리점", TO_CHAR(sale_date,'MM') "월", SUM(sale_price) "총판매액"
   
FROM    PROD_SALES
   
GROUP BY  ROLLUP  ( store_name , TO_CHAR
(sale_date,'MM') ) ;

   결과)
   [ROLLUP]
   대리점  월  총판매액  
   --------------------  
   강남점  10   400      
   강남점  11   400
   강남점  12  1400
   강남점      2200

   서초점  10   800
   서초점  11   400
   서초점  12   500
   서초점      1700
               3900

   [CUBE] 
   대리점  월  총판매액
   --------------------
   강남점  10  400
   강남점  11  400
   강남점  12 1400
   강남점     2200

   서초점  10  800
   서초점  11  400
   서초점  12  500
   서초점     1700
           10 1200
           11  800
           12 1900
              3900


 

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

Oracle - 예제_UPDATE  (0) 2017.01.18
Oracle - 예제_SUBQUERY  (0) 2017.01.18
Oracle - 예제_SELECT  (0) 2017.01.18
Oracle - 예제_MERGE  (0) 2017.01.18
Oracle - 예제_INSERT  (0) 2017.01.18
Posted by 농부지기
,

SELECT문

 

1. GROUP 순번_RANK 매기기

2. 컬럼을 ROW화

 

 

조직별로 각사원 급여 지급 순위 메기기 와  전사원에 대한 순위 메기기

SELECT org_id, emp_id, pay_mon,

               RANK() OVER(PARTITION BY org_id ORDER BY pay_mon DESC) as rank_of_org_id,

               RANK() OVER(ORDER BY pay_mon DESC) AS rank_of_all

FROM     py_payroll

WHERE  pay_ymd = '20040123'

ORDER   BY org_id, pay_mon desc;

 

결과]

 

 

설명]

RANK() OVER(PARTITION BY org_id ORDER BY pay_mon DESC) as rank_of_org_id,

   ; org_id 로 partition을 나누고, pay_mon 으로 order by를 DESC 순으로 해서 RANK(순위)를 매긴다.

 RANK() OVER(ORDER BY pay_mon DESC) AS rank_of_all

  ; 전체를 대상으로 pay_mon 으로 order by 를 DESC 순으로 해서 RANK(순위)를 매긴다.

 

컬럼으로 되어 있는 값을 로우(ROW)로 시키기

실제값]

       

 

원하는 결과]

      

 

SQL문]

SELECT decode(seq, 1, a1, 2, b1, c1 ),

             decode(seq, 1, a2, 2, b2, c2 ),

             decode(seq, 1, a3, 2, b3, c3 )

FROM   (

              SELECT seq, a1, a2, a3, b1, b2, b3, c1, c2, c3

              FROM    (SELECT 'A11' a1, 'A12' a2, 'A13' a3, 'B11' b1, 'B12' b2, 'B13' b3, 'C11' c1, 'C12' c2, 'C13' c3

                             FROM   DUAL

                             UNION ALL

                             SELECT 'A21' a1, 'A22' a2, 'A23' a3, 'B21' b1, 'B22' b2, 'B23' b3, 'C21' c1, 'C22' c2, 'C23' c3

                             FROM   DUAL

                             UNION ALL

                             SELECT 'A31' a1, 'A32' a2, 'A33' a3, 'B31' b1, 'B32' b2, 'B33' b3, 'C31' c1, 'C32' c2, 'C33' c3

                             FROM   DUAL), sys_dual

              WHERE  seq <= 3 ) ;

      

   
   

 

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

Oracle - 예제_SUBQUERY  (0) 2017.01.18
Oracle - 예제_SELECT_GROUP  (0) 2017.01.18
Oracle - 예제_MERGE  (0) 2017.01.18
Oracle - 예제_INSERT  (0) 2017.01.18
Oracle - 예제_DELETE  (0) 2017.01.18
Posted by 농부지기
,

                                [ MERGE 문 ]

☞ 정의

 

테이블에 대해 조건적으로 갱신이나 삽입을 할 수 있도록 하는 "upsert" 기능을 제공한다.
 만일 그 행이 테이블에 이미 존재한다면 갱신을 수행하고, 그렇지 않으면 새로 행을 삽입한다.
 데이터 웨어하우징 애플리케이션의 ETL 과정에 유용하다.

☞ 이점

 

 MERGE 문을 사용함으로써 하나의 SQL 문으로 하여금 갱신이나 삽입, 또는 둘 다를 수행할 수 있다.
 MERGE 문은 사용자에게 투명한 방식으로 병렬 수행된다.
 원천 테이블에 대한 스캔이 덜 일어나므로 성능의 향상이 있다.

 

   

☞ 문법

 

MERGE INTO table_name alias
          
USING (table|view|subquery) alias
          
ON    (join condition)
          
WHEN MATCHED THEN
                       
UPDATE SET col1 = val1[, col2 = val2…]
          
WHEN NOT MATCHED THEN
                       
INSERT (컬럼리스트) VALUES
 (값들....);
- INTO clause : data가 update 되거나 insert될 table 이름  
- USING clause : 대상 table의 data와 비교한 후  update 또는 insert할 때 사용할 data의 source.
- ON clause : update나 insert를 하게 될 condition으로, 해당 condition을 만족하는 row가 있으면
    WHEN MATCHED 이하를 실행하게 되고, 없으면 WHEN NOT MATCHED 이하를 실행하게 된다
    WHEN MATCHED : ON clause의 조건이 TRUE인 row에 수행할 내용
    WHEN NOT MATCHED : ON clause의 조건에 맞는 row가 없을 때 수행할 내용

 

☞ 예제

 

예1)       MERGE INTO customer C
           USING cust_src s
           ON    (c.customer_id = s.src_customer_id)
           WHEN MATCHED THEN
                      UPDATE SET c.cust_address = s.cust_address
           WHEN NOT MATCHED THEN
                     INSERT (customer_id, cust_first_name, ...)
             
        VALUES (src_customer_id, src_first_name, …);

 

           MERGE INTO Temp1 a
           USING ( select first from Temp2) t
           ON    (a.first = t.first)            
           WHEN MATCHED THEN
                     UPDATE SET    second = 'second',
                                   third  = 'third',
           WHEN NOT MATCHED THEN
                      INSERT (first,second,third)
                     
VALUES ('first','second','third') ;

 

 

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

Oracle - 예제_SELECT_GROUP  (0) 2017.01.18
Oracle - 예제_SELECT  (0) 2017.01.18
Oracle - 예제_INSERT  (0) 2017.01.18
Oracle - 예제_DELETE  (0) 2017.01.18
Oracle - ROWNUM 개념  (0) 2017.01.18
Posted by 농부지기
,

                                [ INSERT ]

☞ 형식

 

- 기본문형 : INSERT INTO [ALL] [ 조건절 ]
             [
INSERT ~ VALUES | SUBQUERY ]
- 조건절 : [
ALL][FIRST]
           [
WHEN 조건 THEN][INSERT ~ VALUES ]
           [
ELSE] [INSERT ~ VALUES
]

☞  SELECT 문을 이용한 INSERT

 

1.  INSERT  INTO TABLE_NAME1
             (   
SELECT ...
                 
FROM   TBL_NAME2 ) ;

  : Oralce 에서는 Insert 와 Select 문을 같이 사용 할 경우에는
VALUES  문을 사용하지 않는다.

조건부 INSERT ALL

 

예시) INSERT ALL
      WHEN
  product_id IN ( SELECT product_id FROM promotional_items )
      
INTO   promotional_sales
      
VALUES (product_id, list_price)
      WHEN   order_mode = 'online'
      
INTO   web_orders
      
VALUES (product_id, order_total)
      
SELECT product_id, list_price, order_total,order_mode
      
FROM
  orders;

▣ 조건절이 없는 INSERT
        : SQL> INSERT ALL
                 INTO sal_log VALUES (id , salary , title )
                 INTO date_log VALUES (id , start_date , title )
                 SELECT id , salary , start_date , title
                 FROM s_emp
                 WHERE id > 20 ;      

조건절이 있는 ALL INSERT
      예시) 사번이 20번보다 큰 사원의 사번, 급여, 입사일, 직책을 선택하여 사번, 급여,
            직책은 SAL_LOG 테이블에 입력하되 급여가 850보다큰 직원만 입력하고, 사번, 입사일,
            직책은 DATE_LOG 테이블에 입력하되 단 입사일이 91년 1월 1일 이전인 직원만 입력.

     SQL>    INSERT ALL
             WHEN salary > 850 THEN
             INTO sal_log VALUES (id , salary , title )
             WHEN start_date < '91/01/01' THEN
             INTO date_log VALUES (id , start_date , title )
             SELECT id , salary , start_date , title
             FROM s_emp
             WHERE id > 20 ;

조건부 INSERT FIRST

 

INSERT FIRST
WHEN
order_total> 10000 THEN
    INTO priority_handling VALUES (id)
WHEN order_total > 5000 THEN
    INTO special_handling VALUES (id)
WHEN total > 3000 THEN
    INTO privilege_handling VALUES (id)
ELSE
    INTO regular_handling VALUES (id)
    
SELECT order_total, order_id id  FROM
 orders;

※ 무조건 첫번째 조건인 salary>=4000인 조건의 데이터는 DEPT_SAL 테이블에 들어가고,
   나머지 데이터 salary<4000인 데이터 중에서 입사일 조건에 따라 각각의 테이블에 입력

      예시) SQL>  INSERT FIRST
                     WHEN salary >= 4000 THEN
                        INTO dept_sal VALUES (dept_id , salary)
                     WHEN start_date LIKE  '90%' THEN
                        INTO dept_date_90 VALUES (dept_id , start_date)
                     WHEN start_date LIKE  '91%' THEN
                        INTO dept_date_91 VALUES (dept_id , start_date)
                     ELSE
                     INTO dept_date VALUES (dept_id , start_date )
                     SELECT dept_id , SUM(salary) SALARY, MAX(start_date) START_DATE
                     FROM S_EMP
                     GROUP BY dept_id ;

☞ Pivot INSERT

 

예시)  SQL> INSERT ALL
             INTO sale_data VALUES (id, week_id, sales_mon)
             INTO sale_data VALUES (id, week_id, sales_tue)
             INTO sale_data VALUES (id, week_id, sales_wed)
             INTO sale_data VALUES (id, week_id, sales_thur)
             INTO sale_data VALUES (id, week_id, sales_fri)
             SELECT id,week,sales_mon,sales_tue,sales_wed,sales_thur, sales_fri
             FROM main_sale ;



 

 

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

Oracle - 예제_SELECT  (0) 2017.01.18
Oracle - 예제_MERGE  (0) 2017.01.18
Oracle - 예제_DELETE  (0) 2017.01.18
Oracle - ROWNUM 개념  (0) 2017.01.18
Oracle - SUB QUERY 개념  (0) 2017.01.18
Posted by 농부지기
,

Oracle - DELETE 문

 

1. JOIN 후 DELETE

delete from TBt_SBATPAME aa

where aa.ech_code = ( select comm_tract_cd from  tb_store_master b where  aa.ech_code = b.comm_tract_cd

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

Oracle - 예제_MERGE  (0) 2017.01.18
Oracle - 예제_INSERT  (0) 2017.01.18
Oracle - ROWNUM 개념  (0) 2017.01.18
Oracle - SUB QUERY 개념  (0) 2017.01.18
Oracle - JOIN 개념  (0) 2017.01.18
Posted by 농부지기
,

        [ Oracle - ROWNUM 개념 ]  

 

1. ROWNUM

 

1. 정의 : 조회된 결과의 자료에 순번을 부여한다.
          ROWNUM과 ORDER BY 의 순서는  ROWNUM이 부여 된 후 ORDER BY 절이 수행된다.
          그래서, ORDER BY 후 의 순번을 원할 경우  inline view를 통해서 다시한번
          ROWNUM을 하면 된다.

2. 예)
SELECT ROWNUM, *
       
FROM   EMP
       
ORDER  BY NAME;

   예) 
SELECT ROWNUM, *
       
FROM  (SELECT *
              
FROM   EMP
              
ORDER  BY NAME );   

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

Oracle - 예제_INSERT  (0) 2017.01.18
Oracle - 예제_DELETE  (0) 2017.01.18
Oracle - SUB QUERY 개념  (0) 2017.01.18
Oracle - JOIN 개념  (0) 2017.01.18
Oracle - PLAN_INDEX  (0) 2017.01.18
Posted by 농부지기
,

                              [ SUB QUERY 개념 ]  

 

0. SUB QUERY

  1. 구성 : 서브쿼리는 InnerQuery 와 OuterQuery로 구성되어 있다.
2. 종류 : SINGLE ROW, MULTI ROW, MUTI COLUMN, CORRELATED 로 나뉘며,
          이 들 각각이 다시 중복되어 사용될 수 있으므로 SINGLE ROW MULTI COLUMN,
          MULTI ROW MULTI COLUMN, SINGLE ROW CORRELATED, MULTI ROW CORRELATED등으로
          세분화 될 수 있다.
1. SINGLE ROW 서브 쿼리
  1. 정의 : SELECT에서 결과로 나오는 행의 수가 단 한 행이며, 단 한 컬럼인 경우

2. 예)
FROM  TEMP
       
WHERE SALARY = (SELECT MAX(SALARY)  FROM  TEMP);
2. MULTI ROW 서브 쿼리
 

1. 정의 : SELECT에서 결과로 나오는 행의 수가 한 행 이상이며, 단 한 컬럼인 경우

2. 예)
FROM  TEMP
       
WHERE DEPT_CODE IN (SELECT DEPT_CODE FROM TDEPT  WHERE  AREA = '인천');

3. MULTI COLUMN 서브 쿼리
 

1. 정의 : SELECT에서 결과로 나오는 행의 수가 한 행 이상이며, 여러 컬럼인 경우

2. 예)
FROM  TEMP
       
WHERE (DEPT_CODE, EMP_ID) IN (SELECT DEPT_CODE, BOSS_ID FROM TDEPT WHERE AREA = '인천');

4. CORRELATED 서브 쿼리
 

1. 정의 : InnerQuery에서 OuterQuery의 어떤 컬럼 값을 사용하는 경우이다.
          InnerQuery(흔히 SUB QUERY라고 함)와 OuterQuery(흔히 MAIN QUERY라고 함)가 서로
          단순히 여관관계가 있는 것이 아니고 서로 값을 주고 받는 연관관계가 성립한다.

2. 참고 : 일반적인 서브쿼리는 SUBQUERY의 결과를 MAIN QUERRY가 이용한다.
          하지만 CORRELATED 서브쿼리는 SUB QUERRY가 MAIN QUERY의 값을 이용하고,
          그렇게 구해진 SUB QUERY의 값을 다시 MAIN QUERY가 다시 이용하게 된다.

3. 예)  
FROM   TEMP A
        
WHERE  SALARY  >  (SELECT AVG(SALARY)
                           
FROM   TEMP B
                           
WHERE  B.LEV  =  A.LEV);
  설명) 직원 중 자신의 연봉이 자신과 같은 LEV에 해당하는 직원의 평균 SALARY보다 많은 경우에
        이 사원의 사번과 성명을 읽어 오는 QEURY이다.

4. 예)
UPDATE  TDEPT  A
       
SET     A.BOSS_ID  =  (SELECT  MIN(B.EMP_ID)
                              
FROM    TEMP  B
                              
WHERE   B.DEPT_CODE  = A.DEPT_CODE);

5. ANY와 ALL
 

1. 정의 : ANY와 ALL 연산자는 서브쿼리와 함께 쓰이거나 값들의 집합과 함께 쓰여 비교된다.

2. 예) SALARY 가 (100, 200, 300)중의 어떤 값 하나보다 큰 값인가를 비교하고 싶을 때
       SALARY > ANY(100, 200, 300)

3. 예) ALL은 집합의 모든 값 보다 어떤가로 비교가 된다.
       SALARY > ALL(100, 200, 300)은  100, 200, 300모두 보다 큰 값인가?로 될 것이다.

4. 예)
FROM   TEMP
       
WHERE  SALARY > ANY (SELECT  SALARY
                            
FROM    TEMP
                            
WHERE   LEV = '과장');
   설명) 서브쿼리를 통해 LEV='과장'인 직원의 SALRY를 TEMP에서 읽고 이중의 어떤 값 하나보다
         큰 연봉을 가진 직원의 사번,성명, 연봉을 읽어오는 쿼리이다.

5. 예) FROM   TEMP
       
WHERE  SALARY > ALL (SELECT  SALARY
                            
FROM    TEMP
                            
WHERE   LEV = '과장');
   설명) 어떤 과장보다도 연봉이 많은 직원을 읽어온다.

 

 

 

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

Oracle - 예제_DELETE  (0) 2017.01.18
Oracle - ROWNUM 개념  (0) 2017.01.18
Oracle - JOIN 개념  (0) 2017.01.18
Oracle - PLAN_INDEX  (0) 2017.01.18
Oracle - HINT2  (0) 2017.01.18
Posted by 농부지기
,

                                 [ Join 개념 ]  

Join

  1. 종류 : CARTESIAN PRODUCT, EQUI JOIN, NON-EQUI JOIN, OUTER JOIN, SELF JOIN 등
1. CARTESIAN PRODUCT  Join

 
1. 정의 : 조건 절에 조인을 위한 조건이 기술되지 않은 경우
2. 결과 : 테이블 단위로 나올 수 있는 RECORD수의 곱으로 결과가 생성된다.
2. EQUI JOIN
  1. 정의 : 조건절에 조인 조건이 기술된 경우
3. NON EQUI JOIN
 

1. 정의 : JOIN조건 절에 조인 조건이 '='(equal)이 아닌 다른 연산기호로 주어지는 경우

2. 예)
FROM  TEMP  A,   EMP_LEVEL B
       
WHERE A.BIRTH_DATE  BETWEEN  ADD_MONTHS(SYSDATE, -1 * B.TO_AGE * 12)
                           
AND      ADD_MONTHS(SYSDATE, -1 * B.FROM_AGE * 12)

4. OUTER JOIN
 

1. 정의 : 두 개 이상의 테이블 조인 시 한쪽 테이블의 행에 대해 다른 쪽 테이블에 일치하는 행이
          없더라도 다른 쪽 테이블의 행을 Null로 하여 행을 Return 하는 조인이다.

2. 추가 : OUTER JOIN 기호(+)는 NULL열이 작성되어야 하는 쪽에 기호가 붙는다.
          하나의 테이블이 OUTER JOIN의 대상으로 삼을 수 있는 테이블의 수가 한 개 뿐이다.

3. 예)
FROM  TABLE1,  TABLE2, ....
       
WHERE TABLE1.COLUMN = TABLE2.COLUMN(+)

   설명) JOIN된 컬럼 값이 TABLE2에 없더라도 TABLE1에 있으면, TABLE2의 값들 중 TABLE1과
         일치되는 값이 없는 행은 모두 NULL로 RETURN 된다.

5. SELF JOIN  
 

1. 정의 : 다른 테이블간의 JOIN이 아닌 같은 테이블을 마치 다른테이블처럼 인식시켜
          JOIN을 하는 것이다.
2. SELF JOIN을 JOINING TABLE ITSELF 라고도 한다.

 

 

 

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

Oracle - ROWNUM 개념  (0) 2017.01.18
Oracle - SUB QUERY 개념  (0) 2017.01.18
Oracle - PLAN_INDEX  (0) 2017.01.18
Oracle - HINT2  (0) 2017.01.18
Oracle - HINT  (0) 2017.01.18
Posted by 농부지기
,

1 CONCATENATION PLAN 보는 방법

 

    1.1 정의 :

    2.1 INDEX 실제 Oracle에서 실행되는 과정 1

         - in을 사용한 index 검색 plan이다. 이때 CONCATENATION 도 발생한다.    

          

 

 

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

Oracle - SUB QUERY 개념  (0) 2017.01.18
Oracle - JOIN 개념  (0) 2017.01.18
Oracle - HINT2  (0) 2017.01.18
Oracle - HINT  (0) 2017.01.18
Oracle - DDL  (0) 2017.01.18
Posted by 농부지기
,

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 농부지기
,