목록프로그래밍/SQL (52)
코딩하는 문과생
오라클을 깊게 공부하게 되면서, 그리고 대용량 데이터를 다루며 깨달은 점은"인덱스"만 잘 타도 조회속도에 엄청난 효율을 가져올 수 있다는 것이다. 1. WHERE 절 내에 스캔할 범위를 줄여줄 칼럼이 있다면 적극적으로 사용하는 것이 좋다.ex. 대학교를 예로 들면 univ = "KNU" 라는 조건을 통해 스캔할 양을 줄일 수 있다. 2. 옵티마이저는 조건의 우선순위를 between보다는 =를 우선으로 생각한다. 따라서 여기서 파생되어 주의해야 할 점은 인덱스를 태우고 싶다면 "=" 조건을 통해 옵티마이저가 인덱스를 고려하도록 설정할 수 있다. 3. 인덱스가 사용되지 않는 경우"해당 부분을 잘 이용하면 Cost를 엄청 줄일 수 있다." 3-1. 칼럼에 substr()과 같은 함수나 || 처럼 필터가 사용되..
[문제] 최근 시스템에서 varchar2로 저장된 날짜 데이터를 조회하기 위해 조건으로 between을 사용하는 경우를 많이 보았다. 데이터가 적은 경우는 크게 문제가 되지 않겠지만, 대용량 데이터를 다루는 기업ERP에서는 between에 해당하는 조건만큼 값을 비교하게 되며 엄청난 시스템 과부하가 올 수 있다. 지난주 DB스터디를 통해 해당 부분을 빠르게 해결할 수 있는 부분을 알게 되어 리뷰해보고자 한다. [해결방법] 해결방법은 생각보다 간단했다. 1. 날짜 테이블을 새롭게 생성해 테이블 내부에 varchar2 데이터 타입인 날짜 데이터를 저장해놓고, 2. 해당 테이블과 기존 테이블을 Join시켜 날짜에 해당하는 값들만 데이터를 가져오는 방법이다. - 날짜 데이터를 between으로 비교하게 되는 경..
인덱스 이해하기 [예시]select * from emp where empno = 2016421. Index가 없는 경우- 201642 정보가 디스크 어떤 블럭에 있는지 모르므로, 10만개 전부 디스크에서 DB Buffer 캐시로 복사한 뒤 Full Scan으로 찾아야 한다. 2. Index가 있는 경우- where절의 조건으로 준 컬럼이 Index의 Key로 생성되어 있는지 확인한 뒤,인덱스에 먼저 가서 201642정보가 어떤 ROWID를 가지고 있는지 확인한 뒤 해당 ROWID에 있는 블럭만 찾아가서 db Buffer 캐시에 복사하게 된다.- 메모리에 위치한 Index 파일을 먼저 찾아 필요한 부분만 디스크에 Access한다. -> 디스크 I/O가 줄어든다.인덱스의 종류1. B-tree 인덱스: OLT..
오라클 메모리 구조 : Instance[ Memory(SGA) + Process(PGA) ] + Database SGA(Shared Global Area) Oracle Server가 시작될 때마다 시스템 전역 영역이 메모리에 할당 된다. 오라클 DBMS에 대한 데이터와 제어정보를 갖고 있는 공유메모리 구조의 그룹니다. SGA의 데이터는 여러 사용자 간에 공유된다. Shared Pool - Shared SQL Area(library cache): 나중에 다시 사용될 경우를 대비 ex. SQL, Parsing SQL, 실행계획 등 - Dictionary Cache: 제어정보를 포함 ex. 데이터베이스 구조, 사용자 참조 정보, 사용자 권한 등 Database Buffer Cache Database I/O를 ..