* dbms_job 패키지 : 알람 시계나 유닉스 cron과 같은 스케줄링 기능. 특정 시간에 특정 작업을 수행하도록 설정 할 수 있도록 오라클에서 제공되는 패키지.

 

* job 조회

select *  from user_jobs;

 

* job 등록

문법 : dbms_job.submit(){

job          out binary_integer,             -- 실행시 job 번호

what        in varchar2,                      -- 실제 수행되는 PL/SQL 이나 SQL

next_date in date default sysdate,     -- job이 수행될 다음 날짜

interval    in varchar2 default 'null',    -- job이 수행될 다음 시간

                                                         'sysdate + 7' : 일주일에  한번 실행

                                                         'next_day(sysdate,''TUESDAY'')' : 화요일마다 실행

                                                         'null' : 한번만 실행

            no_parse in boolean default false      -- 이값이 true이면 job이 수행되는 맨 처음에 job에 연관

                                                                     된 프로시저를 파싱한다. 예를들어 job 수행전

                                                                     테이블 생성 같은 다른 작업을 할 경우 true로 설정

                                                                     그 외엔 false로 설정.

         }

ex)

variable jobno number;
exec  dbms_job.submit(:jobno,'유저.프로시저;',sysdate,'sysdate+1/24/60',false);
print jobno;

 

* job 실행

exec dbms_job.run(job번호);

commit;

 

* job 정지

exec dbms_job.broken(job번호,false);

commit;

 

* job 삭제

exec dbms_job.remove(job번호);

commit;

 

'DataBase > Oracle' 카테고리의 다른 글

oracle에서 exists함수  (0) 2009.04.08
일반적인 SQL 튜닝 기법 ...  (0) 2009.02.23
Driving Table의 개념  (0) 2009.01.28
유용한 SQL  (0) 2009.01.22
oracle grouping  (0) 2008.09.23

Join된 두 개 이상의 테이블이 있을 경우에 먼저 읽는 Table이 바로 Driving Table이 됩니다.
그렇다고 아무 테이블이나 먼저 읽혀지는 것은 아닙니다.

일반적으로 상수값과 비교연산자가 되어있는 칼럼이 있는 테이블이 Driving Table가 된다. 

또한 같은 조건일 경우  Optimizer mode는 choose로 가정할 경우 Rule Mode에서는 from절의 뒤 테이블부터 Access하므로 뒤에 테이블이 Driving Tabel이 된다.(Cost Base인 경우 반대)

 

아래 그림 예시...

 

 

 

출처 : http://www.cyworld.com/shawni2you/2208453

'DataBase > Oracle' 카테고리의 다른 글

일반적인 SQL 튜닝 기법 ...  (0) 2009.02.23
oracle job  (0) 2009.02.09
유용한 SQL  (0) 2009.01.22
oracle grouping  (0) 2008.09.23
오라클 그룹함수 rollup,cube  (0) 2008.09.23

-- 테이블스페이스 삭제
-- 테이블스페이스가 오프라인으로 상태에서 명령을 내리길 권장

DROP TABLESPACE unicorn_temp
INCLUDING CONTENTS CASCADE CONSTRAINTS;

-- DATA TABLESPACE 생성
CREATE TABLESPACE unicorn_data
DATAFILE 'D:\oracle\oradata\unicorn_data.TBL' SIZE 100M
AUTOEXTEND on NEXT 10M MAXSIZE 500M
DEFAULT STORAGE
      (INITIAL     4K
              NEXT        128K
              MINEXTENTS  1
              PCTINCREASE 0);

-- INDEX TABLESPACE 생성
CREATE TABLESPACE unicorn_index
DATAFILE 'D:\oracle\oradata\unicorn_index.TBL' SIZE 100M
AUTOEXTEND on NEXT 10M MAXSIZE 500M
DEFAULT STORAGE
      (INITIAL     4K
              NEXT        128K
              MINEXTENTS  1
              PCTINCREASE 0);

-- TEMP TALBESPACE 생성
CREATE TEMPORARY TABLESPACE unicorn_temp
TEMPFILE 'D:\oracle\oradata\unicorn_temp.TBL' SIZE 100M
AUTOEXTEND on NEXT 10M MAXSIZE 500M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;


-- 사용자 생성
CREATE USER unicorn IDENTIFIED BY unicorn
DEFAULT TABLESPACE unicorn_data
TEMPORARY TABLESPACE unicorn_temp;

-- 사용자 비밀번호 변경
ALTER USER unicorn IDENTIFIED BY unicorn;

-- 권한 설정
-- 생성한 사용자에게 자신의 schema에서 테이블등을 만들 권한과 자원을 사용할 권한을 준다.
-- GRANT RESOURCE, CONNECT TO MIDAN;
-- DBA 권한을 준다.
GRANT DBA TO unicorn;

-- datafile 추가
ALTER TABLESPACE unicorn_data
ADD DATAFILE 'D:\oracle\oradata\unicorn\unicorn_dat02.dbf' SIZE 2048M;
/*
alter tablespace unicorn_data
  add datafile 'D:\oracle\oradata\unicorn\unicorn_dat02.dbf' size 50M
  autoextend on next 20M maxsize 100M

추후에 datafile에 자동증가만 추가하려면
alter database datafile 'D:\oracle\oradata\unicorn\unicorn_dat02.dbf' autoextend on next 20M maxsize 100M
계속 증가하도록 하려면 100M 대신 unlimited 사용 (32G이상 확장되지 않음)
*/

-- datafile 확인
select * from DBA_DATA_FILES;

-- 등록되어 있는 사용자보기
SELECT * FROM ALL_USERS;


