管理SQL Server空间管理技巧:怎样节省空间

1. SQL Server空间管理技巧

对于大多数企业而言,数据库竞争对手间的反复运行、数据库的爬取以及数据库的扩张会导致持续的数据库空间开销。为了维护数据库的安全性和可持续性,实施SQL Server空间管理技巧尤为重要。

2. 怎样找出空间浪费

2.1 查看对表的使用率

可以查看表的使用率,以便识别哪些表贡献了较大的磁盘空间,可以考虑减少不必要的表或者索引。可以使用查询监视器观察下面这些指标,以确定哪些表需要进行压缩或者过期。

SELECT TOP 10

o.name AS ObjectName,

s.name AS ObjectOwner,

SUM(a.total_pages) AS TotalPages,

SUM(a.used_pages) AS UsedPages,

(SUM(a.total_pages) - SUM(a.used_pages)) AS UnusedPages

FROM

sys.allocation_units AS a

INNER JOIN sys.partitions AS p ON a.container_id = p.partition_id

INNER JOIN sys.objects AS o ON p.object_id = o.object_id

INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id

WHERE

p.index_id <= 1

GROUP BY

o.name, s.name

ORDER BY

SUM(a.total_pages) DESC;

输出结果示例:

ObjectName ObjectOwner TotalPages UsedPages UnusedPages

-------------------------------------------------------------

Customrs dbo 1548497 1237879 310618

Sales dbo 345504 318274 27230

Products dbo 118797 98608 20189

Order_Details dbo 71110 60954 10156

Employees dbo 55831 51681 4149

Orders dbo 43926 38700 5226

Shippers dbo 159 70 89

Categories dbo 35 21 14

2.2 检查日志文件大小

数据库日志文件的大小是动态变化的,同时也是数据库空间管理中容易被“忽视”的因素。日志文件的过度增长和过于频繁的磁盘写入是影响 SQL Server 性能的两大因素之一。因此,检查日志文件大小,定期进行压缩是SQL Server空间管理技术的必修内容之一。下面是查看日志文件大小的SQL查询语句。

SELECT DB_NAME(database_id) AS DatabaseName,

Name AS LogFileName,

((size * 8) / 1024) as LogFileSizeMB

FROM sys.master_files

WHERE database_id = DB_id(N'Financial')

AND type_desc = N'LOG';

输出结果示例:

DatabaseName LogFileName LogFileSizeMB

---------------------------------------- ---------------- ----------

Financial Financial_log 5797.00

3. 怎样节省空间

3.1 数据压缩

数据压缩是SQL Server空间管理技巧的一种重要手段。可以使用两种方式进行压缩:

行压缩:压缩表中的单个行,减少重复数据。

页压缩:压缩整个数据页,减少空间的使用。

下面是使用基本的压缩方法来创建一个压缩表的查询示例:

-- 创建只包含 Person 表行数据的压缩表

CREATE TABLE Person_Compressed

(

PersonID INT IDENTITY(1, 1) PRIMARY KEY NONCLUSTERED,

LastName NVARCHAR(50),

FirstName NVARCHAR(50),

Address NVARCHAR(50),

City NVARCHAR(50),

CountryRegion NVARCHAR(50),

PhoneNumber NVARCHAR(50)

)

WITH (DATA_COMPRESSION = ROW);

3.2 数据库分区

数据库分区是一种可以将单个数据库分成小型数据库,以便更好地管理和维护的方法。分区的目的是更好地管理大型表,将数据按逻辑优化进行存储,从而提高数据库性能和管理。下面是使用数据分区来创建分区表的查询示例:

-- 创建用于存储 Order History 的分区表

CREATE PARTITION FUNCTION pf_OrderHistory (DATE)

AS RANGE LEFT

FOR VALUES ('20100101','20110101','20120101','20130101','20140101','20150101','20160101');

GO

CREATE PARTITION SCHEME ps_OrderHistory

AS PARTITION pf_OrderHistory

ALL TO ([PRIMARY]);

GO

CREATE TABLE OrderHistory

(salesOrderID int not null,

OrderDate date not null,

OrderMonth as (DATENAME(month, OrderDate)),

Qty smallint not null,

Price money not null,

TotalAmount AS (Price * Qty))

ON ps_OrderHistory(OrderDate);

GO

3.3 数据清理

定期清理无效或不再使用的数据,将是SQL Server空间管理技巧的关键一步,也是减少数据库存储空间的有效途径。数据清理的常见场景包括:删除无用的表、索引和其他不再使用的数据库对象等。下面是查询示例演示如何删除无用的数据库对象。

-- 删除无用触发器的例子

DROP TRIGGER dbo.TriggerName;

GO

3.4 压缩数据库

使用SQL Server压缩工具可以压缩整个数据库,以减少磁盘空间。压缩数据库可以通过两种方法进行:通过SQL Server Management Studio和执行 T-SQL 语句。下面是执行 T-SQL 语句来压缩数据库的示例。

USE AdventureWorks2014;

GO

DBCC SHRINKFILE (AdventureWorks_data);

4. 总结

为了使我们的数据库更快、更安全、更可持续,我们需要定期执行SQL Server空间管理技巧。以上介绍的方法展示了如何找出数据库空间浪费的因素,以及如何使用数据压缩、数据库分区、数据清理和数据库压缩等方法来节省存储空间。但是,最好的方法是在使用数据库时就为空间管理计划做好安排,这将避免在增加数据时出现问题。无论您是新手还是经验丰富的数据库管理员,掌握这些技巧都将有助于提高数据库的性能和可持续性。

数据库标签