SQL Server 日常维护之九:TempDB优化

TEMPDB概述

tempdb全局存储内部对象,用户对象,临时表,临时对象,以及SQL Server操作创建的存储过程。每个数据库实例只有一个tempdb,所以可能存在性能以及磁盘空间瓶颈。如下是tempdb空间的运用途径:
在这里插入图片描述
各种形式的可用空间及过度饿DDL/DML操作都会导致tempdb负载过重。这会导致运行在服务器上不相干程序运行缓慢或者运行失败。
  tempdb的一些常见通病如下:
  - 耗完了tempdb的所有存储空间
  - 读取tempdb时的I/O瓶颈造成的查询运行缓慢。
  - 过度的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优化建议

  1. 将文件增量设置为合理的大小以避免 tempdb 数据库文件的增量过小。如果文件的增量与写入 tempdb 的数据量相比过小,则 tempdb 可能需要不断扩大,这将影响性能。

  2. 根据需要创建足够多的文件以使磁盘宽度最大化。使用多个文件可以减少 tempdb 存储争用并获得更大的可伸缩性。但是,请勿创建过多的文件,因为此操作可能降低性能并增加管理开销。作为通用原则,为服务器中的每一个 CPU 创建一个数据文件(用于解释任何关联掩码设置),然后根据需要上下调整文件的数量。请注意,双核心 CPU 将被视为两个 CPU。

  3. 通过将文件大小设置为足够容纳环境中典型工作负荷的值来预分配所有 tempdb 文件的空间。这可以避免 tempdb 因扩展得过于频繁而影响性能。tempdb 数据库应设置为自动增长,但是在出现意外情况时此设置将用于增加磁盘空间。

  4. 使每个数据文件的大小相同,这样可以优化比例填充的性能。

  5. 将 tempdb 数据库放置在快速 I/O 子系统中。如果有许多直接连接的磁盘,则请使用磁盘条带化。

  6. 将 tempdb 数据库放置在用户数据库使用的磁盘以外的磁盘中。

TEMPDB位置调整

※ 如下过程只是演示位置调整,不是实际优化步骤。
默认情况之下,TempDB可能与系统表一起被创建并放置在系统盘。根据将[将 tempdb 数据库放置在快速 I/O 子系统中。如果有许多直接连接的磁盘,则请使用磁盘条带化]与[将 tempdb 数据库放置在用户数据库使用的磁盘以外的磁盘中]建议,我们需要参考如下方法来优化TEMPDB文件存储位置。

扫描二维码关注公众号,回复: 12340553 查看本文章
  1. 检查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信息查看:
在这里插入图片描述

  1. SQLServer数据库服务重启

服务名称:SQL Server
在这里插入图片描述

  1. 检查tempdb的逻辑名字和它的存在位置。可以使用下面语句:
SELECT name, physical_name
FROM sys.master_files
WHERE database_id = DB_ID('tempdb');

在这里插入图片描述
物理文件:
在这里插入图片描述

  1. 原来TEMPDB文件可以删除释放空间

此步骤需要手工操作,系统不会自动删除旧TEMPDB文件
在这里插入图片描述

TEMPDB常见错误

在这里插入图片描述

  1. 事务日志不足导致的错误,建议将恢复模式变更为Sample
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 列。
  1. 数据存储不足导致的错误,建议优化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' 文件组已满。请删除不需要的文件、删除文件组中的对象、将其他文件添加到文件组或为文件组中的现有文件启用自动增长,以便增加可用磁盘空间。

猜你喜欢

转载自blog.csdn.net/weixin_38623994/article/details/112557011