-- 사용자 삭제
-- ※ CASCADE를 사용하게 되면 사용자 이름과 관련된 모든 데이터베이스 스키마가 데이터 사전으로부터
--    삭제되며 모든 스키마 객체들 또한 물리적으로 삭제 됩니다.
DROP USER scott CASCADE;


--IMPORT!, EXPORT 권한을 준다.
GRANT EXP_FULL_DATABASE, IMP_FULL_DATABASE TO unicorn;

/*
--시스템 권한 부여
GRANT CREATE USER, ALTER USER, DROP USER TO scott WITH ADMIN OPTION.
--*설명 : scott 사용자에게 사용자를 생성, 수정, 삭제 할 수 있는 권한을 부여하고,
--         scott 사용자도 다른 사용자에게 그 권한을 부여 할 수 있습니다.

--시스템 권한 박탈
REVOKE CREATE USER, ALTER USER, DROP USER FROM scott
--*설명 : scott 사용자에게 부여한 생성, 수정, 삭제 권한을 회수합니다,
*/

--사용자조회
SELECT username, default_tablespace, temporary_tablespace FROM DBA_USERS;
SELECT * FROM ALL_USERS;

-- 테이블스페이스조회
SELECT * FROM DBA_TABLESPACES;


% 그외 TIP

less..

 

-------------------------------------------------------------------------------------
※ ORACLE SID 확인

 SELECT INSTANCE
   FROM V$THREAD;
-------------------------------------------------------------------------------------
※ ORACLE DB_NAME 확인

 SELECT NAME
   FROM V$DATABASE;
-------------------------------------------------------------------------------------
※ ORACLE VERSION 확인
 
 SELECT *
   FROM V$VERSION;
-------------------------------------------------------------------------------------
※ ORACLE USER 확인

SELECT *
  FROM ALL_USERS;
-------------------------------------------------------------------------------------
※ 등록된 USER 목록 보기

SELECT USERNAME, USER_ID
  FROM DBA_USERS
 ORDER BY
USERNAME;
-------------------------------------------------------------------------------------
※ USER가 소유한 모든 테이블 보기

SELECT TABLE_NAME
  FROM USER_TABLES;
-------------------------------------------------------------------------------------
※ 사용자 정보

SELECT USERNAME, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE
  FROM DBA_USERS;
-------------------------------------------------------------------------------------
※ 오브젝트 조회

SELECT *
  FROM ALL_OBJECTS
 WHERE OBJECT_NAME LIKE '명';
-------------------------------------------------------------------------------------
※ 테이블 조회

SELECT *
  FROM ALL_TABLES
 WHERE TABLE_NAME LIKE '명';
-------------------------------------------------------------------------------------
※ 시퀀스 정보

SELECT *
  FROM USER_SEQUENCES;
-------------------------------------------------------------------------------------
※ 시노님 조회

SELECT *
  FROM ALL_SYNONYMS
 WHERE SYNONYM_NAME='명';
-------------------------------------------------------------------------------------
※ 테이블 인덱스 정보 조회

SELECT *
  FROM ALL_IND_COLUMNS
 WHERE TABLE_NAME='테이블명';
-------------------------------------------------------------------------------------
※ 테이블의 컬럼 정보 조회

SELECT *
  FROM ALL_TAB_COLUMNS
 WHERE TABLE_NAME='테이블명';
-------------------------------------------------------------------------------------
※ TABLE COMMENT 쿼리

SELECT *
  FROM ALL_TAB_COMMENTS
 WHERE TABLE_NAME='테이블명';
-------------------------------------------------------------------------------------
※ COLUMN COMMENT 쿼리

SELECT *
  FROM ALL_COL_COMMENTS
 WHERE TABLE_NAME='테이블명';
-------------------------------------------------------------------------------------
※ 콘트롤파일의 데이타파일 정보와 테이블스페이스 정보

SELECT status,enabled, t.name,d.name
  FROM v$datafile d, v$tablespace t
 WHERE t.ts#=d.ts#;
-------------------------------------------------------------------------------------
※ 테이블스페이스의 데이터파일과 테이블스페이스의 크기 확인
※ DBA_DATA_FILES 데이터 사전을 이용 하면 됩니다.

SELECT file_name, tablespace_name, bytes, blocks, status, user_bytes, user_blocks
  FROM DBA_DATA_FILES;
-------------------------------------------------------------------------------------
※ 테이블 스페이스별 사용 가능한 공간의 확인
※ DBA_FREE_SPACE 데이터 사전
※ SUM을 사용한 이유는하나의 테이블 스페이스에 분산되어 있는 여유공간을 합한 것이며
※ MAX를 사용한 이유는 여유 공간중 가장 큰 공간의 SIZE를 의미 합니다.

SELECT tablespace_name, SUM(bytes), MAX(bytes)
  FROM DBA_FREE_SPACE
 GROUP BY tablespace_name;
-------------------------------------------------------------------------------------
※데이타 화일에 대한 총 크기와 남아있는 공간, 사용한 용량, 남은 %율
※DBA_FREE_SPACE, DBA_DATA_FILES 데이터 사전

SELECT b.file_name "FILE_NAME", -- DataFile Name
       b.tablespace_name "TABLESPACE_NAME", -- TableSpace Name
       b.bytes / 1024 "TOTAL SIZE(KB)", -- 총 Bytes
       ((b.bytes - sum(nvl(a.bytes,0)))) / 1024 "USED(KB)", -- 사용한 용량
       (sum(nvl(a.bytes,0))) / 1024 "FREE SIZE(KB)", -- 남은 용량
       ROUND((sum(nvl(a.bytes,0)) / (b.bytes)) * 100, 2) "FREE %" -- 남은 %
  FROM DBA_FREE_SPACE a, DBA_DATA_FILES b
 WHERE a.file_id(+) = b.file_id
 GROUP BY b.tablespace_name, b.file_name, b.bytes ORDER BY b.tablespace_name
