高效操作!学会SQL Server 2023数据库收缩技巧 (sqlserver2023 数据库收缩)

在日常的数据库管理与维护中,数据库的收缩技巧是一项非常重要和必不可少的操作。SQL Server 2023作为业内领先的数据库管理系统,其数据库收缩技巧也备受业内人士的关注和探讨。本文将重点介绍SQL Server 2023数据库的收缩技巧及其高效操作方法。

一、为什么要进行数据库收缩?

在使用SQL Server 2023数据库过程中,由于数据的变更或删除操作等情况,数据库中会产生大量的空闲空间。如果不及时清理这些空间,一方面会占用大量磁盘空间,影响硬件资源的性能;另一方面,也会影响数据库的性能和运行速度。因此,进行数据库的收缩操作是非常必要和重要的。

二、SQL Server 2023数据库收缩的方法

SQL Server 2023提供的数据库收缩方法主要有两种:1. 索引重建;2. DBCC SHRINKFILE命令。下面我们将详细介绍这两种方法的操作步骤。

1. 索引重建

索引重建的方法是先删除数据库的索引,然后再重建索引的过程,这个过程中就可以清理无效空间。具体步骤如下:

(1) 使用SQL Server Management Studio打开SQL Server 2023数据库;

(2) 在对象资源管理器中选择数据库,鼠标右键点击该数据库,选择“任务”菜单项中的“生成脚本”选项,弹出如下图所示的“生成脚本向导”窗口;

![image-20231022023944353](https://user-images.githubusercontent.com/87613636/138377605-4e2023e6-486f-4e02-a15d-f0b8a07a0ba6.png)

(3) 选择“选择特定数据库对象”选项,并选中“表”和“索引”项,如下图所示:

![image-20231022023749622](https://user-images.githubusercontent.com/87613636/138378337-a0a7f732-1e2a-47ed-b9c9-d7abc404b0d4.png)

(4) 根据需要选择生成脚本的文件位置和文件名,并最后点击“完成”按钮,完成数据库索引脚本的生成;

(5) 在SQL Server Management Studio中执行生成的脚本,并等待重建索引的过程完成即可。

2. DBCC SHRINKFILE命令

DBCC SHRINKFILE命令是SQL Server 2023提供的另一种收缩数据库的方法,具体操作步骤如下:

(1) 打开SQL Server 2023管理工具,使用以下命令查看数据库文件的大小:

“`

sp_helpfile

“`

(2) 使用以下命令将数据文件收缩至指定大小:

“`

DBCC SHRINKFILE(DBFileName, TargetSize)

“`

(3) 使用以下命令将事务日志文件收缩至指定大小:

“`

DBCC SHRINKFILE(LogFileName, TargetSize)

“`

其中,DBFileName和LogFileName分别为需要收缩的数据文件和事务日志文件的名称,TargetSize为收缩后需要达到的文件大小。执行以上命令后,系统将自动对数据库文件进行收缩。

三、高效操作SQL Server 2023数据库收缩的技巧

在操作SQL Server 2023数据库的收缩过程中,为了实现高效操作,我们需要掌握以下几个技巧:

1. 合理设置数据库相关参数

在进行数据库收缩前,要先合理设置数据库相关参数。其中,如下参数是与数据库收缩操作相关,需要特别关注:

(1) recovery model参数

将数据库的recovery model参数设置为“simple”模式,可减少数据库的日志文件大小,进而减少要收缩的空间量。

(2) autoshrink参数

将SQL Server 2023的autoshrink参数设置为“false”模式,可避免数据库自动进行收缩操作。

2. 合理规划数据库的空间

为了避免频繁进行数据库收缩操作,数据库管理员需要在设计数据库时就合理规划数据库的空间,以规避因数据增长导致的空间不足的问题。

3. 定期进行数据库备份

定期进行数据库备份是非常重要的,不仅能保证数据库的安全性和稳定性,同时也能更好地提高数据库的运行性能和效率。

结语

通过本文的介绍,相信大家已经对SQL Server 2023数据库的收缩技巧有了更深入的了解和掌握。在实际工作中,合理使用数据库的索引重建和DBCC SHRINKFILE命令,以及掌握高效操作技巧,将会极大地提高我们的工作效率和数据库管理的质量。

相关问题拓展阅读:

SQLServer数据库收缩相关知识

SQL Server 数据库采取预先分配空间的方法来建立数据库的数据文件或者日志文件,比如数据文件的空间分配了300MB,而实际上只占用了20MB空间,这样就会造成磁盘存储空间的浪费。可以通过数据库收缩技术对数据库中的每个文件进行收缩,删除已经分配但没有使用的页。从而节省服务器的存储的成本。

官方解释:收缩数据文件通过将数据肆滑页从文件末尾移动到更靠近文件开头的未占用的空间来恢复空间。在文件末尾创建足够的可用空间后,可以取消对文件末尾的数据页的分配并将它们返回给文件系统。

收缩后的数据库不能小于数据库最初创建时指定的大小。 或是上一次使用文件大小更改操作(如 DBCC SHRINKFILE)设置的显式大小。

比如:如果数据库最初创建时的大小为 10 MB,后来增长到 100 MB,则该数据库最小只能收缩到 10 MB,即使已经删除数据库的所有数据也是如此。

不能在备份数据库时收缩数据库。 反之,也不能在数据库执行收缩操作时备份数据库。

介绍:收缩指定数据库中的数据文件大小。

语法格式:

参数说明:

介绍亏毁:收缩当前数据库的指定数据或日志文件的大小,或通过将数据从指定的文件移动到相同文件组中的其他文件来清空文件,以允许从数据库中删除该文件。文件大小可以收缩到比创建该文件时所指定的大小更小。这样会将最小文件大小重置为新值。

语法格式:

参数说明:

例如,如果创建一个10MB 的文件,然后在文件仍然为空的时候将文件收缩为2 MB,默认文件大小将设置为2 MB。这只适用于永远不会包含数据的空文件。

另附SqlServer常见问题解答

1)管理器不会主动刷新,需要手工刷新一下才能看到最新状态(性能方面的考虑)

2)很少情况下,恢复进程被挂起了。这个时候假设你要恢复并且回到可访问状态,要执行:

RESTORE database dbname with recovery

这使得恢复过程能完全结束。

3)如果你要不断恢复后面的日志文件,的确需要使数据库处于“正在还原状态”,

这通常是执行下面命令:

RESTORE database dbname with norecovery

原来SQL Server对服务器内存的使用策略是用多少内存就占用多少内存,只用在服务器内存不足时,才会释放一点占用的内存,所以SQL Server 服务器内存往往会占用很高。我们可以通过DBCC MemoryStatus来查看内存状态。

SQL SERVER运行时会执行两种缓存:

1. 数据缓存:执行个查询语句,SQL SERVER会将相关的数据页(SQL SERVER操作的数据都是以页为单位的)加载到内存中来, 下一次如果再次请求此页的数据的时候,就无需读取磁盘了,大大提高了速度。

2.执行命令缓存:在执行存储过程,自定函数时,SQL SERVER需要先二进制编译再运行,编译后的结果也会缓存起来, 再次调用时就无需再次编译。

可以调用以下几个DBCC管理命令来清理这些缓存:

但是,这几个命令虽然会清除掉现有缓存,为新的缓存腾地方,但是Sql server并不会因此释放掉已经占用的内存销雹备。SQL SERVER并没有提供任何命令允许我们释放不用到的内存。因此我们只能通过动态调整SQL SERVER可用的物理内存设置来强迫它释放内存。

解决SQLSERVER内存占用过高的方法:

1、清除所有缓存  DBCC DROPLEANBUFFERS

2、调整SQLSERVER可使用的更大服务器内存。

  在SQL管理器,右击实例名称

  在属性实例属性里面找到内存选项

