ORACLE INDEX에 대한 이론이 궁금합니다.

조회수 1638회

인덱스에 대해 공부하고 있습니다. DML을 이용한 것과 인덱스를 비교하는 소스인데 몇 가지 궁금증이 있습니다.

create table emp3(
  no number,
  name varchar2(10),
  salary number
 );

 insert into emp3 values(1, '서건창', 200);
 insert into emp3 values(2, '고종욱', 100);
 insert into emp3 values(3, '이택근', 150);
 insert into emp3 values(4, '대니돈', 150);
 insert into emp3 values(5, '김민성', 200);
 insert into emp3 values(6, '채태인', 250);
 insert into emp3 values(7, '김하성', 150);
 insert into emp3 values(8, '박동원', 200);
 insert into emp3 values(9, '임병욱', 100);

--  index 생성 
 create index idx_name
 on emp3(name);

 -- 인덱스 사용않고 네임출력
 select name from emp3;

 -- 인덱스 사용후 네임출력
 select name from emp3
 where name > '0';

 -- 인덱스 사용않고 네임출력 -- 정렬이 발생함. 수 많은 데이터에서는 처리속도 증가
 select min(name) from emp3; -- 출력값: 고종욱

-- 인덱스 x
select max(name) from emp3; -- 출력값: 채태인

-- 인덱스 o, hint
select /*+ index_desc(emp3 idx_name)*/ name
from emp3
where name > '0'
and rownum = 1;-- 출력값: 서건창
-- 이 방법은 인덱스칼럼에 변경이 생기면 잘못된 출력결과가 나올 수 있다.

-- first_row max 방법으로 처리할 수 있다.
select /*+ index_desc(emp3 idx_name)*/ max(name)
from emp3
where name > '0';-- 출력값: 채태인

1 where 절에 대한 질문이 있습니다. where name > '0' 이 문장인데요. 여기서 0의 의미를 잘 모르겠습니다. 제 생각으로는 문자 '0'이 ASCII 48번이니까 48 이상인 값을 선택하라는 것 같은데 이 부분에 대한 의문이 있습니다.

1-1 더불어 min(), max()를 이용한 출력값에 대해 질문이있습니다. 출력값에 대해 질문있습니다. 이것또한 아스키값이라서 아스키값으로 출력하는게 맞나요?

2 inex hint에서 오라클은 어떻게 처리하나요? 여태까지 프로그램이 주석을 만나면 시작부분에서 끝부분까지 스킵한다고 기억하는데요. 구글에 검색해봐도 "이렇게 써라, 이런 기능이다"라고만 나옵니다. ㅠ

2-1 index hint와 first_row max방법을 왜 쓰는지 모르겠습니다. 사용법만 나오고 왜 쓰는지 안나와서 두 개의 차이도 모르겠습니다

더위조심하세요~

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

  • 1.제가 알기론 index가 걸려있더라도 조건문이 없거나 조건문 결과 범위가 클 경우에는 index를 타지 않는 것으로 알고 있습니다. 그때문에 이 예제에서 where문에 일반문자중 첫 아스키코드값인 '0'보다 클 경우를 찾도록 넣은 것 같네요.

    1-1. min(), max() 함수는 문자열로 출력이 나옵니다. http://www.java2s.com/Tutorial/Oracle/0240__Aggregate-Functions/UseMAXwithstrings.htm

    2.주석 사용법에 대해 물으신 것 맞으신지요? 약간 질문이 명확하지 않으신데요, 말씀하신 것처럼 /* 와 */ 사이에 쓰인 글자는 해석하지 않고 스킵합니다. 참고로 --를 사용하면 해당 줄 이후 전체를 주석 처리하게 됩니다.

    2-1. -- 인덱스 o, hint라고 적혀 있는 단락은 아래 한글 주석으로 나와 있듯이 인덱스컬럼이 변경돠면 name 기준으로 소트지 않게되어 문제가 생길 수 있으므로 마지막 단락에 나와 있는 것처럼 max(name)을 사용해서 쓰는 것이 올바른 방법이라는 설명입니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)