-------------------------------------------------------------------------------------
※오라클 권한 준거 확인 (테이블 권한)
SELECT *
  FROM USER_TAB_PRIVS;
-------------------------------------------------------------------------------------
※오라클 VIEW Table 조회
SELECT OBJECT_NAME, OBJECT_TYPE
  FROM ALL_OBJECTS
 WHERE OWNER = 'NIS'
   AND OBJECT_TYPE = 'VIEW';

SELECT  *
  FROM TAB;
-------------------------------------------------------------------------------------
※오라클 비밀번호 강제 변경

sqlplus "/as sysdba"

ALTER USER 아이디 IDENTIFIED BY 암호;

-------------------------------------------------------------------------------------
※락 잡힌거 죽이기

--락확인 법
SELECT A.SESSION_ID SID,
B.SERIAL# SERIAL_NO,
A.OS_USER_NAME OS_USER_NAME,
A.ORACLE_USERNAME ORACLE_USERNAME,
B.STATUS STATUS
FROM V$LOCKED_OBJECT A, V$SESSION B
WHERE A.SESSION_ID = B.SID;

SELECT *
  FROM V$LOCKED_OBJECT;

ALTER SYSTEM KILL SESSION 'SID, SERIAL_ID';

-------------------------------------------------------------------------------------
권한주기
GRANT SELECT,DELETE,UPDATE on SMSVNJNVIEW TO SMSVIEW WITH GRANT OPTION;

-------------------------------------------------------------------------------------
아이디생성
CREATE USER SMSVIEW PROFILE DEFAULT IDENTIFIED BY SMSVIEW;

GRANT CONNECT, RESOURCE TO SMSVIEW;
-------------------------------------------------------------------------------------
시노님 생성

CREATE PUBLIC SYNONYM SMSVNJNVIEW FOR NIS.SMSVNJNVIEW;
-------------------------------------------------------------------------------------
디비링크 거는법

1. tnsnames.ora 파일 정보추가

tns =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST =  127.0.0.1 )(PORT = 1521))
    )
    (CONNECT_DATA =
    (SID = ora92)
    )
  )

2. 연결

CREATE DATABASE LINK 링크명
CONNECT TO 아이디
IDENTIFIED BY 비번
USING 'tns'
-------------------------------------------------------------------------------------
pk 생성

ALTER TABLE 테이블 ADD (
 CONSTRAINT pk명 PRIMARY KEY (컬럼, 컬럼));
-------------------------------------------------------------------------------------
인덱스 생성
CREATE INDEX 인덱스명 on 테이블 (컬럼, 컬럼);

CREATE UNIQUE INDEX 인덱스명 on 테이블 (컬럼, 컬럼);
------------------------------------------------------

-------------------------------
테이블 설명
COMMENT on TABLE 테이블명 IS '부과대장';
COMMENT on COLUMN 테이블명.컬럼명 IS '부과대장키 ';
-------------------------------------------------------------------------------------

 

* oracle desc 효과

SELECT A.OWNER,
             A.TABLE_NAME,
             A.COLUMN_NAME,
             A.DATA_TYPE||'('||DATA_LENGTH||')' AS TYPE,
             DECODE(A.NULLABLE,'N','NOT NULL') AS NULLABLE,
             B.COMMENTS
  FROM ALL_TAB_COLUMNS A,
           ALL_COL_COMMENTS B
 WHERE A.OWNER = 'OWNER'
    AND A.TABLE_NAME='테이블명' 

    AND A.TABLE_NAME = B.TABLE_NAME
    AND A.COLUMN_NAME = B.COLUMN_NAME
 ORDER BY TABLE_NAME,COLUMN_ID 

 

 

출처 : http://cafe.daum.net/jyjcap/EPHX/4 

'DataBase > Oracle' 카테고리의 다른 글

oracle job  (0) 2009.02.09
Driving Table의 개념  (0) 2009.01.28
oracle grouping  (0) 2008.09.23
오라클 그룹함수 rollup,cube  (0) 2008.09.23
ORACLE HINT 사용  (0) 2008.09.03

GROUPING

GROUPING(expression)
expression의 값이 null이면 1 return
not null이면 0을 return한다.

SELECT한 row가 null을 포함하는지 알고자 할 때 사용한다.

SELECT dept_id, title, sum(salary), GROUPING(dept_id) g_dept, GROUPING(title) g_title
FROM s_emp
GROUP BY ROLLUP(dept_id, title);

해설 : 각 부서내의 모든 타이틀의 급여합을 구하고, dept_id, title column이 null인지 확인한다.

이 query의 실행 결과는 다음과 같다.

DEPT_ID TITLE                     SUM(SALARY)     G_DEPT    G_TITLE
------- ------------------------- ----------- ---------- ----------
     10 VP, Finance                          1450          0          0
     10                                            1450          0          1
     31 Sales Representative             1400          0          0
     31 VP, Sales                             1400          0          0
     31                                            2800          0          1
     32 Sales Representative             1490          0          0
     32                                            1490          0          1
     33 Sales Representative             1515          0          0
     33                                            1515          0          1
     34 Sales Representative             1525          0          0
     34 Stock Clerk                            795          0          0