把更大内存改成合适的内存,确定后内存就会被强制释放,然后重启实例。再看看任务管理器,内存使用率就降下来啦。

  1、查看连接对象

USE master

GO

–如果要指定数据库就把注释去掉

SELECT * FROM sys. WHERE >50 –AND DB_NAME()=’gposdb’

  当前连接对象有67个其中‘WINAME’的主机名,‘jTDS’的进程名不属于已知常用软件,找到这台主机并解决连接问题。在360流量防火墙中查看有哪个软件连接了服务器IP,除之。

2、然后使用下面语句看一下各项指标是否正常,是否有阻塞,正常情况下搜索结果应该为空。

SELECT TOP 10

,

,

AS ‘开始时间’,

AS ‘状态’,

AS ‘命令’,

dest. AS ‘sql语句’,

DB_NAME() AS ‘数据库名’,

AS ‘正在阻塞其他会话的会话ID’,

AS ‘等待资源类型’,

AS ‘等待时间’,

AS ‘等待的资源’,

AS ‘物理读次数’,

AS ‘写次数’,

AS ‘逻辑读次数’,

AS ‘返回结果行数’

FROM sys. AS der

CROSS APP

sys.(der.) AS dest

WHERE >50 AND DB_NAME(der.)=’gposdb’

ORDER BY DESC

查看是哪些SQL语句占用较大可以使用下面代码

–在SS里选择以文本格式显示结果

SELECT TOP 10

dest. AS ‘sql语句’

FROM sys. AS der

CROSS APP

sys.(der.) AS dest

WHERE >50

ORDER BY DESC

3、如果SQLSERVER存在要等待的资源,那么执行下面语句就会显示出会话中有多少个worker在等待

SELECT TOP 10

,

,

AS ‘开始时间’,

AS ‘状态’,

AS ‘命令’,

dest. AS ‘sql语句’,

DB_NAME() AS ‘数据库名’,

AS ‘正在阻塞其他会话的会话ID’,

der. AS ‘等待资源类型’,

AS ‘等待时间’,

AS ‘等待的资源’,

. AS ‘当前正在进行等待的任务数’,

AS ‘物理读次数’,

AS ‘写次数’,

AS ‘逻辑读次数’,

AS ‘返回结果行数’

FROM sys. AS der

INNER JOIN . AS dows

ON der.=.

CROSS APP

sys.(der.) AS dest

WHERE >50

ORDER BY DESC;

4、查询CPU占用更高的SQL语句

SELECT TOP 10

total_worker_time/execution_count AS avg_cpu_cost, plan_handle,

execution_count,

(SELECT SUBSTRING(text, statement_start_offset/2 + 1,

(CASE WHEN statement_end_offset = -1

THEN LEN(CONVERT(nvarchar(max), text)) * 2

ELSE statement_end_offset

END – statement_start_offset)/2)

FROM sys.dm_exec_sql_text(sql_handle)) AS query_text

FROM sys.dm_exec_query_stats

ORDER BY DESC;

5、索引缺失查询

SELECT

DatabaseName = DB_NAME(database_id)

, = count(*)

FROM sys.dm_db_missing_index_details

GROUP BY DB_NAME(database_id)

ORDER BY 2 DESC;

SELECT TOP 10

= ROUND(avg_total_user_cost * avg_user_impact * (user_seeks + user_scans),0)

, avg_user_impact

, TableName = statement

, = equality_columns

, = inequality_columns

, = included_columns

FROM sys.dm_db_missing_index_groups g

INNER JOIN sys.dm_db_missing_index_group_stats s

ON s.group_handle = g.index_group_handle

INNER JOIN sys.dm_db_missing_index_details d

ON d.index_handle = g.index_handle

ORDER BY DESC;

关于sqlserver2023 数据库收缩的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 高效操作!学会SQL Server 2023数据库收缩技巧 (sqlserver2023 数据库收缩)