1.2 SQL 공유 및 재사용
1.2.1 소프트파싱VS하드파싱
라이브러리 캐시(Library Cache) :
sql파싱, 최적화, 로우소스생성 과정을 거쳐 생성한 내부 프로시저를 반복 재사용할수있도록 캐싱해두는 메모리공간
- SGA(System Global Area) 서버프로세스와 백그라운드 프로세스가 공통으로 액세스하는 데이터와 제어구조를 캐싱하는 메모리공간
소프트파싱(Soft Parsing) : SQL을 캐시에서 찾아 곧바로 실행단계로 넘어감
하드파싱(Hard Parsing) : SQL을 캐시에서 찾는데 실패하여 최적화 및 로우소스 생성단계까지 모두 거치는것
옵티마이저가 SQL을 최적화할때 사용하는 정보 종류
- 테이블, 컬럼, 인덱스 구조에 관한 기본 정보
- 오브젝트 통계 : 테이블 통계, 인덱스 통계, (히스토그램을 포함한)칼럼 통계
- 시스템 통계 : CPU속도, Single Block I/O 속도, Multiblock I/O 속도 등
- 옵티마이저 관련 파라미터
1.2.2 바인드 변수의 중요성
이름없는 SQL문제
sql 자체가 이름이기 때문에 텍스트 중 작은 부분이라도 수정되면 그 순간 다른 객체가 새로 탄생하는구조
일회성 또는 무효화된 sql까지 모두 저장하려면 많은공간이 필요하고, 그만큼 sql을 찾는속도가 느려진다(sql영구저장안하는이유)
*sql텍스트가 변하면 sql id도 변한다
공유가능 SQL
동일한 sql 쿼리를 반복하게되면 내부 처리 루틴은 모두 같을것이다.
그렇다면, sql쿼리 조건문에 해당되는 파라미터를 처리하는 프로시저 하나를 공유하면서 재사용하는것이 유리할것
파라미터 Driven 방식으로 sql을 작성하는 방법이 제공되는데 이것이 바로 바인드 변수다.
1.3 데이터 저장 구조 및 I/O 메커니즘
1.3.1 I/O = SLEEP (os또는 I/O서브시스템이 I/O를 처리하는 동안 프로세스는 잠을 자기 때문에..)
1.3.2 데이터베이스 저장 구조
데이터를 저장하라면 *테이블스페이스를 생성해야한다. (테이블스페이스 : 세그먼트를 담는 컨테이너로서, 여러개의 데이터 파일로 구성)
테이블 스페이스를 생성했으면, *세그먼트를 생성한다. 세그먼트는 테이블, 인덱스처럼 데이터 저장공간이 필요한 오브젝트이다.
(테이블, 인덱스를 생성할때 데이터를 어떤 테이블스페이스에 저장할지를 지정한다.)
세그먼트는 여러 *익스텐트로 구성됨, 파티션 구조가 아니라면 테이블도 하나의 세그먼트, 인덱스도 하나의 세그먼트가 된다. LOB컬럼은 그 자체가 하나의 세그먼트를 구성하므로 자신이 속한 테이블과 다른 별도 공간에 값을 저장한다. (익스텐트는 공간을 확장하는 단위)
테이블이나 인덱스에 데이터를 입력하다가 공간이 부족해지면 해당 오브젝트가 속한 테이블스페이스로부터 익스텐트를 추가로 할당받음
익스텐트는 역속된 블록들의 집합이기도 한다. 익스텐트 단위로 공간을 확장하지만, 사용자가 입력한 레코드를 실제로 저장하는 공간은 데이터 블록이다. ( != DB2, SQL서버 같은 DBMS는 페이지page 라는 용어사용)
즉, 한 블록에 저장된 레코드는 모두 같은 테이블 레코드이다 :) 다중 테이블 클러스터일 때는 한 블록에 여러 테이블 레코드가 같이 저장
데이터베이스 저장 구조 용어정리 -
블록 : 데이터를 읽고 쓰는 단위
익스텐트 : 공간을 확장하는 단위, 연속된 블록 집합
세그먼트 : 데이터 저장공간이 필요한 오브젝트(테이블, 인덱스, 파티션, LOB등)
테이블스페이스 : 세그먼트를 담는 컨테이너
데이터파일 : 디스크 상의 물리적인 OS파일
+ DBA(Data Block Address)
: 모든 데이터 블록은 디스크 상에서 몇 번 데이터파일의 몇 번째 블록인지를 나타내는 자신의 고유 주소값을 가짐.
1.3.3 블록 단위 I/O
오라클은 기본적으로 8KB 크기의 블록을 사용하므로 1Byte를 읽기 위해서 8KB를 읽는 셈
(오라클은 2KB, 4KB 16KB 크기 블록을 사용할 수도 있다. MS SQL은 8KB 단일 사이즈 블록만 지원)
1.3.4 시퀀셜 액세스 VS 랜덤 액세스
테이블 또는 인덱스 블록을 읽는 방식으로는 2가지 방식이 있다
시퀀셜(Sequential) 액세스 : 논리적 또는 물리적으로 연결된 순서에 따라 차례대로 블록을 읽는 방식
오라클은 세그먼트에 할당된 익스텐트 목록을 세그먼트 헤더에 맵으로 관리하여 테이블 블록간의 서로 논리적인 연결고리를 시퀀셜 방식
으로 액세스하게 한다.
- 읽어야 할 익스텐트 목록을 익스텐트 맵에서 얻고, 각 익스텐트의 첫 번째 블록 뒤에 연속해서 저장된 블록을 순서대로 읽는것이 FullTableScan 이다.
랜덤(Random) 액세스 : 논리적, 물리적인 순서를 따르지 않고, 레코드 하나를 읽기 위해 한 블록씩 접근하는 방식