점심시간 문제:

create  index  emp_ename  on  emp(ename);

select  /*+ index_desc(emp emp_ename) */ ename, sal
                from  emp
                where  ename  > '0' ;
                
select  * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'))
;

그룹함수도 정렬작업이 내부적으로 발생합니다. 정렬작업을 최소화 하기 위해서 인덱스를 활용을 해서 SQL 을 작성하는게 권장됩니다.

SQL 이 길다고 악성 SQL 이 아니고 인덱스를 활용하지 못하는 SQL이 악성 SQL 입니다.

실습예제1. 사원 테이블에서 최대월급을 출력하고 실행계획을 보시오 !

@demo

select  max(sal)
from  emp;
explain plan  for
select  max(sal)
from  emp;
select * from table(dbms_xplan.display);

실제 실행계획

select  max(sal)
from  emp;

select  * from  table(dbms_xplan.display_cursor(null, null, 'ALLSTATS LAST'))
;

설명: sort aggregate가 나오면 정렬 작업을 내부적으로 수행했다는 것을 확인할 수 있습니다.

※전체 범위 처리와 부분범위 처리라는 용어를 알고 있어야합니다. (SQLP)

  1. 전체 범위 처리: 테이블 전체를 다 읽어야 결과를 볼 수 있는 SQL

예:

select  max(sal)
from  emp;
  1. 부분 범위 처리: 테이블이나 인덱스의 일부분만 읽어서도 결과를 볼 수 있는 SQL