모니터링 설정
- ALTER SESSION SET STATISTICS_LEVEL = ALL (BASIC, TYPICAL, ALL)
- SELECTC x FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(null, null, 'ALLSTATS LAST'))
listagg : row, colum의 위치 교환
- SELECT ProjectId, listagg(provider, '->') within group (order by empno) from EMP_PROJECT group by ProjectId
스칼라 서브쿼리 : 하나의 row 하나의 리턴
- 메인 테이블이 드라이빙 테이블로 검색
- 캐싱 기능 적용 (조회 쿼리 안에 조회 쿼리에 대한 대응책이므로 조회 범위에 따라 튜닝 진행)
- SELECT OwnerName, (SELECT B.ProjectId FROM DEPARTMENT B WHERE B.ProjectId = A.ProjectId AND ROWNUM = 1) AS ProjectId FROM EMPLOYEES A
lock
- shared lock : read만 가능하므로 여러 트랙션이 같이 가짐
- exculsive lock : read/ write 가능하므로 데이터에 대한 독점
- 낙관적 잠금 : 처음에 읽은 버전과 나중에 읽은 버전이 다를 경우 롤백 (동시 업데이트 거의 없는 경우)
- 비관적 잠금 : 수정 작업시 들어갈 때 데이터에 대한 rock을 실행
blocking
- 트랜젝션을 짧게 진행하도록 정의
- 같은 데이터 갱신에 트랜젝션이 동시 수행되지 않도록 설계
- lock timeout으로 시간 조절
deadlock : 다른 접근 권한의 트랜젝션 다수가 서로 필요한 데이터에 락을 걸어서 작업 못하여 멈춘 상태
- 트랜잭션 진행방향을 같은 방향으로 설정
- timeout 설정
인라인 뷰 : 일회성 view
ADW 사용
- 전자지갑 접속
- TLS 접속
- mTLS 인증 해제
- TNS 병렬 처리 우선순위 : high, low 환경 (tnsnames.ora 파일 참조)
기본 사용
- LIMIT 20 // WHERE rownum <= 20 : 간단 조회
- varchar도 between 가능
- where 복합문
WHERE 1=1 AND ProjectId = '2000' AND (OwnerName = 'KIM' OR Name = 'KIM)
SELECT CASE WHEN ProjectNo <= 100 THEN '100이하' WHEN ProjectNo <= 200 '200이하' ELES '200이상' END AS ProjectNoGroupName FROM DEPARTMENT
join
- nested loop join : outer, inner 테이블의 중첩 루프문 : 대량 join에는 부적합(outer가 소량일 때 유리), inner table의 인덱스가 관건
- sort merge join : nested loop join 하기 전에 join 컬럼 기준으로 정렬(PGA에서 수행)이 우선 진행 : inner table에 적절한 인덱스가 없을 경우 사용, 범위로 join할 경우 사용
- hash join : 대용량 테이블 join용도 : outer 테이블을 build input으로 hash영역(PGA영역)에 저장(hash영역에 들어갈 테이블의 크기가 hash용량보다 작아야 성능에 유리(disk load하면 안됨)) : join컬럼 기준으로 hash function이 적용되므로 중복값이 없을수록 성능 유리(이퀄 join만 가능)