일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- vscode
- visualstudio code
- 단축키
- 깃 토큰
- github token
- error 해결
- OrCAD 다운로드
- 데이터베이스
- jupyter
- console창
- csv
- 따옴표 삭제
- Visual Studio Code
- 클론
- import data
- Python
- clone
- localhost
- 파이썬
- github clone
- DataGrip
- php
- error
- PHPStorm
- run sql script
- MySQL
- database
- 에러
- 오류
- cmd
- Today
- Total
개발 노트
8/11 MERGE, 트랜잭션(원자성, 일관성, 독립성, 지속성), SEQUENCE, 데이터사전, 제약조건, INDEX 본문
8/11 MERGE, 트랜잭션(원자성, 일관성, 독립성, 지속성), SEQUENCE, 데이터사전, 제약조건, INDEX
hayoung.dev 2022. 8. 16. 22:30--1. MERGE 개요
-- 구조가 같은 두개의 테이블을 비교하여 하나의 테이블로 합치기 위한 데이터 조작어
-- WHEN 절의 조건절에서 결과 테이블에 해당 행이 존재하면 UPDATE 명령문에 의해 새로운 값으로 수정,
-- 그렇지 않으면 INSERT 명령문으로 새로운 행을 삽입
--1) MERGE 예비작업
--DDL(CREATE)은 COMMIT할 필요가 없다.
CREATE TABLE professor_temp
AS SELECT * FROM professor
WHERE position = '교수';
--(1) 교수가 명예교수로 2행 Update
UPDATE professor_temp
SET position = '명예교수'
WHERE position = '교수';
--(2) 김도경 씨가 신규 Insert
INSERT INTO professor_temp
VALUES (9999, '김도경', 'arom21', '전임강사', 200, SYSDATE, 10, 101);
COMMIT;
--2) MERGE 수행
--목표 : professor_temp에 있는 직위 수정된 내용을 professor Table에 Update
-- 김도경씨가 신규 Insert 내용을 professor Table에 Insert
--(1) 교수가 명예교수로 2행 Update
--(2) 김도경 씨가 신규 Insert
MERGE INTO professor p
USING professor_temp f --professor_temp를 사용해서
ON (p.profno=f.profno) --괄호 조건을 비교하여
WHEN MATCHED THEN --만약 조건이 일치한다면(pk가 매칭이 된다면, 데이터가 있다면)
UPDATE SET p.position = f.name -- p.position을 업데이트 한다.
WHEN NOT MATCHED THEN --만약 조건이 일치하지 않는다면(pk가 없다면, 데이터가 없다면)
--professor에 INSERT를 한다.
INSERT VALUES(f.profno, f.name, f.userid, f.position, f.sal, f.hiredate, f.comm, f.deptno);
2. 트랜잭션 개요 (중요 : 별 3개, 면접에서 물어볼 수 있음)
트랜잭션은 논리적 기능을 수행하기 위한 작업의 단위. 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다.
관계형 데이터베이스에서 실행되는 여러 개의 SQL명령문을 하나의 논리적 작업 단위로 처리하는 개념
동시에 실행시키는 sql코드들이 하나의 트랜잭션이다.
COMMIT을 했을 때 동시에 작업이 들어가는 단위.
트랜잭션(Transaction)의 특징(중요 : 면접 질문 나올 수 있음. 외우기)
트랜잭션의 특성 (일원지독)
Atomicity(원자성) : 트랜잭션의 연산은 데이터베이스에 모두 반영되도록 완료(commit)되든지 아니면 전혀 반영되지 않도록 복구(Rollback) 되어야 함.
Consistency(일관성) : 트랜잭션이 그 실행을 성공적으로 완료하면 언제나 일관성있는 데이터베이스 상태로 변환함
Isolation(독립성) : 둘 이상의 트랜잭션이 동시에 병행 실행되는 경우 어느 하나의 트랜잭션 실행 중에 다른 트랜잭션의 연산이 끼어들 수 없음.
Durability(지속성) : 성공적으로 완료된 트랜잭션의 결과는 시스템이 고장나더라도 영구적으로 반영되어야 함.
COMMIT : 트랜잭션의 정상적인 종료.
트랜잭션내의 모든 SQL 명령문에 의해 변경된 작업 내용을 디스크에 영구적으로 저장하고 트랜잭션을 종료(지속성)
해당 트랜잭션에 할당된 CPU, 메모리 같은 자원이 해제
서로 다른 트랜잭션을 구분하는 기준
COMMIT 명령문을 실행하기 전에 하나의 트랜잭션 변경한 결과를 다른 트랜잭션에서 접근할 수 없도록 방지하여 일관성 유지(고립성)
ROLLBACK : 트랜잭션의 전체 취소.
트랜잭션내의 모든 SQL 명령문에 의해 변경된 작업 내용을 전부 취소하고 트랜잭션을 종료
CPU,메모리 같은 해당 트랜잭션에 할당된 자원을 해제, 트랜잭션을 강제 종료
3. SEQUENCE (중요 : 별 3개)
유일한 식별자
기본 키 값을 자동으로 생성하기 위하여 일련번호 생성 객체
예를 들면, 웹 게시판에서 글이 등록되는 순서대로 번호를 하나씩 할당하여 기본키로 지정하고자 할때 시퀀스를 편리하게 이용
여러 테이블에서 공유 가능(공유 가능하지만 일반적으로는 개별적 사용)
기본키를 만들 때는 특정 값 가져와서 넣기, MAX값을 설정해서 넣기, SEQUENCE값을 설정해서 넣기 이렇게 3가지 방법이 있다.
실무에서는 보통 SEQUENCE, MAX로 기본키를 만든다. 특정 값을 넣어서 만들면 개발자의 실수로 기본키에 중복값을 넣을 수 있기 때문이다.
MAX로 하면 가끔 충돌이 일어남 다른 컴퓨터에서 동시접속했을 때 순간적으로 같은 MAX번호를 가져가는 경우가 있기 때문임.
SEQUENCE는 동시에 해도 충돌이 되지 않음. 데이터의 무결성을 보장해줌. 그래서 max보다 seq를 자주 씀. 특히 민감한 데이터를 다루는 중요한 테이블에서는 SEQUENCE를 사용함.
(중요 : 면접에서 물어볼 수 있음)
1) SEQUENCE 형식 (외울 필요 없음)
CREATE SEQUENCE sequence
[INCREMENT BY n] --> 시퀀스 번호의 증가치로 기본은 1, 일반적으로 1 사용 (하나씩 증가시킨다)
[START WITH n] --> 시퀀스 시작번호, 기본값은 1
[MAXVALUE n | NOMAXVALUE] --> 생성 가능한 시퀀스의 최대값(지정하지 않으면 시스템에서 쓸 수 있는 최대값을 알아서 지정해줌. 그래서 보통 지정해주지 않음)
[MINVALUE n | NOMINVALUE] --> 시퀀스 번호를 순환적으로 사용하는 cycle로 지정한 경우, MAXVALUE에 도달한 후 새로 시작하는 시퀀스값
[CYCLE | NOCYCLE] --> MAXVALUE 또는 MINVALUE에 도달한 후 시퀀스의 순환적인 시퀀스 번호의 생성 여부 지정(보통 건드리지 않음. 시퀀스로 기본키를 지정해주기 때문에 cycle로 처음부터 다시 지정하게 되면 꼬일 수 있기 때문)
[CACHE n | NOCACHE]; --> 시퀀스 생성 속도 개선을 위해 메모리에 캐쉬하는 시퀀스 개수, 기본값은 20
--2) SEQUENCE 예시 1 : 샘플 예시
CREATE SEQUENCE sample_seq
INCREMENT BY 1
START WITH 1;
--(외울 필요 없음)
SELECT sample_seq.NEXTVAL FROM dual; --다음 값을 가져와라
SELECT sample_seq.CURRVAL FROM dual; --현재 값을 가져와라
--3) SEQUENCE 예시 2 : 실사용 예시
CREATE SEQUENCE dno_seq
INCREMENT BY 1
--dept_second 테이블에 이미 저장돼 있는 기본키가 75까지 있는 것을 확인했으므로 시작값은 76부터 해야 함.
START WITH 76;
-- 위를 이용하여 dept_second table에 입력
INSERT INTO dept_second
VALUES(dno_seq.NEXTVAL, 'Accounting', 'NEW YORK');
INSERT INTO dept_second
VALUES(dno_seq.NEXTVAL, '회계', '이대');
INSERT INTO dept_second
VALUES(dno_seq.NEXTVAL, '인사팀', '당산');
--왼쪽의 scott > 시퀀스에서 보는 dno_seq의 last_number는
--초기값은 76으로 주어졌지만 크기를 20으로 해서 96으로 나오는 것이지,
--실제 초기값이 96이라는 뜻이 아니다.
SELECT dno_seq.CURRVAL FROM dual;
--MAX 전환
INSERT INTO dept_second
VALUES((SELECT MAX(deptno) + 1 FROM dept_second), '경영팀', '계림');
--4) SEQUENCE 삭제
DROP SEQUENCE sample_seq;
--5) Data 사전에서 정보 조회
--시퀸스 정보를 미리 알 수 있다.
--사용자가 가지고 있는 시퀀스의 정보를 알 수 있다.
SELECT sequence_name, min_value, max_value, increment_by
FROM user_sequences;
--4. TABLE 조작
--1) TABLE 생성
CREATE TABLE address
( id NUMBER(3),
name VARCHAR2(50),
addr VARCHAR2(100),
phone VARCHAR2(30),
email VARCHAR2(100)
);
INSERT INTO address
VALUES(1, 'HGDONG', 'SEOUL', '123-4567', 'gdhong@naver.com');
--과제
--문1) address스키마/Data 유지하며 addr_second Table 생성
CREATE TABLE addr_second
AS SELECT * FROM address;
--답 : 이렇게 쓰면 변동사항이 생겼을 때 편함
CREATE TABLE addr_second(id, name, addr, phone, email)
AS SELECT * FROM address;
--문2) address스키마 유지하며 Data 복제 하지 않고 addr_seven Table 생성
CREATE TABLE addr_seven
AS SELECT * FROM address
WHERE 0=1;
--답 : 이렇게 쓰면 변동사항이 생겼을 때 편함
CREATE TABLE addr_seven(id, name, addr, phone, email)
AS SELECT * FROM address
WHERE 0=1;
--문3) address(주소록) 테이블에서 id, name 칼럼만 복사하여 addr_third 테이블을 생성하여라
CREATE TABLE addr_third
AS SELECT id, name
FROM address;
--문4) addr_second 테이블 을 addr_tmp로 이름을 변경 하시요
RENAME addr_second TO addr_tmp;
5-1. 데이터 사전(중요 : 데이터사전이 무엇인지 면접에서 물어볼 수 있음.)
사용자와 데이터베이스 자원을 효율적으로 관리하기 위한 다양한 정보를 저장하는 시스템 테이블의 집합
사전 내용의 수정은 오라클 서버만 가능(오라클 서버가 알아서 관리)
오라클 서버는 데이터베이스의 구조, 감사, 사용자 권한, 데이터 등의 변경 사항을 반영하기 위해 지속적 수정 및 관리
데이타베이스 관리자나 일반 사용자는 읽기 전용 뷰에 의해 데이터 사전의 내용을 조회만 가능
실무에서는 테이블, 칼럼, 뷰 등과 같은 정보를 조회하기 위해 사용
5-2. 데이터 사전 관리 정보
데이터베이스의 물리적 구조와 객체의 논리적 구조
오라클 사용자 이름과 스키마 객체 이름
사용자에게 부여된 접근 권한과 롤
무결성 제약조건에 대한 정보
칼럼별로 지정된 기본값
스키마 객체에 할당된 공간의 크기와 사용 중인 공간의 크기 정보
객체 접근 및 갱신에 대한 감사 정보
데이터베이스 이름, 버전, 생성날짜, 시작모드, 인스턴스 이름 정보
SQL문을 실행하면 옵티마이저가 데이터사전을 참고하여 실행계획을 세운다.
여기서 세 번째 버튼(계획설명)을 누르면 확인할 수 있다.
--5-3. 데이터 사전 종류
--1) USER_ : 객체의 소유자만 접근 가능한 데이터 사전 뷰.
-- user_tables는 사용자가 소유한 테이블에 대한 정보를 조회할 수 있는 데이터 사전 뷰이다.
-- scott에서 접근 가능한 테이블들이 나온다.
-- 데이터 사전 안에 있는 정보의 존재 알고 있어야 함.(중요 : 하단 SQL 외우기)
SELECT table_name FROM user_tables;
SELECT * FROM user_catalog;
--2) ALL_ : 자기 소유 또는 권한을 부여 받은 객체만 접근 가능한 데이터 사전 뷰(외울 필요 없음)
SELECT owner, table_name FROM all_tables;
--3) DBA_ : 데이터베이스 관리자만 접근 가능한 데이터 사전 뷰
SELECT owner, table_name FROM dba_tables;
데이터 딕셔너리 참고하여 사용(외울 필요 없음)
6-1. 제약조건(Constraint) (중요 : 별 2개, 제약조건 명칭 영어로 알아두기)
정의 : 데이터의 정확성과 일관성을 보장
테이블 생성 시 무결성 제약조건을 정의 가능
테이블에 대해 정의, 데이터 딕셔너리에 저장되므로 응용 프로그램에서 입력된 모든 데이터에 대해 동일하게 작용
제약조건을 활성화, 비활성화 할 수 있는 융통성
6-2. 제약조건(Constraint) 종류 (중요 : 별 3개. 정말 중요함.)
1) NOT NULL : 열이 NULL을 포함할 수 없음.
2) 기본키(Primary key) : UNIQUE + NOT NULL + 최소성 제약조건을 결합한 형태 (중요 : 무조건 알아야 함)
3) 참조키(Foreign key) : 테이블 간에 외래키로 관계 설정 (아주 중요)
4) CHECK : 해당 칼럼에 저장 가능한 데이터 값의 범위나 조건 지정
--6-3. 제약조건(Constraint) 적용 위한 강좌(subject) 테이블 인스턴스
-- 생성된 테이블 우클릭 > 편집 > 제약조건 에서 설정한 제약조건을 확인할 수 있다.
CREATE TABLE subject (
subno NUMBER(5) CONSTRAINT subject_no_pk PRIMARY KEY,
subname VARCHAR2(20) CONSTRAINT subject_name_nn NOT NULL,
--학기가 1,2학기만 있으므로 제약조건을 주어준다.
term VARCHAR2(1) CONSTRAINT subject_term_ck CHECK(term IN('1','2')),
typeGubun VARCHAR2(1)
);
COMMENT ON COLUMN subject.subno IS '수강번호';
COMMENT ON COLUMN subject.subname IS '수강과목';
COMMENT ON COLUMN subject.term IS '학기';
INSERT INTO subject(subno, subname, term, typegubun)
VALUES(10000, '컴퓨터개론', '1', '1');
INSERT INTO subject(subno, subname, term, typegubun)
VALUES(10001, 'DB개론', '2', '1');
INSERT INTO subject(subno, subname, term, typegubun)
VALUES(10002, 'JSP개론', '1', '1');
--PK 제약조건 위반(데이터 입력이 안되는 경우 제약조건 찾아보기)
--(1)UNIQUE 위반 : unique constraint (SCOTT.SUBJECT_NO_PK) violated
-- ORA-00001: 무결성 제약 조건(SCOTT.SUBJECT_NO_PK)에 위배됩니다
INSERT INTO subject(subno, subname, term, typegubun)
VALUES(10001, 'Spring개론', '1', '1');
--(2)NOT NULL 위반 : cannot insert NULL into ("SCOTT"."SUBJECT"."SUBNO")
-- ORA-01400: NULL을 ("SCOTT"."SUBJECT"."SUBNO") 안에 삽입할 수 없습니다
--*컬럼을 빼면 null이 들어간다.
INSERT INTO subject(subname, term, typegubun)
VALUES('Spring개론2', '1', '1');
--(3)NOT NULL 위반 : cannot insert NULL into ("SCOTT"."SUBJECT"."SUBNAME")
--*컬럼을 빼면 null이 들어간다.
INSERT INTO subject(subno, term, typegubun)
VALUES(10003, '1', '1');
--(4) CHECK CONSTRAINT 위반 : check constraint (SCOTT.SUBJECT_TERM_CK) violated
-- ORA-02290: 체크 제약조건(SCOTT.SUBJECT_TERM_CK)이 위배되었습니다
INSERT INTO subject(subno, subname, term, typegubun)
VALUES(10003, 'Spring개론3', '5', '1');
--TABLE 선언 시 못한 것 추후 정의 가능.
--Student Table의 idnum을 unique로 선언
ALTER TABLE student
ADD CONSTRAINT stud_idnum_uk UNIQUE(idnum);
-- 제약조건 위반하지 않음(실행 성공)
INSERT INTO student(studno, name, idnum)
VALUES(30101, '대조영', '8011210653212');
--unique(무결성) 제약조건 위배(실행 실패) : unique constraint (SCOTT.STUD_IDNUM_UK) violated
--idnum에 이미 있는 값을 또 넣었기 때문에 unique 제약조건에 위반한다.
INSERT INTO student(studno, name, idnum)
VALUES(30102, '강감찬', '8011210653212');
--Student Table의 name을 NOT NULL로 선언
ALTER TABLE student
MODIFY(name CONSTRAINT stud_name_nn NOT NULL);
--NN(NOT NULL) 위반 : cannot insert NULL into ("SCOTT"."STUDENT"."NAME")
INSERT INTO student(studno, idnum)
VALUES(30103, '8011210653212');
--CONSTRAINT 조회
SELECT CONSTRAINT_name, CONSTRAINT_Type
FROM user_CONSTRAINTs
WHERE table_name IN('SUBJECT', 'STUDENT');
7-1. 인덱스 (중요 : 별 3개, 물어볼 수 있음. "처리 속도 향상" 키워드가 중요함)
인덱스는 (무결성보다는)SQL 명령문의 처리 속도를 향상시키기 위해 칼럼에 대해 생성하는 객체
인덱스는 포인트를 이용하여 테이블에 저장된 데이터를 랜덤 액세스하기 위한 목적으로 사용
(중요 : 면접에서 pk와 index 비교 질문 정말 많이 나옴.)
PK | INDEX | |
개념 | Table내 유일한 Row를 보장 | Performance(성능) 향상을 위한 객체 |
갯수 | 1개 | 200개 이상 (한 테이블당 7개 이내로 넣는 것을 권장함. ) |
사용할 때 고려할 점 | 유일성, 최소성, not null | index는 데이터가 어느 테이블의 어느 지점에 저장되어 있는지 select 할 때 알려주는 것이다. select performent가 향상되며 insert, update, delete의 Performance는 떨어진다. 사실 insert, update, delete는 실행할 때 대부분 한 번만 실행하는 경우가 많은데 select 조회는 실행하는 데이터가와 횟수가 정말 많기 때문에 select의 Performance 중요하고 그래서 index를 사용하는 것이다. 성능이 떨어지는 이유는 row를 삽입시키고 실행하기 때문이다. |
인덱스 생성
--7-2. 인덱스의 종류
--1) 고유 인덱스 : 유일한 값을 가지는 칼럼에 대해 생성하는 인덱스로 모든 인덱스 키는 테이블의 하나의 행과 연결
--dname에 unique index를 생성한 것임.
--pk는 무조건 unique지만 index는 unique일수도, 아닐 수도 있다.
--null은 들어갈 수 있다.
--코드가 다소 길더라도 사람이 쉽게 파악할 수 있게 하는게 중요하다
CREATE UNIQUE INDEX idx_dept_name ON department(dname);
--2) 비고유 인덱스
--문) 학생 테이블의 birthdate 칼럼을 비고유 인덱스로 생성하여라
--비고유 인덱스는 제약조건을 안주겠다는 뜻. 성능만 높이겠다는 뜻.
--인덱스 유형을 확인해보면 고유하지 않음 으로 뜬다.
CREATE INDEX idx_stud_birthdate ON student(birthdate);
--중복되어도 상관 없다. 성능 문제에만 영향을 미친다.
INSERT INTO student(studno, name, idnum, birthdate)
values(30102, '김유신', '8012301036614', '84/09/16');
--3) 단일 인덱스 : 고유인덱스, 비고유 인덱스와 같음
--4) 결합 인덱스 : 하나 이상의 컬럼으로 이루어진 인덱스. 결합 인덱스는 두 개 이상의 칼럼을 결합하여 생성하는 인덱스
-- 결합 인덱스를 걸 때는 where절에 조회하는 순서대로 인덱스를 걸어야 한다.
-- 문) 학생 테이블의 deptno, grade 칼럼을 결합 인덱스로 생성, 결합 인덱스의 이름은 idx_stud_dno_grade 로 정의
CREATE INDEX idx_stud_dno_grade
ON student(deptno, grade);
SELECT * FROM student
WHERE deptno = 101 AND grade = 2;
--5) 함수 기반 인덱스(FBI, Function Based Index)
--오라클 8i 버전부터 지원하는 새로운 형태의 인덱스로 칼럼에 대한 연산이나 함수의 계산 결과를 인덱스로 생성 가능
--UPPER(column_name) 또는 LOWER(column_name) 키워드로 정의된 함수 기반 인덱스를 사용하면 대소문자 구분 없이 검색
--upper 대신 사용자가 만든 함수를 넣어도 됨.
CREATE INDEX uppercase_idx ON emp (UPPER(ename));
SELECT * FROM emp WHERE UPPER(ename)='KING';
--문) 학생 테이블의 deptno, grade 칼럼을 결합 인덱스로 생성
-- 결합 인덱스의 이름은 idx_stud_dno_grade로 정의
-- deptno, grade 순서로 결합 인덱스가 생성된다. 정렬 순서를 잘 생각해야 한다.
CREATE INDEX idx_stud_dno_grade
ON student(deptno, grade);
select * from student where deptno = 101 and grade = 2;
--만약 이렇게 where절의 순서를 바꾸어
select * from student where grade = 2 and deptno = 101;
--로 하면 인덱스가 걸리지 않는다.
--7-3. 인덱스가 효율적인 경우
--1) WHERE 절이나 조인 조건절에서 자주 사용되는 칼럼
--2) 전체 데이터중에서 10~15%이내의 데이터를 검색하는 경우
--3) 두 개 이상의 칼럼이 WHERE절이나 조인 조건에서 자주 사용되는 경우
--4) 테이블에 저장된 데이터의 변경이 드문 경우
--5) 열에 널 값이 많이 포함된 경우, 열에 광범위한 값이 포함된경우
--7-4. 학생 테이블에 생성된 PK_STUDNO 인덱스를 재구성
--실행 결과 성공 : Index PK_STUDNO이(가) 변경되었습니다.
ALTER INDEX PK_STUDNO REBUILD;
--7-5. 인덱스 조회 : USER_IND_COLUMNS가 모든 인덱스를 보여줌.
SELECT index_name, table_name, column_name
FROM USER_IND_COLUMNS;
--7-6. 인덱스 생성 emp(job)
CREATE INDEX idx_emp_job ON emp(job);
--7-7. 조회(성능 측면에서 조회하는 것임. 인덱스 사용 여부 확인)와 옵티마이저
SELECT * FROM emp WHERE job = 'MANAGER'; -- =은 인덱스가 걸린다.
SELECT * FROM emp WHERE job <> 'MANAGER'; -- 이렇게 부정형인 경우 인덱스는 걸리지 않는다.
SELECT * FROM emp WHERE job LIKE '%NA%'; -- LIKE는 인덱스가 걸리지 않는다.
SELECT * FROM emp WHERE UPPER(job) = 'MANAGER'; -- 함수는 인덱스가 걸리지 않는다. 함수를 쓰고 싶으면 함수 기반 인덱스를 써야 한다.
--그런데 인덱스를 사용하지 않는 경우도 생김.
--그 이유는 옵티마이저(Optimizer)때문인데 옵티마이저에는 두 가지 버전이 있다.(중요 : 면접에서 물어볼 수 있음)
--옛날 버전은 RBO : 인덱스 있으면, 컬럼수 등등 정해진 규칙은 무조건 인덱스를 타라 등등 규칙대로만 실행함.
--지금 버전은 CBO : CBO와 메모리의 성능을 따지면서 데이터 건수를 따짐.
--인덱스 타 봤자 성능이 안좋아지는 경우 인덱스를 사용하지 않을 수도 있음. 성능을 최적화시켜주는 것임.
--요즘 나오는 것은 Default값이 CBO임. 이것을 강제로 RBO로 바꾸는 방법(무조건 인덱스를 사용하고 싶은 경우)
ALTER SESSION SET OPTIMIZER_MODE=RULE;
-- SESSION 상에서 변경할때 (외울 필요 없음)
alter session set optimizer_mode=rule
alter session set optimizer_mode=CHOOSE --RBO, CBO를 골라준다.
alter session set optimizer_mode=first_rows --성능적으로는 가장 좋다. ex)처음 10건만 보여줌
alter session set optimizer_mode=ALL_ROWS
-- SQL Optimizer : 개발자가 옵티마이저를 주어줄 수 잇음
--/* */ 사이에 주어준다. 첫 번째에 몇 개의 row가 나오면 옵티마이저를 실행시키라는 뜻
SELECT/*+first_rows*/ ename FROM emp;
--7-8. optimizer 모드 확인
SELECT NAME, VALUE, ISDEFAULT, ISMODIFIED, DESCRIPTION
FROM V$SYSTEM_PARAMETER
WHERE NAME LIKE '%optimizer_mode%'
* DB돌리는 것 예약하는 법 : 스케줄러 > 새작업에서 예약할 수 있음. 단 협업하는 경우 다른 DBA와 사전에 시간을 맞춰야 함.
'프로젝트 기반 JAVA 응용 SW개발 : 22.07.19~23.01.20 > Oracle SQL' 카테고리의 다른 글
8/12 Oracle Backup 하는 법 (0) | 2022.08.17 |
---|---|
8/12 Foreign Key, View, 계층적 질의문, TableSpace (0) | 2022.08.17 |
8/10 서브쿼리, DML(INSERT, UPDATE, DELETE, MERGE), DELETE와 DROP과 TRUNCATE 비교 (0) | 2022.08.10 |
8/9 DeadLock, 독립성, JOIN (0) | 2022.08.10 |
8/8 날짜 출력 형식, DECODE, CASE, GROUP, HAVING, WHERE, 그룹함수, ROLLUP, CUBE (0) | 2022.08.08 |