DataBase의 Index는 어떤 데이터가 어디에 있는지 정보를 제공하는 주소록과 유사하다. Index는 Table의 모든 행을 스캔하지 않고도 필요한 데이터를 빠르게 찾을 수 있도록 도와준다.
Index를 생성할 때 중간에 데이터가 변경되면 문제가 발생할 수 있다. 따라서 데이터 변경을 방지하기 위해 예방 조치를 취하고 메모리에서 데이터를 정렬한다(PGA의 정렬 영역). 공간이 충분하지 않으면 임시 Table 공간이 사용된다. 전체 Table을 스캔한 후 메모리에서 정렬하고 블록을 쓰는 과정이 포함된다.
PGA는 Program Global Area의 약자로, 단독 사용하는 공간이다. 따라서 Private Global Area라고 불리기도 한다. PGA는 프로세스에 대한 데이터와 제어정보가 포함된 비 공유 메모리 영역으로 서버 프로세스가 시작될 때 생성되며, DataBase에 접속하는 모든 사용자에게 할당된 각각의 서버 프로세스가 독자적으로 사용하는 오라클 DataBase의 메모리 공간이다.
PGA는 서버 프로세스가 시작될 때 오라클 DataBase에 의해 생성되며 프로세스가 종료될 때 해제된다. PGA는 SQL의 작업공간이기 때문에 정렬 작업을 할 때 주로 사용된다. 따라서 SQL 정렬 작업을 위해 PGA 메모리 영역을 사용할 경우, PGA 크기 내에서 정렬이 일어나면 메모리 내에서 정렬되는 것이므로 수행속도가 빠르고 PGA 크기를 초과하면 디스크에서 정렬이 일어나므로 수행속도가 느려지게 된다.
Index는 Key(Indexing을 위해 지정된 컬럼)와 ROWID의 두 개의 컬럼으로 구성된다.
EMP Table에서 EMPNO = 7902에 대한 쿼리를 고려하고, 데이터 파일에 100,000개의 블록이 있다고 가정한다:
이러한 측면을 이해하면 블록체인 데이터 엔지니어로서의 요구사항에 맞춰 DataBase 성능을 최적화하여 대량의 데이터를 효율적으로 처리하고, 메트릭을 빠르게 계산하며, DataBase에 과부하를 주지 않으면서 쿼리 속도를 줄일 수 있다.
DataBase는 종종 B-트리, 해시 Index, 비트맵 Index와 같은 다양한 유형의 Index를 제공한다. 선택은 데이터의 특성과 실행하려는 쿼리 유형에 따라 달라진다. B-트리는 가장 일반적인 Index 구조 중 하나이다.
Indexing된 열을 사용할 수 있는 쿼리가 실행되는 경우이다:
Index는 추가 디스크 공간을 소비하며, 그 양은 Index 유형과 Indexing된 열의 수와 크기에 따라 달라진다.
DataBase의 기존 데이터에 Index를 추가할 수 있으며, 이는 특정 열에 대한 쿼리 성능을 최적화하기 위해 종종 수행된다. Index를 만드는 정확한 방법은 사용 중인 DataBase 관리 시스템(DBMS)에 따라 다르다. 또한, DataBase에서 Index를 만드는 것은 특히 지금 작업 중인 것과 같은 대규모 데이터 집합을 다룰 때 쿼리의 효율성을 개선하는 강력한 도구가 될 수 있다. 아래에서는 기존 열에 Index를 생성하는 방법, Index인 새 열을 생성하는 방법, Indexing된 열이 있는 새 테이블을 생성하는 방법을 SQL과 Python에서 모두 SQLAlchemy 또는 Pandas와 같은 라이브러리를 사용하여 설명하겠다.
열 식별하기: 색인할 열을 결정한다. 일반적으로 쿼리 조건에서 자주 사용되는 열이어야 한다.
Index 유형 선택하기: 사용 중인 DBMS에 따라 다양한 유형의 Index(예: B-tree, 해시 등)에 대한 옵션이 있을 수 있다. 쿼리 패턴과 데이터 구조에 가장 적합한 것을 선택한다.
**Index 생성: 대부분의 SQL 기반 DataBase에서는 다음과 같은 SQL 명령을 사용하여 Index를 생성할 수 있다:
CREATE INDEX index_name ON table_name (column_name);
from sqlalchemy import Index
index_name = Index('index_name', table_name.c.column_name)
index_name.create(bind=engine)
ALTER TABLE table_name ADD column_name data_type;
CREATE INDEX index_name ON table_name (column_name);
from sqlalchemy import Column, Index
# 새 칼럼 추가
table_name.addColumn(Column('column_name', data_type))
# Index 생성
index_name = Index('index_name', table_name.c.column_name)
index_name.create(bind=engine)
CREATE TABLE table_name (
COLUMN_NAME1 DATA_TYPE1,
COLUMN_NAME2 DATA_TYPE2,
...
INDEX index_name (indexed_column_name)
);
from sqlalchemy import Table, Column, Index
table_name = Table('table_name', metadata,
Column('column_name1', data_type1),
Column('column_name2', data_type2),
...
Index('index_name', 'indexed_column_name')
)
table_name.create(bind=engine)
Indexing은 쿼리 속도를 크게 높일 수 있지만, 저장 공간을 추가로 소모하고 쓰기 작업의 속도를 저하시킬 수 있다는 점에 유의한다. 블록체인 데이터 엔지니어는 이러한 측면을 고려하면 데이터를 처리할 때 높은 정확도와 효율성이라는 목표를 달성하는 데 도움이 될 수 있다.
Indexing은 복잡한 트리 또는 해시 구조의 균형을 맞춰 빠른 검색 기능을 구현하는 DataBase의 강력한 도구이다. 내부 작업에는 데이터에 대한 효율적인 액세스를 제공하는 동시에 데이터 변경 시 Index의 무결성을 유지하도록 설계된 데이터 구조와 알고리즘이 포함된다. 이는 물론 방대한 양의 데이터를 효율적으로 처리하고, 메트릭을 빠르게 계산하며, DataBase에 과부하를 주지 않으면서 쿼리 속도를 줄여야 하는 데이터 엔지니어의 요구사항과도 일치하는 부분이다.