1. 简介
Microsoft SQL Server(以下简称MSSQL)是一款基于关系型数据库的管理系统。作为一款数据库管理系统,MSSQL的运维工作是非常繁琐且重要的。下面本文将从几个方面介绍MSSQL库的高效运维攻略。
2. 监控与维护
2.1 监控要点
在MSSQL运维中,监控数据库是非常关键的。监控MSSQL库的常用指标包括:CPU使用率、内存使用率、磁盘使用率、网络流量等。我们需要根据这些指标,及时发现问题并解决。
例如,以下SQL脚本可以用于查看CPU使用率较高的查询:
SELECT TOP 10
sqltext.TEXT,
reqs.execution_count,
reqs.total_worker_time AS Total_CPU,
reqs.total_elapsed_time / reqs.execution_count AS Avg_CPU_Time,
reqs.total_elapsed_time AS Total_Elapsed_Time,
reqs.last_execution_time AS Last_Execution_Time,
obj.name AS Object_Name,
stc.text AS Query_Text,
DB_NAME(reqs.database_id) AS Database_Name
FROM sys.dm_exec_query_stats reqs
CROSS APPLY sys.dm_exec_sql_text(reqs.sql_handle) AS sqltext
LEFT OUTER JOIN sys.Objects obj ON sqltext.Objectid = obj.object_id
LEFT OUTER JOIN sys.dm_exec_cached_plans cp ON reqs.plan_handle = cp.plan_handle
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS stc
WHERE reqs.total_worker_time / reqs.execution_count > 5000
ORDER BY reqs.total_worker_time DESC;
这个脚本将返回CPU使用率较高的前10个查询,并按照执行时间排序,可以用于发现哪些查询需要优化。
2.2 维护要点
除了监控之外,我们还需要在日常维护中对MSSQL库进行常规维护,包括备份、索引优化、清理等。
2.2.1 备份
备份是非常重要的,可以保证数据的安全性。MSSQL库有三种备份方式,分别是完全备份、差异备份和事务日志备份。
以下SQL脚本可以用于进行完全备份:
BACKUP DATABASE [database_name] TO DISK = N'backup_file_path' WITH NOFORMAT, NOINIT,NAME = N'database_name-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
如果要进行差异备份,可以将BACKUP DATABASE替换为BACKUP DATABASE ... WITH DIFFERENTIAL。
如果要进行事务日志备份,可以使用以下SQL脚本:
BACKUP LOG [database_name] TO DISK = N'backup_file_path' WITH NOFORMAT, NOINIT,NAME = N'database_name-Transaction Log Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
2.2.2 索引优化
索引是提高查询性能的关键之一。可以使用以下SQL脚本查看索引使用情况:
SELECT
DB_NAME(D.database_id) AS [Database Name]
, OBJECT_SCHEMA_NAME(D.[object_id], D.database_id) AS [Schema Name]
, OBJECT_NAME(D.[object_id], D.database_id) AS [Table Name]
, D.[name] AS [Index Name]
, D.index_id AS [Index ID]
, CASE D.index_id
WHEN 0 THEN 'HEAP'
ELSE 'CLUSTERED OR NONCLUSTERED'
END AS [Index Type]
, (SELECT SUM(U.used_page_count) FROM sys.dm_db_partition_stats U WHERE U.index_id = D.index_id AND U.object_id = D.object_id) AS [Pages Used]
, (SELECT SUM(U.total_page_count) FROM sys.dm_db_partition_stats U WHERE U.index_id = D.index_id AND U.object_id = D.object_id) AS [Total Pages]
, (SELECT CONVERT(DECIMAL(18,2), SUM(U.used_page_count) / SUM(U.total_page_count * 1.0) * 100.0) FROM sys.dm_db_partition_stats U WHERE U.index_id = D.index_id AND U.object_id = D.object_id) AS [Percent Used]
, CASE
WHEN D.fill_factor = 0 THEN ''
WHEN D.fill_factor = 100 THEN ''
ELSE CAST(D.fill_factor AS VARCHAR(3)) + '%'
END AS [Fill Factor]
, (SELECT COUNT(*) FROM sys.dm_db_index_usage_stats U WHERE U.index_id = D.index_id AND U.object_id = D.object_id AND U.user_seeks + U.user_scans + U.user_lookups > 0) AS [Index Used]
, (SELECT COUNT(*) FROM sys.dm_db_index_usage_stats U WHERE U.index_id = D.index_id AND U.object_id = D.object_id AND U.user_updates > 0) AS [Index Updated]
FROM sys.indexes D
WHERE D.object_id NOT IN (
SELECT object_id FROM sys.objects WHERE is_ms_shipped = 1
)
ORDER BY [Database Name], [Schema Name], [Table Name], [Index ID];
以上脚本将返回索引使用情况,并根据表名、索引ID排序。
2.2.3 清理
日常清理可以释放磁盘空间,提高MSSQL运行效率。常见的清理操作包括删除不再使用的表、删除日志文件、清理缓存等。
以下SQL脚本可以用于清理缓存:
DBCC FREEPROCCACHE;
CHECKPOINT;
DBCC DROPCLEANBUFFERS;
该脚本将清空查询缓存和数据缓存,并提交所有挂起的事务。
3. 数据库优化
在进行MSSQL库的运维时,我们还需要关注数据库性能问题。以下是几个常见的优化方法。
3.1 建议使用内存表
MSSQL库提供了内存表功能,可以将表数据存储于内存中,从而提高查询性能。可以使用以下SQL脚本创建内存表:
CREATE TABLE [database_name].[dbo].[temp_PT]
(
[Column1] [int] NOT NULL,
[Column2] [nvarchar](10) NOT NULL,
) ON [PRIMARY] WITH
(MEMORY_OPTIMIZED = ON);
3.2 查询语句优化
查询语句中,WHERE子句中的条件可以影响查询性能。以下是一些常用的优化方法。
3.2.1 使用索引
根据WHERE子句中的条件,使用适当的索引可以提高查询性能。
以下SQL脚本可以用于查看索引使用情况:
SELECT DB_NAME(database_id) as DBName,
OBJECT_NAME(object_id) as TableName,
i.name as IndexName,
user_seeks,
user_scans,
user_lookups,
user_updates
FROM sys.dm_db_index_usage_stats stats
INNER JOIN sys.indexes i on i.object_id = stats.object_id and i.index_id = stats.index_id
WHERE database_id = DB_ID('database_name');
3.2.2 使用IN代替OR
如果WHERE子句中含有多个OR条件,查询性能会受到影响。可以使用IN代替OR。
例如:
SELECT *
FROM table_name
WHERE column_name = 'value1' OR column_name = 'value2';
可以替换为:
SELECT *
FROM table_name
WHERE column_name IN ('value1', 'value2');
3.2.3 避免使用不等于
不等于运算符(<>)在查询中会影响性能。如果可以,应该避免使用不等于运算符。
例如:
SELECT *
FROM table_name
WHERE column_name <> 'value';
可以替换为:
SELECT *
FROM table_name
WHERE NOT(column_name = 'value');
3.2.4 避免使用LIKE
LIKE运算符也会影响性能。如果可以,应该尽量避免使用LIKE运算符。
例如:
SELECT *
FROM table_name
WHERE column_name LIKE '%value%';
可以替换为:
SELECT *
FROM table_name
WHERE PATINDEX('%value%', column_name) > 0;
4. 总结
MSSQL库的运维包括监控、维护和优化等方面。在监控方面,需要关注CPU、内存、磁盘和网络使用情况。在维护方面,需要备份、清理和优化索引等。在优化方面,可以使用内存表、优化查询语句等。做好这些工作,可以提高MSSQL库在企业中的运行效率。