붙여넣는 과정에서 정렬이 잘 되지 않았지만 각 부서의 부분합을 출력할 때 이 row의 title은 null인것을 알 수 있다.
따라서 G_TITLE column을 확인해보면 not null일 때는 0, null일 때는 1을 출력하는 것을 알 수 있다.

 

출처 : http://shoutrock.egloos.com/4083725

'DataBase > Oracle' 카테고리의 다른 글

Driving Table의 개념  (0) 2009.01.28
유용한 SQL  (0) 2009.01.22
오라클 그룹함수 rollup,cube  (0) 2008.09.23
ORACLE HINT 사용  (0) 2008.09.03
[튜닝] EXPLAIN PLAN 분석  (0) 2008.08.05

ROLLUP, CUBE

sub total을 구할 때 사용한다.

부서 직무

A

B

C

10

 

 

 

 

20

 

 

 

 

30

 

 

 

 

 

 

 

 


위 표와같이 각 항목별로 data가 있을 때 색칠한 부분 즉 10번 부서의 모든 직무들의 급여의 합, 20번부서의... 30번부서의...
그리고 전체 부서내 모든 직무들의 급여의 합을 구할 필요가 있을 때 사용한다.
표 중에서 색칠한 부분을 구하고자 할 때 ROLLUP을 사용한다.


부서 직무

A

B

C

10

 

 

 

 

20

 

 

 

 

30

 

 

 

 

 

 

 

 


이번에는 각 부서별 모든 직무들의 급여의 합도 필요하고, 부서에 상관없이 모든 부서내의 각 직무별 급여의 합이 필요할 때 사용한다.
표 중에서 색칠한 부분을 구하고자 할 때 CUBE를 사용한다.


SELECT dept_id, title, sum(salary)
FROM s_emp
GROUP BY ROLLUP(dept_id, title);


SELECT dept_id, title, sum(salary)
FROM s_emp
GROUP BY CUBE(dept_id, title);

위의 query문을 실행할 때 (dept_id, title)을 (title, dept_id)이렇게 하면 물론 표에서 행과 열이 바뀌기 때문에 계산의 기준이 되는 column이 다르게 되므로 주의 한다.
(행, 열)의 순으로 한다.

출처 : http://shoutrock.egloos.com/4083707

'DataBase > Oracle' 카테고리의 다른 글

유용한 SQL  (0) 2009.01.22
oracle grouping  (0) 2008.09.23
ORACLE HINT 사용  (0) 2008.09.03
[튜닝] EXPLAIN PLAN 분석  (0) 2008.08.05
오라클 예약어  (0) 2008.06.20

Hint란?

select문을 실행시키면 DB의 옵티마이져가 조건절 또는 join절 등을 고려하여 액세스 경로를 결정한다. 이때 옵티마이저에게 모든 것을 맡기지 않고 사용자가 원하는 보다 좋은 액세스 경로를 선택할 수 있도록 하는 것이 Hint이다.


힌트의 사용 방법

힌트를 사용하는 방법은 "/*+ */"와 "--+"의 두 가지 방법이 있다.

/*+ */ 여러 라인에 걸쳐 기술할 때 사용.
--+ 오직 한 라인에만 기술할 수 있고 칼럼은 반드시 다음 라인에 기술해야 한다.

예제 : kkaok이라는 테이블이 있고 kkaok_indx라는 인덱스를 힌트에 사용한다고 가정한다.

SELECT /*+ INDEX(kkaok kkaok_indx) */ name,content FROM kkaok WHERE rownum<=2

SELECT --+ INDEX(kkaok kkaok_indx) name,content FROM kkaok WHERE rownum<=2

힌트의 접근방법

힌트의 접근방법에는 여러 가지가 있다. 이중에 자주 사용되어지는 몇가지만 알아보겠다.

/*+ CLUSTER(table_name) */

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


/*+ INDEX(table_name index_name) */

지정된 index사용하도록 지정한다.


/*+ INDEX_ASC(table_name index_name) */

지정된 index를 오름차순으로 사용하도록 지정한다. Default로 Index Scan은 오름차순이다


/*+ INDEX_DESC(table_name index_name) */

지정된 index를 내림차순으로 사용하도록 지정한다.


힌트를 사용한 성능향상 테스트

50000만 건을 입력하고 전체 카운터를 가져오는 테스트를 해보겠다.

여기서의 소요시간은 서버환경이나 측정하는 방법에 따라 달라 질 수 있다. 하지만 상대적으로 비교해 볼 수는 있는 것이니 어떤 효과가 있는지를 알기에는 충분하다고 생각한다.


1. select count(idx) idx from 테이블명

- 소요시간 : 203ms


2. select /*+ index(테이블명 인덱스명) */ count(idx) idx from 테이블명

- 소요시간 : 15ms


카운터는 집계함수이지만 hint를 사용하면 처리 속도가 훨씬 빠른 것을 볼 수 있다. 오라클이 최적의 경로로 처리할 거라고 너무 믿지 말자. 힌트를 사용하면 훨씬 나은 결과를 얻을 수 있는 것이다.


HINT [ 힌트 ]

힌트란 사용자가 액세스 경로의 변경을 위해서 SQL내에 요구사항을 기술하면 옵티마이져가 액세스 경로를 결정할때 이를 참조하도록 하는 사용자 인터페이스를 말합니다. 옵티마이저에게 모든것을 맡기지 않고 사용자가 원하는 보다 좋은 액세스 경로를 직접 선택할 수 있도록 하므로 보다 쉽게 최적의 튜닝을 할 수 있게 도와 줍니다.

◈ 힌트의 사용 방법
  힌트를 사용하는 방법은 '/*+ */'와 '--+'의 두가지 방법이 있습니다.

