개발자 성장 일지

2022.04.04 DB 와 WEB 연결

NEWDODORIPYO 2022. 4. 5. 15:14

DB에서의 인덱스

추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상하기 위한 자료구조

인덱스는 pk처럼 자동으로 생성되는것과 수동으로 만들어주는 방법이 있다

인덱스 잡는다?

이 뜻은 하나의 데이터로 다양한 조건의 인덱스 구조를 만들어준다는 뜻!!

DDL 만들기

--DDL
create table t_todo(    --table 이름
    tno int ,           -- ALTER TABLE 로 pk잡기
    title varchar2(500) not null , 
    dueDate date not null ,
    writer varchar2(50) not null ,
    delFlag char(1) default 'N',
    regDate date default sysdate,
    updtteDate date default sysdate
);
--검색을 하거나 정렬을 해야하는 부분은 NotNull

alter table t_todo add constraint pk_todo primary key (tno);
--ALTER TABLE 로 pk잡기

create sequence seq_t;
--시퀀스 만들기

데이터 집어넣기

insert into t_todo(tno, title, dueDate, writer)
values (seq_t.nextval,'sample','2020-04-10','도윤');

출력해보기

select *from t_todo order by tno desc; 
--tno를 기준으로 역으로 출력

결과

Explain Plan 해보기

다른 방법? RANGE SCAN

select *from t_todo
where tno > 0
order by tno desc; --tno를 기준으로 역으로 출력

Explain Plan 해보기

??? 나오는 게 달라졌습니다 이 차이는 무엇일까??

 

Full과 RANGE의 실행계획의 차이

 

Full SCAN 은 말 그대로 데이터를 전부 확인하는 방법이고

where tno > 0으로 해서 찾게 되는 RANGE SCAN은 전체가 아닌 tno 에게만 접근해서 확인하는 방법이다

 

<사실은 지금 데이터에서는 크게 차이점은 없다 모든 데이터가 0 보다 크기 때문에 하지만 오라클 입장에서 보면 tno의 조건을 따져야 하기 때문에 전체가 아닌 index 구조로 들어가서 찾게 만든다>

 

RANGE SCAN

RANGE SCAN 방법은 데이터가 양이 많을수록 극적인 성능을 보인다

 

ROWID : DB에 있는 데이터가 가지는 고유 정보

ROWNUM : 연산되면서 처리되는 번호

 

무슨 뜻이지?

select
ROWNUM , tno,title
from t_todo
where tno > 0
order by tno desc;

desc 했을 때

desc 없을 때

select
ROWNUM , tno,title
from t_todo
where tno > 0
order by tno;

ROWNUM와 tno의 값이 desc를 했을 때와 아닐 때 차이를 보인다 이 말은 실제의 값이 아니라 처리되고 마지막으로 붙는 값이다

 

⭐ROWNUM을 사용할 때 주의할 점

select
ROWNUM , tno,title
from t_todo
where tno > 0 and ROWNUM > 0 and ROWNUM <=20
order by tno;
--0보다 크고 20보다 작거나 같은 데이터를 찾는 조건

조건처럼 정보가 나온다 하지만 만약 이런 조건이라면 어떨까??

select
ROWNUM , tno,title
from t_todo
where tno > 0 and ROWNUM > 10 and ROWNUM <=20
order by tno;
--10보다 크고 20보다 작거나 같은 데이터 찾기

결과는??

??? 아니?? 이게 무슨...???

 

⭐결과가 안 나오는 이유는?? <오라클의 단점>

이유는 데이터가 나올 때 ROWNUM 이 1번 부여되는데 조건에는 10보다 크다는 조건이 있기 때문에 결과적으로 DB는 모든 데이터를 찾아서 보내지만 조건에 걸려서 어떤 데이터도 나오지 못하게 된다

그럼 이런 조건으로 찾고 싶으면 어떻게 해야 할까??

 

오라클의 Paging 기법

select * from
(select
 ROWNUM rn,tno,title ,dueDate
from t_todo
where tno> 0 and ROWNUM <=20
order by tno desc)
where  rn > 10;

위 코드를 보면 ( ) 안에 기존에 있던 검사식인 0보다 크고 20보다 작거나 같다는 검사식을 하나의 집합 <테이블>로 생각하고 그걸 다시 select로 감싸주면서 select 안에 select 가 있는 모양이 나온다

그리고 ( ) 안에 테이블을 대상으로 rn > 10; 을 하니 우리가 원하던 데이터인 11~20의 데이터가 나온다 이것이 오라클의 Paging이다

 

Paging의 치명적인 약점

페이지 번호가 뒤로 넘어갈수록 반응속도가 떨어진다

요즘 웹페이지들은 이런 단점을 보완하기 위해 “맨 뒤로 가기” 가 없다

 

 

'개발자 성장 일지' 카테고리의 다른 글

ERD  (0) 2022.04.09
2022.04.05 인덱스 그리고 DB 설계  (0) 2022.04.05
2022.04.01 DB야 안녕?  (0) 2022.04.02
2022.03.31 죽어라 DB야  (0) 2022.03.31
2022.03.29 수업일지  (0) 2022.03.29