본문 바로가기

DBMS/SQL Server (MS-SQL)

[SQL Server / MS-SQL] ROW 모드와 BATCH 모드 (SQL 처리 방식)

반응형

 


 

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 모드로도 실행될 수 있음을 알 수 있다.

반응형