TEMPDB 개요
Tempdb는 SQL Server 작업으로 만든 내부 개체, 사용자 개체, 임시 테이블, 임시 개체 및 저장 프로 시저를 전역 적으로 저장합니다. 각 데이터베이스 인스턴스에는 tempdb가 하나만 있으므로 성능 및 디스크 공간 병목 현상이 발생할 수 있습니다. 다음은 tempdb 공간을 사용하는 방법입니다.
다양한 형태의 사용 가능한 공간과 과도한 DDL / DML 작업으로 인해 tempdb가 오버로드됩니다. 이로 인해 서버에서 실행중인 관련없는 프로그램이 느리게 실행되거나 실패합니다.
tempdb의 몇 가지 일반적인 문제는 다음과 같습니다.
-tempdb를
읽을 때 I / O 병목 현상으로 인해 발생하는 tempdb-Slow 쿼리 의 저장 공간을 모두 사용 합니다.
-과도한 DDL 작업으로 인해 시스템 테이블에 병목 현상이 발생합니다.
-유통 경쟁
일반적으로 사용되는 TEMPDB 명령
- TempDB 현재 설정
use tempdb
go
WITH cte
AS (
SELECT DB_NAME(database_id) AS name,
mf.name AS db_filename,
mf.physical_name,
CAST((mf.size / 128.0) AS DECIMAL(20, 2)) AS initial_size_MB,
CAST((df.size / 128.0) AS DECIMAL(20, 2)) AS actual_size_MB,
CASE mf.is_percent_growth
WHEN 0 THEN STR(CAST((mf.growth / 128.0) AS DECIMAL(10, 2))) + ' MB'
WHEN 1 THEN STR(mf.growth) + '%'
END AS auto_grow_setting
FROM sys.master_files mf
JOIN sys.database_files df ON mf.name = df.name
WHERE mf.database_id = DB_ID()
)
SELECT *,
actual_size_MB - initial_size_MB AS change_in_MB_since_restart
FROM cte;
- TempDB 사용 쿼리
SELECT DB_NAME(us.database_id) as DB_Name,
us.internal_objects_alloc_page_count / 128 AS Space_MB_Internal
, us.internal_objects_dealloc_page_count / 128 AS Space_MB_dealloc_Internal, us.internal_objects_alloc_page_count
, SUBSTRING(st.text, (ex.statement_start_offset/2)+1,
((CASE ex.statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE ex.statement_end_offset
END - ex.statement_start_offset)/2) + 1) AS statement_text --, pl.query_plan
FROM sys.dm_db_session_space_usage us
join sys.dm_exec_requests ex
on ex.session_id = us.session_id
and us.internal_objects_alloc_page_count > 0
left join sys.dm_exec_connections co
on us.session_id = co.session_id
CROSS APPLY sys.dm_exec_sql_text(co.most_recent_sql_handle ) AS st
- TEMPDB 사용 세부 쿼리
#
SELECT top 10 t1.session_id,
t1.internal_objects_alloc_page_count, t1.user_objects_alloc_page_count,
t1.internal_objects_dealloc_page_count , t1.user_objects_dealloc_page_count,
t3.login_name,t3.status,t3.total_elapsed_time
from sys.dm_db_session_space_usage t1
inner join sys.dm_exec_sessions as t3
on t1.session_id = t3.session_id
where (t1.internal_objects_alloc_page_count>0
or t1.user_objects_alloc_page_count >0
or t1.internal_objects_dealloc_page_count>0
or t1.user_objects_dealloc_page_count>0)
order by t1.internal_objects_alloc_page_count desc
# TEMPDB运用量计算
select <参考internal_objects_alloc_page_count>*8/1024/1024 as [Size_GB]
# TEMPDB运用SQL语句查询
select s.text,p.*
from master.dbo.sysprocesses p
cross apply sys.dm_exec_sql_text(p.sql_handle) s
where spid = <Session_id>
- TEMPDB 테스트 문 (테스트를 위해 TEMPDB를 빠르게 사용할 수 있음)
SELECT *
from sys.dm_db_session_space_usage t1,sys.dm_db_session_space_usage t2,sys.dm_db_session_space_usage t3,sys.dm_db_session_space_usage t4,sys.dm_db_session_space_usage t5
order by 1,2,3,4,5,6,7,8 desc
TEMPDB 최적화 제안
-
tempdb 데이터베이스 파일이 너무 적게 증가하지 않도록 파일 증분을 적절한 크기로 설정합니다. 파일 증분이 tempdb에 기록 된 데이터 양에 비해 너무 작 으면 tempdb를 지속적으로 확장해야하므로 성능에 영향을줍니다.
-
디스크 너비를 최대화하기 위해 필요한만큼 파일을 작성하십시오. 여러 파일을 사용하면 tempdb 저장소 경합을 줄이고 확장 성을 높일 수 있습니다. 그러나이 작업은 성능을 저하시키고 관리 오버 헤드를 증가시킬 수 있으므로 너무 많은 파일을 생성하지 마십시오. 일반적으로 서버의 각 CPU에 대해 데이터 파일 (연결 마스크 설정을 설명하는 데 사용됨)을 만든 다음 필요에 따라 파일 수를 위아래로 조정합니다. 듀얼 코어 CPU는 2 개의 CPU로 취급됩니다.
-
환경의 일반적인 작업을 수용하기에 충분한 값으로 파일 크기를 설정하여 모든 tempdb 파일에 대한 공간을 미리 할당합니다. 이렇게하면 tempdb가 너무 자주 확장되어 성능에 영향을주지 않습니다. tempdb 데이터베이스는 자동으로 확장되도록 설정해야하지만이 설정은 예기치 않은 상황이 발생할 때 디스크 공간을 늘리는 데 사용됩니다.
-
비례 채우기 성능을 최적화 할 수 있도록 각 데이터 파일을 동일한 크기로 만드십시오.
-
빠른 I / O 하위 시스템에 tempdb 데이터베이스를 배치합니다. 직접 연결된 디스크가 많은 경우 디스크 스트라이핑을 사용하십시오.
-
사용자 데이터베이스에서 사용하는 디스크가 아닌 다른 디스크에 tempdb 데이터베이스를 배치합니다.
TEMPDB 위치 조정
※ 다음 과정은 실제 최적화 단계가 아닌 위치 조정 시연입니다.
기본적으로 TempDB는 시스템 테이블과 함께 생성되어 시스템 디스크에 배치 될 수 있습니다. [Fast I / O 하위 시스템에 tempdb 데이터베이스를 배치합니다. 직접 연결된 디스크가 많은 경우 디스크 스트라이핑을 사용하고 [사용자 데이터베이스가 사용하는 디스크가 아닌 디스크에 tempdb 데이터베이스를 배치] TEMPDB 파일의 저장 위치를 최적화하려면 다음 방법을 참조해야합니다.
- tempdb의 논리적 이름과 해당 위치를 확인합니다. 다음 문을 사용할 수 있습니다.
SELECT name, physical_name
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');
실제 파일 :
2. TEMPDB 경로 변경 명령 실행
USE master;
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = tempdev, SIZE = 10MB, MAXSIZE = 10MB, FILEGROWTH = 10%, FILENAME = 'D:\tempdb\tempdb.mdf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp2, SIZE = 10MB, MAXSIZE = 10MB, FILEGROWTH = 10%, FILENAME = 'D:\tempdb\tempdb_mssql_2.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp3, SIZE = 10MB, MAXSIZE = 10MB, FILEGROWTH = 10%, FILENAME = 'D:\tempdb\tempdb_mssql_3.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = temp4, SIZE = 10MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10%, FILENAME = 'D:\tempdb\tempdb_mssql_4.ndf');
GO
ALTER DATABASE tempdb
MODIFY FILE (NAME = templog, SIZE = 10MB, MAXSIZE = UNLIMITED, FILEGROWTH = 10%, FILENAME = 'D:\tempdb\templog.ldf');
GO
매개 변수 설명 : https://docs.microsoft.com/zh-cn/sql/t-sql/statements/alter-database-transact-sql-file-and-filegroup-options?view=sql-server-ver15
Microsoft SQL Server Management Studio 정보보기 :
- SQL Server 데이터베이스 서비스 다시 시작
서비스 이름 : SQL Server
- tempdb의 논리적 이름과 해당 위치를 확인합니다. 다음 문을 사용할 수 있습니다.
SELECT name, physical_name
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');
실제 파일 :
- 공간을 확보하기 위해 원본 TEMPDB 파일을 삭제할 수 있습니다.
이 단계는 수동 작업이 필요하며 시스템은 이전 TEMPDB 파일을 자동으로 삭제하지 않습니다.
TEMPDB의 일반적인 실수
- 불충분 한 트랜잭션 로그로 인한 오류, 복구 모드를 샘플로 변경하는 것이 좋습니다.
The transaction log for database 'tempdb' is full. To find out why space in the log cannot be reused, see the log_reuse_wait_desc column in sys.databases
数据库 'tempdb' 的事务日志已满。若要查明无法重用日志中的空间的原因,请参阅 sys.databases 中的 log_reuse_wait_desc 列。
- 불충분 한 데이터 저장으로 인한 오류, SQL 문을 최적화하거나 TEMPDB 파일을 늘리는 것이 좋습니다.
"Could not allocate space for object 'dbo.TempTable_xxxx' in database 'db_yyyy' because the 'PRIMARY' filegroup is full. Create disk space by deleting unneeded files, dropping objects in the filegroup, adding additional files to the filegroup, or setting autogrowth on for existing files in the filegroup."
消息 1105,级别 17,状态 2,第 1 行
无法为数据库 'tempdb' 中的对象 'dbo.SORT temporary run storage: 140737503494144' 分配空间,因为 'PRIMARY' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。