SQL 을 처리하는 방식에는 ROW 모드와 BATCH 모드가 있다.
각각 어떤 방식인지 알아보자.
ROW모드란?
- ROW 모드는 한 번에 하나의 row 씩 데이터를 처리하는 방식으로, 각 로우에 대한 연산을 순차적으로 수행한다.
- ROW 모드는 각각의 트랜잭션이나 쿼리가 작고 빈번할 때 적합하다. 작은 트랜잭션이나 빈번한 쿼리는 보통 데이터 조회나 변경을 소량의 데이터를 대상으로 하므로, ROW 모드의 순차적 처리 방식이 이러한 경우에 빠르고 효율적으로 처리를 가능하게 하기 때문이다.
- 또, 각 로우에 대한 LOCK 을 개별적으로 관리할 수 있기 때문에, OLTP 환경에서 적합하며, 높은 동시성과 빠른 속도를 제공한다.
BATCH 모드란?
- BATCH 모드는 한 번에 여러 row 를 묶어서 처리하는 방식으로, 여러 로우에 대한 연산을 동시에 수행한다.
- OLAP 시스템에서 대량의 데이터를 처리할 때 사용되며, 컬럼스토어 인덱스와 사용될 때 높은 성능을 발휘한다.
- 데이터를 동시에 처리하기 때문에 I/O 요청 수를 줄여 전체적인 쿼리 성능을 향상시킨다.
- 다만, BATCH 모드는 데이터를 일괄 처리하기 때문에 동시성 제어가 어려워지고, 다른 트랜잭션의 대기 시간이 증가할 수 있다.
SQL 처리 방식(ROW모드/BATCH모드) 변경
- 일반적으로 사용자가 SQL 처리 방식 모드를 설정 및 변경 할 수 없으며, 이는 SQL Server 가 내부적으로 결정한다.
- SQL Server가 'BATCH 모드'로 인식하는 경우는 주로 Columnstore 인덱스를 사용할 때 발생한다. 컬럼스토어 인덱스는 대량의 데이터를 저장하고 쿼리하는 인덱스로, SQL Server 는 대량 데이터를 처리할 때 가능한 배치 처리 방식을 사용한다.
SQL 처리 방식(ROW모드/BATCH모드) 확인
SQL 처리 방식은 실행 계획(Execution Plan) 에서 확인해볼 수 있다.
1. BATCH 모드
Columnstore Index 가 존재하는 ColumnstoreIndex_table 테이블의 데이터를 일반 테이블에 삽입해보자.
-- 컬럼스토어 인덱스용 테이블 생성
CREATE TABLE [dbo].[ColumnstoreIndex_table](
[regdate] [char](8) NOT NULL,
[seq] [bigint] NOT NULL,
[id] [varchar](30) NOT NULL,
[name] [int] NOT NULL,
[address] [nvarchar](100) NOT NULL,
[phone] [varchar](15) NOT NULL,
[gender] [char](2) NOT NULL,
[etc] [varchar](64) NOT NULL
)
GO
-- 클러스터형 컬럼스토어 인덱스 생성
CREATE CLUSTERED COLUMNSTORE INDEX [CIDX_ColumnstoreIndex_table] ON [dbo].[ColumnstoreIndex_table])
GO
-- 200만건 이상의 데이터 삽입
INSERT INTO [dbo].[Copy_table]
SELECT TOP 2000000 * FROM [[dbo].[ColumnstoreIndex_table]
컬럼스토어 인덱스가 있는 테이블을 생성해준다.
실행계획을 확인할 수 있도록 포함시킨 후, INSERT 작업을 수행하면 아래와 같은 실행 계획을 확인할 수 있다.
INSERT 작업을 하기 위해 데이터를 조회할 때, Clumnstore Index Scan 하는 것을 확인할 수 있다.
그리고 상세 사항을 보면 Actual Execution Mode 에 Batch 라고 되어 있는것을 확인할 수 있는데 이것은 Batch 모드로 실행이 되었다는 것이다.
2. ROW 모드
일반 Clustered Index 가 존재하는 ClusteredIndex_table 테이블의 데이터를 ColumnstoreIndex_table 테이블에 삽입해보자.
-- 일반 클러스터 인덱스용 테이블 생성
CREATE TABLE [dbo].[ClusteredIndex_table](
[regdate] [char](8) NOT NULL,
[seq] [bigint] NOT NULL,
[id] [varchar](30) NOT NULL,
[name] [int] NOT NULL,
[address] [nvarchar](100) NOT NULL,
[phone] [varchar](15) NOT NULL,
[gender] [char](2) NOT NULL,
[etc] [varchar](64) NOT NULL
CONSTRAINT [ClusteredIndex_table_pk] PRIMARY KEY CLUSTERED (regdate ASC, seq ASC)
GO
-- 200만건 이상의 데이터 삽입
INSERT INTO [dbo].[ColumnstoreIndex_table]
SELECT TOP 2000000 * FROM [[dbo].[ClusteredIndex_table]
나는 클러스터 인덱스용 테이블에 PK 을 생성해주었다.
그리고 클러스터 인덱스용 테이블의 데이터를 위에서 생성한 컬럼스토어 인덱스용 테이블에 데이터를 삽입할 예정이다.
위 쿼리를 실행 후, 실행계획을 보면 아래와 같은 실행 계획을 확인할 수 있다.
먼저, Clustered Index Scan 을 살펴보자.
Actual Execution Mode 를 보면 Row 로 되어있는 것을 볼 수 있다. 이는 PK(Clustered Index) 가 Row 모드로 실행되었다는 이야기이다.
그리고 Insert 부분의 Columnstore Index Insert 를 보자.
위의 1. BATCH 모드와 달리 Columnstore Index Scan 가 여기에서는 ROW 모드로 실행되었음을 확인할 수 있다.
이는 모든 Columnstore Index 가 BATCH 모드로 실행되는 것은 아니고, SQL Server 가 쿼리 최적화 과정에서 BATCH 모드보다 ROW 모드가 더 적합하다고 판단되면 ROW 모드로도 실행될 수 있음을 알 수 있다.
'DBMS > SQL Server (MS-SQL)' 카테고리의 다른 글
[SQL Server / MS-SQL] Wait Stats (대기 통계) (0) | 2024.05.30 |
---|---|
[SQL Server / MS-SQL] VLF (가상로그파일 - Virtual Log File) (0) | 2024.05.28 |
[SQL Server / MS-SQL] 특정 테이블의 페이지 확인하기 (DBCC IND, DBCC PAGE) (0) | 2024.05.22 |
[SQL Server / MS-SQL] 페이지 및 익스텐트 아키텍처 (FPS, GAM, SGAM, IAM, BCM, DCM) (0) | 2024.05.20 |
[SQL Server / MS-SQL] Generate Scripts 이용하여 DB 복사/이관하기 (0) | 2023.10.26 |