본문 바로가기

나 취준생/SQL

(54)
SQL - 조인 순서, 조인 방법을 활용한 튜닝 + nested loop 조인 SQL 튜닝 기술 1. 인덱스 SQL 튜닝 : 인덱스 엑세스 방법 8가지** 2. 조인 SQL 튜닝 **3. 서브쿼리 SQL 튜닝4. 데이터 분석함수를 이용한 튜닝5. 자동 SQL 튜닝 현업에서 튜닝을 해야할 쿼리문이 10개라면, 그 중 8개 꼴은 조인 문장이다. ** 조인 SQL 튜닝 기술 ** 1. NESTED LOOP 조인2. HASH 조인3. SORT MERGE 조인4. 조인 순서의 중요성5. OUTER 조인6. 스칼라 서브 쿼리를 이용한 조인7. 조인을 내포한 DML 문 튜닝8. 고급 조인 문장 튜닝 1. 조인을 왜 튜닝해야할까? 예제 : 사원 이름, 월급, 부서 위치를 출력하기 select e.ename, e.sal, d.loc from emp e, dept d where d.deptno=e...
SQL - merge scan, bitmap merge scan, index join 1. index merge scan (and equal) *두 개의 인덱스를 동시에 사용하여 하나의 인덱스만 사용했을 때보다 더 좋은 성능을 보이는 스캔 방법 예제 : create index emp_deptno on emp(deptno);create index emp_job on emp(job); select /*+ gather_plan_statistics */ ename, deptno, job from emp where job='SALESMAN' and deptno=30;SELECT * FROM TABLE(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); 딱히 힌트를 안 주고, where 절에도 각 인덱스와 맞는 조건을 줘서deptno와 job에 걸린 인..
SQL - INDEX_asc, INDEX_desc를 활용한 튜닝 index_asc 와 index_desc 를 활용해서 order by 절보다 성능이 좋은 쿼리를 짤 수 있다.대용량 데이터베이스일수록 차이가 크다. 예제 : 사원들의 이름과 월급을 출력하는데 월급 순으로! 튜닝 전: create index emp_sal on emp(sal); select /*+ gather_plan_statistics (emp emp_sal) */ ename, sal from emp order by sal desc; 튜닝 후: create index emp_sal on emp(sal); select /*+ gather_plan_statistics index_desc(emp emp_sal) */ ename, sal from emp where sal >= 0; ** sal에 있는 index..
SQL - INDEX SKIP SCAN index skip scan 1. 단일 컬럼 인덱스 컬럼을 하나로 해서 만든 인덱스 create index emp_deptno on emp(deptno); 2. 결합 컬럼 인덱스 컬럼을 여러개로 해서 만든 인덱스 create index emp_deptno_sal on emp(deptno,sal); * emp_deptno_sal 의 구조 살펴보기 select deptno, sal, rowid from emp where deptno >= 0; --> 모든 결과 출력 - deptno를 먼저 asc로 정렬하고, 그것을 기준으로 sal을 asc로 인덱스를 구성하고 있다. *결합 인덱스가 필요한 이유! 인덱스에서 데이터를 읽어오면서 테이블 엑세스를 줄일 수 있기 때문 (목차) (책) 내가 검색하고자 하는 데이터가 ..
SQL - INDEX FULL SCAN, INDEX FAST FULL SCAN * index full scan - 인덱스 전체를 full로 읽어서 원하는 데이터를 엑세스 하는 방법 예제 : select /*+ gather_plan_statistics */ count(*) from emp; SELECT * FROM TABLE(dbms_xplan.display_cursor(null,null,'ALLSTATS LAST')); 이렇게 해보면, index full scan을 확인할 수 있다. 원래 emp 테이블에서 count(*)를 해도 14가 나오는데 생각해보면 이 14는 count 되는 과정에서 emp에 있는 모든 컬럼을 한 번씩 계속 훑어서 자료가 있으면 1을 더한다.즉, 테이블 전체를 가로로 끝까지 훑은 다음에, 세로로 또 계속 반복해서 훑는 것이다. 반면 index full sca..
SQL - UNIQUE INDEX non unique index : 값이 중복되어도 상관없이 그냥 생성되는 인덱스 UNIQUE INDEX : 중복된 데이터가 없을 때, 사용할 수 있는 인덱스 UNIQUE INDEX를 생성할 때 unique 라고 명시해주기만 하면 된다. 예제 : empno와 deptno에 non unique index 만들기 create unique index emp_empno on emp(empno); create unique index emp_deptno on emp(deptno); empno에는 잘 생겼지만, deptno에는 작성할 수 없다고 오류가 뜬다. 이미 deptno에 중복된 데이터들이 있기 때문이다. 예제 : 사원 이름에 unique index를 걸고, 이름이 scott인 사원의 이름과 월급 조회하기 cre..
SQL - 암시적 형변환을 항상 조심 실제로 한 현업에서 있던 사고 : 예제 : 직업이 PRESIDENT인 사원빼고 모든 사원들의 월급을 출력하기 select (decode(job,'PRESIDENT',null,sal)) from emp; 예제 : 위의 결과에서 최고 월급만 출력하기 select MAX(decode(job,'PRESIDENT',null,sal)) from emp; ** 3000이 아닌 950이 나온 이유 decode(job,'PRESIDENT,null,sal) 을 사용했을 때세 번째 값 null이기 때문에, 네 번째 인자값인 sal이 문자형으로 암시적 형변환이 발생해버렸기 때문 위와 같이 sal을 문자형 기준으로 정렬하면, 맨 앞의 숫자인 9가 제일 큰 값으로 인식된다. 그래서 사고가 났다고 한다 ㅎ 그렇다면 어떻게 짰어야 ..
SQL - full table scan, index range scan ( + 튜닝 ) 데이터가 대부분 대용량이기 떄문에데이터를 빠르게 검색하기 위해서는 SQL 튜닝을 할 수 있어야한다. * SQL 튜닝 데이터 검색 속도를 향상시키는 기술 * 인덱스 엑세스 방법 8가지 인덱스 엑세스 방법 힌트 1. index range scan index2. index unique scan index3. index skip scan index_ss4. index full scan index_fs5. index fast full scan index_ffs6. index merge scan and_equal7. index bitmap merge scan index_combine8. index join index_join * 오라클 힌트 ( hint ) 오라클 옵티마이저가 SQL을 수행할 때 실행 계획을 SQL..