/*+ */  : 여러 라인에 걸쳐 기술 할 때 사용합니다.
--+ : 오직 한 라인에만 힌트를 기술할 수 있고 컬럼은 반드시 다음 라인에 기술해야 합니다.

[힌트의 사용 예]

SELECT /*+ INDEX(emp ename_index)
          중복된 이름이 거의 없음 */
       empno, ename, deptno
FROM emp
WHERE ename like ‘%A%’
  AND deptno = 30
 
 
SELECT --+ INDEX(emp ename_index)
           empno, ename, deptno
FROM emp
WHERE ename like ‘%A%’
  AND deptno = 30

<>
 

/*+ 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 접근 방식을 사용하도록 지정 합니다.

<>
 
 
/*+ 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을 하도록 지정 합니다.

<>


/*+ ORDERED */

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

<>
 
 
/*+ USE_HASH (table_name) */

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

/*+ USE_MERGE (table_name) */

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

<>
 
 
/*+ 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://yuleum.dnip.net/tc/gtkim/2

'DataBase > Oracle' 카테고리의 다른 글

oracle grouping  (0) 2008.09.23
오라클 그룹함수 rollup,cube  (0) 2008.09.23
[튜닝] EXPLAIN PLAN 분석  (0) 2008.08.05
오라클 예약어  (0) 2008.06.20
* PL/SQL의 미리 정의된 예외  (0) 2008.06.20
 

SQL>  set autotrace traceonly explain

SQL>  select a.ename, a.deptno, b.dname from emp a, dept b where a.deptno=b.deptno;

 

14 개의 행이 선택되었습니다.


Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   NESTED LOOPS
   2    1     TABLE ACCESS (FULL) OF 'EMP'
   3    1     TABLE ACCESS (BY INDEX ROWID) OF 'DEPT'
   4    3       INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE)

 

 

 

실행계획을 처리순서대로 그림으로 그려보면~

 

 

 

처리순서는 왼쪽부터 오른쪽 순으로... 하위부터 상위로 진행된다...

 

1) 제일먼저 2 의 EMP 테이블이 Full Scan으로 테이블이 검색되고 (EMP 테이블이 드라이빙테이블(Driving Table)이 됨)

2) 오른쪽 하단의 4 가 실행되는데... DEPT 테이블을 Unique Index인 PK_DEPT 로 3 DEPT 테이블을 조회한다.

    Index로 Table 조회시 한단계로 봐도 좋다.. (4 → 3을 한 단계로)

3) 1)과 2)가 처리된 후 1이 처리가 되는데 두 테이블간의 조인이 Nested Loops Join으로 되고,

4) 마지막으로 두 테이블 조인결과가 0 인 SELECT로 출력이 되는 것으로 종료가 된다..

 

그림으로 그려보는 것이 한눈에 들어오고 어느 것이 먼저 처리가 되는지 알아보기 쉽다..

어느 테이블이 드라이빙 테이블이 되는지 선별하는 것이 중요하다...

(드라이빙 테이블은 데이터양이 적을 수록 좋다)

 

출처 : http://blog.naver.com/popcorn1111/60037820929

'DataBase > Oracle' 카테고리의 다른 글

오라클 그룹함수 rollup,cube  (0) 2008.09.23
ORACLE HINT 사용  (0) 2008.09.03
오라클 예약어  (0) 2008.06.20
* PL/SQL의 미리 정의된 예외  (0) 2008.06.20
오라클 함수 (문자, 숫자 , 날짜)  (0) 2008.06.20
ACCESS : 데이터 베이스 오브젝트를 사용자가 사용할 수 있게 만든다.
ADD : SQL문에서 열이나 Integrity constraint를 추가하는데 사용된다.
ALL : 연산자를 지정하거나 함수그룹이 지정된 선택세트에서 모든 값들을 참작하도록 한다
.
ALTER : 많은 문장에서 그 문장을 위한 현재값을 재정의 하는데 사용된다.
AND : 논리 연산자.
ANY : 논리 연산자.
AS : 서브쿼리에 의하여 리턴된 행을 테이블 제작시에 테이블에 삽입하기 위하여 Create 명
령과 함께 사용되는 절.

ASC : 오름차순 리스트를 만드는데 예를 들면, 인텍스와 함께 사용된다.
AUDIT : 지정된 명령문이나 오브젝트를 회계할 수 있게 해준다.
BETWEEN : 비교 연산자.
CHAR : 고정된 길이의 CHARACTER 데이터 타입.
CHECK : 명시적으로 조건을 정의하는 제약.
CLUSTER : 그 행에 있는 데이터가 전형적으로 동시에 엑세스되는 일반적인 정보를 포함하
고 있을 때 복수의
테이블로부터 함께 데이터베이스 데이터를 저장하는 수단.
COLUMN : 이름과 특정 데이터 타입을 포함하는 테이블의 세부구분.
COMMENT : 테이블이나 열에 대하여 데이터 디렉토리안에 코멘트절을 삽입하는 명령어.
CONNECT : 현재의 변경을 행하고, 사용자를 오라클로 부터 log off 하고 특정 사용자로서
오라클에 log on 한다.
CREATE : 특정 데이터ㅔ이스 오브젝트를 만드는데 사용된다.
CURRENT : 최근 불러들인 행을 지정하는데 커서와 함께 사용된다.
DATE : 고정된 길이의 데이터와 시간 데이터인 DATA 형의 데이터 타입.
DECIMAL : 고정된 소수점 수만 지정하는 DECIMAL 데이터 타입.
DEFAULT : 다른 대안이 지정되지 않은 경우 사용되는 절이나 옵션값.
DELETE : 테이블로부터, 또는 뷰의 베이스 테이블로부터 행을 제거하는 명령.
DESC : 내림차순 리스트를 만든다. 이 예약어의 전형적인 애플리케이션은 인덱스와 함께 한
다.
DISTINCT : 명령문의 일부로서 독특함을 나타낸다.
DROP : 데이터베이스로부터 오브젝트를 완전히 제거 또는 삭제한다.
ELSE : TRUE로 평가될 수도 있는 2개의 명령문을 평가하는 명령.
EXCLUSIVE : 데이터 베이스를 독점 모드로 마운트하는데 사용된다. 말하자면, 그 데이터베
이스가 한 번에 하나씩의 예가 마운트됨을 의미한다.
EXITS : WHERE 절에서 그 다음에 나오는 서브쿼리가 적어도 한 행을 리턴할 경우 TRUE를

리턴하는 연산자.
FILE : 모든 데이터베이스 데이터를 저장하는데 사용되는 저장 구역.
FLOAT : FLOAT 데이터 타입.
FOR : 반복 논리에서 명령문이 실행되는 회수를 제한하는데 사용된다.
GRANT : 사용자와 역할에 허가를 적용하는데 사용된다.
HAVING : 지정된 조건이 TRUE인 그룹에 리턴되는 행의 그룹을 제한한다.
IMMEDIATE : 테이블 공간 파일을 이용할 수 있음을 보장하지 않으며 체크포인트를 수행하

않는 alter tablespace에서 사용된다.
IN : WHERE 절에서 사용되는 논리 연산자.
INCREMENT : 시퀀스 번호간의 간격을 나타내기 위하여 시퀀스를 만드는데 사용된다.
IDENTIFIED : 사용자를 변경하는데 사용되며, 오라클이 사용자 액세스를 허용하는 방법을
나타
낸다.
INDEX : 엑세스 속도를 개선하는데 사용되는 데이터베이스 오브젝트.
INITIAL : 처음 저장공간 요구를 지정하는 명령어.
INSERT : 테이블 또는 뷰의 베이스 테이블에 행을 추가하느데 사용된다.
INTEGER : INTEGER 데이터 타입.
INTERSECT : 2개의 서로 다른 행 세트 간에 공통된 행을 리턴하는 세트 연산자.
INTO : 동작을 수령하는 테이블이나 오브젝트를 지정한다.
IS : 값의 실제를 테스트하기 위하여 NULL 연산자와 함께 사용된다.
LEVEL : 유사열으로서 루트 노드는 1, 차일드 노드는 2, 차일드의 차일드 노드는 3이다.
LIKE : 패턴 매칭과 함께 스트링 비교를 수행하는데 사용된다.
LOCK : 특정 오브젝트에 대한 사용자의 엑세스를 제한하는데 사용되는 오라클 메커니즘.
LONG : 최대 길이 2기가 바이트의 변수 길이 문자 데이터인 LONG 데이터 타입.
MAXEXTENTS : 특정 오브젝트를 위하여 할당될 수 있는 전체 확장자 수.
MINUS : 둘째 쿼리에는 없고 첫째 쿼리에 있는 구별되는 모든 행을 리턴하는 세트 연산자.

MODE : 단일 모드나 복수 프로세서 모드로서 프로세스를 설정한다.
MODIFY : 기존의 테이블 열의 정의를 수정한다.
NOAUDIT : 특정 명령문이나 오브젝트에 대한 오디팅 활동을 중단한다.
NULL : 논리 연산자의 효과를 앞에서 부정한다.
NUMBER : 길이가 다양하고 정밀도를 가진 NUMBER 데이터 타입.
OF : 평가할 아이템 리스트 앞에 온다.
OFFLINE : 특정 오브젝트를 오프라인에서 취하며 그에 대한 더 이상의 엑세스를 방지한다.

ON : 명령문이 동작할 오브젝트를 나타낸다.
ONLINE : 특정 오브젝트를 온라인으로 취하여 사용자가 엑세스할 수 있도록 한다.
OPTION : 명령문을 위하여 선택해야 할 선택의 리스트를 사용자에게 제공한다.
OR : 표현식을 TURE나 FALSE 결과와 조합하는 연산자.
ORDER : 수 리스트가 요청된 순서대로 만들어지도록 한다.
PCTFREE : 오브젝트에 대한 미래의 갱신을 위하여 예비된 각 오브젝트에 있어서 공백의 백
분율을 지정하는 명령어.
PRIOR : 계층에서 현재 행의 패어런트 행을 위하여 지정된 표현식을 평가하는 연산자.
PRIVILEGE : 어떤 동작을 수행하도록 사용자에게 주어진 허가.
PUBLIC : 그 데이터베이스의 모든 사용자가 엑세스를 갖게 되는 데이터베이스 그룹 또는 동
의어등과 같이
모든 사용자가 이용할 수 있는 데이터베이스 아이템을 의미할 수도 있다.
RAW : RAW 데이터 타입, 2진 포맷이며 직접 해석되지 않는다.
RENAME : 오브젝트의 이름을 새로운 이름으로 바꾼다.
RESOURCE : 데이터베이스 오브젝트나 물리적 장치를 가리키는 총칭
REVOKE : 사용자와 역할로부터 허가를 철회한다.
ROW : 단일 기록에 응답하는 테이블 열으로부터의 정보의 수집.
ROWID : 테이블에 있어서 행을 위한 논리적 주소를 나타내는 유사 열.
ROWLABLE : 모든 테이블에서 Trusted Oracle에 의하여 자동적으로 만들어진 열.
ROWNUM : 한 세트의 연결된 행의 테이블로부터 오라클이 행을 선택하는 순서를 나타내는
수를 포함하는 유사열.
ROWS : 테이블에서 하나 이상의 데이터 행.
SELECT : 하나 이상의 데이터베이스 오브젝트로 부터 데이터를 검색하는 SQL 명령.
SESSION : 사용자에 의한 데이터베이스와의 특정한 연결.
SET : 지정된 이이템을 유효화하는데 사용된다.
SHARE : 오브젝트나 자원의 공유를 허가한다.
SIZE : 자원의 크기를 바이트수로 지정한다.
SMALLINT : 오라클의 데이터 타입 번호를 위한 DB2로부터 호환가능한 데이터 타입.
START : 데이터베이스를 출발하는 것과 같은 동작을 초기화하느데 사용된다.
SYNONYM : 테이블이나 뷰를 참조하는데 사용될 수도 있는 테이블이나 뷰를 위한 별명.
SYSDATE : 시스템의 날짜와 시간.
TABLE : 오라클 데이터베이스에서 저장의 기초 단위, 행과 열로 구성된다.
THEN : 선행 조건을 그 뒤에 나오는 명령문과 결합시킨다.
TO : 어떤 동작이 발생할 아이템을 확인한다.
TRIGGER : 테이블과 결합된 저장 프로시저이며 지정된 이벤트에서 자동으로 실행된다.
UID : 각 사용자에게 할당된 고유 번호를 포함하는 유사열.
UNION : 두 쿼리의 결과를 조합하는 SQL 함수.
UNIQUE : 다른 유사한 아이템들에 반하여 어떤 아이템이 고유성을 갖도록 지정한다.
UPDATE : 테이블에서 또는 뷰의 베이스 테이블에서 값들을 변경하는 명령.
USER : 사용자의 로그인 사용자명을 포함하는 유사열.
VALUES : 해당 열에 값 리스트를 할당한다.
VARCHAR : 다양한 길이로 최대 200바이트의 길이를 갖는 VARCHAR 데이터 타입.
VARCHAR2 : 다양한 길이로 최소 200바이트의 길이를 갖는 VARCHAR2 데이터 타입.
오라클의 최근 릴리즈(7.2)에서 이 데이터 타입은 VARCHAR와 같은 의미이다.
VIEW : 일종의 데이터베이스 오브젝트이며 하나 이상의 테이블의 논리의 표현이다.
WHENEVER : audit 명령과 함께 사용되며 일련의 명령문에서 오디팅이 일치되도록 만든다.

WHERE : 명령문에서 사용되며 어떤 행이 그 명령에 영향을 받는지를 제한하게 지정하는 명
령이다.
WITH : 그 명령문에 포함할 보충이되는 아이템을 열거할 때 사용하는 명령.

'DataBase > Oracle' 카테고리의 다른 글

오라클 그룹함수 rollup,cube  (0) 2008.09.23
ORACLE HINT 사용  (0) 2008.09.03
[튜닝] EXPLAIN PLAN 분석  (0) 2008.08.05
* PL/SQL의 미리 정의된 예외  (0) 2008.06.20
오라클 함수 (문자, 숫자 , 날짜)  (0) 2008.06.20

* PL/SQL의 미리 정의된 예외

 

1. CURSOR_ALREADY_OPEN ( SQLCODE = -6511 )
   이미 OPEN된 커서를 OPEN하려는 경우발생
  
2. DUP_VAL_ON_INDEX ( SQLCODE = -1 )
    INSERT/UPDATE문으로 고유 인덱스가 잡혀진 컬럼에 값을 저장하는 경우 발생
  
3. INVALID_CURSOR ( SQLCODE = -1001 )
   - 존재하지 않는 커서를 참조하는 경우 발생.
   - 보통 커서가 OPEN되기 전에 FETCH하거나 CLOSE할때 발생한다.
  
4. INVALID_NUMBER ( SQLCODE = -1722 )
   PL/SQL에서 문자열을 숫자로 변환하는 SQL문이 실폐했을 경우 발생
  
5. LOGIN_DEFINED ( SQLCODE = -1017 )
   부적합한 계정으로 오라클 RDBMS에 연결하려고 하는 경우 발생
  
6. NO_DATA_FOUND ( SQLCODE = +100 )
   - 결과가 없는 SELECT INTO문(묵시적 커서)을 실행할 때 발생
   - 로컬 PL/SQL 테이블의 초기화되지 않은 행을 참조할 때 발생
   - 패키지 UTL_FILE로 파일의 내용이 끝난 다음에 내용을 읽어 들일때 발생
  
7. NOT_LOGGED_ON ( SQLCODE = -1012 )
   오라클 RDBMS에 접속하기 전에 데이터베이스를 호출하는 경우 발생
  
8. PROGRAM_ERROR ( SQLCODE = -6501 )
   PL/SQL에 내부 문제가 발생하는 경우. 일반적으로, 메시지에 'Contract Oracle Suport'
   란 말이 있다.
 
9. STORAGE_ERROR ( SQLCODE = -6500 )
    메모리 초과나 오류가 발생(corrupt)했을 경우 발생
 
10. TIMEOUT_ON_RESOURCE ( SQLCODE = -51 )
    자료 대기 중 RDBMS에서 타임아웃(timeout)이 발생한 경우
 
11. TOO_MANY_ROWS ( SQLCODE = -1422)
     하나 이상의 결과 값을 반환하는 SELECT INTO문을 실행한 경우.
  
12. TRANSACTION_BACKED_OUT ( SQLCODE = -61 )
     명시적으로 ROLLBACK을 실행했거나 다른 동작(예를 들어, 원격 DB에서 SQL/DML
     이 실폐했을 때)의 결과로, 원격 트랜잭션 부분이 롤백되는 경우 �생
  
13. VALUE_ERROR ( SQLCODE = -6502 )
     형 변환, 절단, 부적합한 숫자형과 문자형 데이터를 사용하는 경우 발생.
     SQL DML문에서 발생하면 INVALID_NUMBER 예외가 발생한다.
  
14. ZERO_DIVIDE ( SQLCODE = -1476 )
      0으로 나눗셈을 하는 경우 발생

'DataBase > Oracle' 카테고리의 다른 글

오라클 그룹함수 rollup,cube  (0) 2008.09.23
ORACLE HINT 사용  (0) 2008.09.03
[튜닝] EXPLAIN PLAN 분석  (0) 2008.08.05
오라클 예약어  (0) 2008.06.20
오라클 함수 (문자, 숫자 , 날짜)  (0) 2008.06.20

1. 문자함수 (Character Functions)

  • LOWER( column|expression ) 

          LOWER('String') --> string : 소문자로 변환

  • UPPER( column|expression )

          UPPER('String') --> STRING : 대문자로 변환

  • INITCAP( column|expression )

          INITCAP('string') --> String : 첫글자만 대문자이고 나머지글자는 소문자로 변환

  • CONCAT( column1|expression1 ,column2|expression2 )

          CONCAT('Good','String') --> GoodString : ||와 같은 역할

  • SUBSTR(column|expression, m [,n]) : m값이 음수면 문자값의 끝부터..

          SUBSTR('String',1,3) --> Str : 1번째부터 3개의 문자를 리턴한다.

  • LENGTH( column|expression )

          LENGTH('String') --> 6 : 문자열의 길이를 리턴

  • INSTR( column|expression, )

          INSTR('String','r') --> 3 : 문자열에 'r'이 몇번째 위치하고 있나를 리턴

  • LPAD( column|expression,n,'string' ) : n 은 전체 길이

          LPAD('String',10,'*') --> ****String

          10자리수중에 모자란 자리수를 '*'로 왼쪽에 채움(문자,숫자 가능!!!)

  • RPAD('String',10,'*') --> String****

          10자리수중에 모자란 자리수를 '*'로 오른쪽에 채움(문자,숫자 가능!!!)

  • LTRIM(' String') --> 'String' : 문자열의 왼쪽 공백을 버림
  • RTRIM('String ') --> 'String' : 문자령의 오른쪽 공백을 버림
  • TRIM(leading/tailing/both, trim_character FROM trim_source )
  • TRIM( 'S' FROM 'SSMITH') --> MITH

 

2. 숫자함수 (Number Functions)

  • ROUND(45.926, 2) --> 45.93 : 소수점 두자리수까지 보여주면서 반올림
  • TRUNC(45.926, 2) --> 45.92 : 소수점 두자리까지만 보여주고 나머지는 버림
  • MOD(1600,300) --> 100 : 1600을 300으로 나누고 나머지를 리턴
  •  ROUND예제(WHOLE NUMBER:정수)

           SELECT ROUND(45.923,2), ROUND(45.923,0), ROUND(45.923,-1) FROM DUAL

           ==> 45.92 46 50

  • TRUNC예제

          SELECT TRUNC(45.923,2), TRUNC(45.923), TRUNC(45.923,-1) FROM DUAL

          ==> 45.92 45(n이 생략된면 일의 자리까지 남기고 버린다.) 40

  • 난수

          예1) 1부터 1000사이의 정수를 리턴

         SELECT  ROUND(dbms_random.value(1,1000),0)

                 from dual;     


3. 날짜함수 (Date Functions)

  • SYSTEM 날짜를 갖고 오는 방법.

          SELECT sysdate FROM dual 

  • MONTHS_BETWEEN('01-SEP-95','11-JAN-94') --> 19.6774194

          : 두날짜 사이의 달수를 보여줌

  • ADD_MONTHS('11-JAN-94', 6) --> 11-JUL-94 

          :  날짜에 6개월을 더한 날자를 보여줌

  • NEXT_DAY('01-SEP-95','FRIDAY') --> '08-SEP-95'

         : 해당일 다음에 오는 FRIDAY의 일자를 보여줌

           'SUNDAY'는 1, 'MONDAY'는 2...이런식으로 숫자를 써줘도 됨

  • LAST_DAY('01-SEP-95') --> '30-SEP-95'

         :  해당월의 마지막날짜를 보여줌

  • ROUND('25-JUL-95','MONTH')--> 01-AUG-95 ROUND('25-JUL-95','YEAR')--> 01-JAN-96
  • TRUNC('25-JUL-95','MONTH') --> 01-JUL-95 TRUNC('25-JUL-95','YEAR') --> 01-JAN-95
  • * Date 계산( 날짜를 숫자로 저장)
    date + number : date에 number만큼 후의 날자를 보여줌
  • date - number : date에 number만큼 전의 날자를 보여줌
  • date1 - date2 : date1에서 date2 까지의 총 일수를 보여줌( date1+date2는 X )
  • date1 + 숫자/24 : date1에서 시간을 더해 날짜를 보여줌

'DataBase > Oracle' 카테고리의 다른 글

오라클 그룹함수 rollup,cube  (0) 2008.09.23
ORACLE HINT 사용  (0) 2008.09.03
[튜닝] EXPLAIN PLAN 분석  (0) 2008.08.05
오라클 예약어  (0) 2008.06.20
* PL/SQL의 미리 정의된 예외  (0) 2008.06.20

+ Recent posts