목록oracle (56)
정미나닷컴
인덱스 스캔 효율 - Sequential access의 선택도 향상을 위한 방법 ☑ [Oracle] 오라클 인덱스 스캔 방식 보러가기 [인] 인덱스 매칭도 - Sequential access의 효율은 선택도에 의해 결정 (같은 결과 건수를 내는데 얼마나 적은 레코드를 읽느냐) - 인덱스 컬럼이 조건절에 모두 '=' 조건으로 사용될 때 선택도가 가장 높음 - Leaf Block을 scan하면서 읽은 레코드가 모두 테이블 access -> 비효율X - 인덱스 컬럼 중 일부가 조건절에 생략되거나 '=' 조건이 아니더라도 그것이 뒤쪽 컬럼일 때 비효율X - 인덱스 선행 컬럼이 조건절에 누락되거나 between, 부등호, like 같은 범위검색 조건이면 비효율 발생 [비:B.I.] BETWEEN 조건을 IN-LI..
IOT (Index-Organized Table)- Table Random Access가 발생하지 않도록 처음부터 인덱스 구조로 생성된 테이블- Index leaf block = data block (모든 행 데이터를 리프 블록에 저장)- 정렬상태를 유지하며 데이터를 삽입(PK 컬럼 순)CREATE TABLE INDEX_ORG_T ( A NUMBER PRIMARY KEY, B VARCHAR(10) )ORGANIZATION INDEX; -- 일반적으로 사용되는 테이블은 '힙 구조 테이블'로 ORGANIZATION HEAP; 이 생략되어 있는 것 장점- 클러스터링 팩터가 좋음- Random이 아닌 Sequential Access 방식이므로 넓은 범위 access 시 유리- PK 인덱스를 위한 별도의 세그먼트..
기본 메커니즘 - 둘 중 작은 집합(Build Input)을 읽어 Hash Area에 해시 테이블을 생성하고, 반대쪽 큰 집합(Probe Input)을 읽어 해시 테이블을 탐색하면서 JOIN하는 방식 - 해시 테이블을 생성할 때나 탐색할 때 모두 해시 함수 사용- JOIN 과정에서 발생하는 Random 액세스 부하가 없음 (각각의 집합을 읽는 과정에서는 Random 액세스 발생 가능)- 해시 테이블을 생성하는 비용이 수반되므로 Build Input이 충분히 작아야 효율적* Hash Area는 PGA 메모리에 할당되는데 Build Input이 hash_area_size를 초과하게 되면 디스크 I/O가 추가로 발생하게되므로 성능이 많이 저하됨 declare l_bucket number;beginfor out..
기본 메커니즘 - Sort (양쪽 집합을 JOIN 컬럼 기준으로 정렬) → Merge (정렬된 양쪽 집합을 서로 Merge) SELECT /* ordered use_merge(d) */ E.EMP_NO, E.ENAME, D.DNAME FROM EMP E, DEPT D WHERE D.DEPT_NO = E.DEPT_NO; ▼begin for outer in (SELECT DEPT_NO, EMP_NO, RPAD(ENAME, 10) ENAME FROM SORTED_EMP) loop -- outer loop for inner in (SELECT DNAME FROM SORTED_DEPT WHERE DEPT_NO = outer.DEPT_NO) loop -- inner loop dbms_output.put_line(o..
기본 메커니즘 for(i=0; i= 1500 --- ④ORDER BY SAL DESC; Answer :: ② -> ③ -> ① -> ④ * pk_dept : dept.dept_no* dept_loc_idx : dept.loc* pk_emp : emp.emp_no* emp_deptno_idx : emp.dept_no* emp_sal_idx : emp.sal Execution Plan ------------------------------------------------------------------------------0 SELECT STATEMENT1 0 SORT ORDER BY2 1 NESTED LOOPS3 2 TABLE ACCESS BY INDEX ROWID DEPT4 3 IND..
ORA-06502: PL/SQL: 수치 또는 값 오류: 문자열 버퍼가 너무 작습니다 : 오라클 Function이나 Procedure 내에 선언된 변수의 크기보다 더 큰 값을 담으려고 할 때 발생하는 에러 하지만 내가 문자열을 담으려던 변수는 Function 내에 VARCHAR2(32767)로 선언되어 있었고 아무리 DB를 뒤져봐도 32767 byte를 넘어가는 데이터는 없어서 멘붕이 오던 찰나, 오라클 VARCHAR2는 4000 byte까지만 지원된다는 구글님의 조언을 얼핏 듣고 그렇다면 저 변수는 왜 32767 byte로 선언되어 있는가 의문이 들어 다시 한번 폭풍 검색- 결론은 PL/SQL내에서는 VARCHAR2가 32K까지 지원이 되지만 어차피 그 변수값을 테이블이나 뷰에 담을거라면 4000 byt..
- SYNONYM 조회 SELECT * FROM USER_SYNONYMS WHERE TABLE_OWNER='소유계정'; - SYNONYM 생성 CREATE SYNONYM 소유계정.테이블명(or 프로시저명) FOR 부여계정.테이블명(or 프로시저명); - SYNONYM 삭제 DROP SYNONYM 시노님명; * 프로시저 실행 권한 부여 GRANT EXECUTE ON 소유계정.프로시저명 TO 부여계정;
init.ora 의 global_names가 true로 설정되어 있는 경우 DBLink 생성시 반드시 상대방의 global_name과 같은 이름으로 DBLink명을 지정해야 한다. (true가 아닐 경우에는 임의의 이름으로 생성 가능) 그렇지 않았을 경우 SELECT, INSERT, DELETE 등은 가능하지만 function 사용은 불가함 * DB의 global_name 확인 select * from global_name; 설정값을 바꾸기 위해서는 initSID.ora 파일을 수정하는 것이 맞지만 DB를 내렸다 올릴 수 없는 경우 임시방편으로 쿼리문 날리기 전에 ALTER SESSION SET GLOBAL_NAMES = TRUE 위 쿼리를 날려주는 방법이 있음