Chapter 08 Knowing Temp DB

Subject: 임시테이블과 테이블 변수


 Question: 임시 테이블 대신 테이블 변수를 써도 되나요? 한번은 테이블 변수를 사용하다가 메모리 오버플로우가 생긴 적이 있습니다. 



1. 임시 테이블과 테이블 변수 (Temp Tables Vs. Table Variables)

테이블 변수는 로컬 임시 테이블과 유사하다. 테이블 변수는 변수를 선언하여 사용하며, Batch 범위이다. 


차이점 1) 통계

임시 테이블과 테이블 변수의 주된 차이점은 테이블 변수는 통계를 생성하지 않는다는 것이다. 주요한 2개의 결과를 갖는데, 하나는 쿼리 옵티마이저는 테이블 변수는 포함된 데이터를 무시하고 row 수로만 고정된 견적 값을 사용한다. 데이터가 증가하거나 삭제되어도 이 값은 변하지 않게된다.


쿼리 옵티마이저는 하나의 row가 반환되는 계획을 기반하는 반면에 1 million rows가 사실상 실행된다. 테이블 변수에서 row의 수는 옵티마이저에서 항상 한 row로 간주되어 계산된다. 신뢰할만한 통계가 없기 때문에, 더 나은 비용의 계획이 발생하던지 또는 나쁜 실행계획이 사용될 수 있다. 


차이점 2) Indexes

테이블 변수에서는 제약조건을 생서할 수 있지만, 인덱스를 생성할 수는 없다. 즉, PK 또는 유니크 제약조건으로 인덱스를 가질 수 있다는 의미이다.

제약 조건으로 인해 인덱스를 만들고, 통계를 갖을 수 있지만, 인덱스를 쿼리의 컴파일 시 사용할 수 없다. 컴파일 시간이 존재하는 것도 아니고 재컴파일도 발생하지 않기 때문이다. 


차이점 3) 스키마 수정 (Schema Modifications)

스키마 수정은 임시테이블에서만 가능하다. 비록 스키마 수정은이 가능하지만 사용하는 것은 지양해야한다. 테이블 사용시 재 컴파일 이슈가 있기 때문이다. 


주요 차이점 정리표

 

Temporary Tables

Table Variables 

Statistics 

가능 

불가능 

Indexes 

가능 

제약조건에 한해서 

Schema Modifications 

가능 

불가능 

Available in child routines including sp_executesql 

가능

불가능 

Use with INSERT INTO... EXEC 

가능 

불가능 

In Memory Structures 

불가능 

불가능 


테이블 변수나 임시 테이블을 사용하는 것은 테스트를 통해서 결정해야하는 것이지만, 기본적으로 임시테이블 사용하는 것이 좋지 않는 결과로 갈 확률이 적다. 


적은 row를 다루기 위해 테이블 변수를 사용하는 경우 임시테이블 보다 빠르지만 수 백개, 수천개의 row가 테이블 변수내에 있다면 performance는 아주 나빠진다. 그렇기 때문에 둘 중 하나를 결정하기 전에 여러개 용량계획을 검토할 필요가 있다.  (so, try and allow for some capacity planning when you make your decision!)


2. 테이블 변수는 메모리 내에 생기지 않는다

테이블 변수는 메모리 내 생성되기 때문에 임시테이블보다 빠르게 수행된다는 잘못된 개념이 있다. 

-> 실제 몇몇 블로그에서 임시테이블과 테이블 변수 차이점 검색 과정해서 테이블 변수는 메모리에 올려서 사용하기 때문에 빠르다고 언급한 곳이 있었다.


DMV 중 sys.dm_db_session_alloc_page_count; 를 통해서 세션의 의한 tempdb 사용 확인 가능하다. DMV 비우기 위해 SQL Server 재시작 하면 DMV 조회 시 0이 반환된다.


1) 임시 테이블이 얼마나 공간을 차지하는지 확인할 수 있다. 하나의 임시테이블을 생성하고 하나의 row을 입력하고 조회하면 session_id, database_id, user_objects_alloc_page_count 를 확인할 수 있다. 즉, 새로 생성된 테이블이 tempdb 내에 하나의 페이지로 위치하고 있음을 알 수 있다.


2) 같은 방법으로 테이블 변수로 생성한 후, DMV를 조회하면 user_objects_alloc_page_count가 +1 됨을 알 수있다. 즉, 테이블 변수는 tempdb 내 또 다른 페이지를 생성하고, 테이블 변수는 메모리 내 생성되는 것이 아님을 알 수 있다.


** 테이블 변수와 임시 테이블 모두 캐시되는 것과 연관 있지만 사실은 서버의 메모리를 제한하지 하지 않거나 특별히 큰 테이블을 사용하지 않는 한 메모리 내에서 작업할 수 있다.


'일하면서 정리하기 > MSSQL' 카테고리의 다른 글

SQL Server Error Log 관리  (0) 2017.08.17
SQL Server Version List  (1) 2017.08.14
SQL Server 2016 설치(2) - 기능 설명  (0) 2017.08.14
SQL Server 2016 설치(1)  (1) 2017.07.11
SQL Server 버전 비교  (1) 2017.07.03

SQL Server 버전 비교표

* SQL Server Enterprise 및 Business Intelligence 버전에만 해당


기능

SQL Server 2016

SQL Server 2014

SQL Server 2012

SQL Server 2008 R2

SQL Server 2008

성능 인메모리 OLTP*

O

O

 

 

 

인메모리 ColumnStore*

O

O

O

 

 

SSD로 버퍼 풀 확장

O

O

 

 

 

리소스 관리자 

O

O

O

O

O

가용성 AlwaysOn*

O

O

O

 

 

개선된 가상화 지원 및
라이브 마이그레이션

O

O

O

O

 

보안 투명 데이터 암호화*

O

O

O

O

O

백업 암호화 지원

O

O

 

 

 

세부 감사

O

O

O

O

O

업무 분리

O

O

O

 

 

클라우드 준비도 Azure에 백업

O

O

O

 

 

Microsoft에 재해 복구

O

O

 

 

 

Azure 갤러리의 최적화된가상 컴퓨터(VM) 이미지

O

O

O

 

 

관리 및 프로그래밍 기능 Distributed Replay

O

O

O

 

 

정책 기반 관리

O

O

O

O

O

개선된 프로그래밍 기능

O

O

O

O

O

BI 및 분석 PowerPivot for Excel

O

O

O

O

 

서버로서 관리되는 통합 서비스

O

O

O

 

 

Apache Sqoop을 통한
Hadoop 커넥터

O

O

O

O

O

Tabular BI 의미 체계 모델

O

O

O

O

 

마스터 데이터 서비스

O

O

O

O

 

데이터 퀄리티 서비스

O

O

O

 

 

* 출처: https://www.microsoft.com/ko-kr/sql-server/sql-server-2016-comparison


'일하면서 정리하기 > MSSQL' 카테고리의 다른 글

SQL Server Error Log 관리  (0) 2017.08.17
SQL Server Version List  (1) 2017.08.14
SQL Server 2016 설치(2) - 기능 설명  (0) 2017.08.14
SQL Server 2016 설치(1)  (1) 2017.07.11
Chapter 08 Knowing Temp DB (1)  (0) 2017.07.10

+ Recent posts