作为 SQL Server DBA,拥有正确的查询集可以显著简化您的工作流程、增强监控并帮助排除故障。以下是解决常见管理任务的五个基本查询,每个查询都附有详细说明,以帮助您了解其目的、解释结果并采取适当的措施。
目的: 了解 SQL Server 实例正在等待什么对于诊断性能瓶颈非常重要。等待统计数据揭示了服务器大部分时间在等待什么,无论是 CPU、内存、I/O 还是锁定问题。
查询:
SELECT
wait_type,
CAST(SUM(wait_time_ms) AS BIGINT) / 1000.0 AS total_wait_time_s,
CAST(SUM(signal_wait_time_ms) AS BIGINT) / 1000.0 AS total_signal_wait_time_s,
CAST(SUM(waiting_tasks_count) AS BIGINT) AS waiting_tasks_count
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN
(
'SLEEP_TASK', 'BROKER_EVENTHANDLER', 'XE_TIMER_EVENT', 'LAZYWRITER_SLEEP',
'SLEEP_BPOOL_FLUSH', 'SLEEP_SYSTEMTASK', 'SQLTRACE_BUFFER_FLUSH',
'XE_DISPATCHER_WAIT'
)
GROUP BY wait_type
ORDER BY total_wait_time_s DESC;
解释:
PAGEIOLATCH_SH
,LCK_M_X
)。解释结果:
PAGEIOLATCH_SH
等待率:表示 SQL Server 正在等待磁盘 I/O 操作,这意味着存在潜在的存储性能问题。SOS_SCHEDULER_YIELD
等待时间:指向 CPU 压力,其中任务由于 CPU 耗尽而频繁让出调度程序。LCK_M_
):建议争用锁,可能是由于长时间运行的事务或效率低下的查询造成的。下一步:
目的: 确定消耗最多资源的查询有助于确定优化工作的优先级。专注于这些“重磅任务”可以显著提高整个系统的性能。
查询:
SELECT TOP 5
SUBSTRING(qt.TEXT,
(qs.statement_start_offset / 2) + 1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset) / 2) + 1
) AS query_text,
qs.total_logical_reads AS total_logical_reads,
qs.total_worker_time / 1000 AS total_cpu_ms,
qs.total_elapsed_time / 1000 AS total_elapsed_ms,
qs.execution_count,
DB_NAME(qt.dbid) AS database_name,
qs.last_execution_time
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_worker_time DESC;
解释:
解释结果:
total_cpu_ms
:表示查询占用大量 CPU。寻找优化查询的方法以使用更少的 CPU 资源。total_logical_reads
:表明查询正在访问大量数据。请考虑索引策略以减少读取次数。execution_count
):即使单次执行的成本不是特别高,但高执行次数也会导致大量累积资源使用。下一步:
sys.dm_exec_query_plan
与此查询结合使用来查看已识别查询的执行计划。SELECT *
,而是仅指定必要的列以减少 I/O。目的: 监控数据库文件的增长和大小对于防止意外的存储问题以及确保自动增长设置得到最佳配置以避免性能下降至关重要。
查询:
SELECT
DB_NAME(database_id) AS database_name,
name AS logical_file_name,
physical_name,
CAST(size AS BIGINT) * 8.0 / 1024 AS size_mb,
CASE
WHEN max_size = -1 THEN 'Unlimited'
ELSE CAST(CAST(max_size AS BIGINT) * 8.0 / 1024 AS VARCHAR(20))
END AS max_size_mb,
growth,
CASE WHEN is_percent_growth = 1 THEN 'Percent' ELSE 'MB' END AS growth_type
FROM sys.master_files
ORDER BY database_name, logical_file_name;
解释:
解释结果:
size_mb
):文件大小较大可能表示数据增长过多或存储使用效率低下。growth
和growth_type
):将自动增长设置为较小的百分比可能会导致频繁的增长事件,从而降低性能。出于可预测性的考虑,固定 MB 增长通常是首选。max_size_mb
):确保文件未设置为“无限制”,除非绝对必要,以防止失控增长。下一步:
目的: 缺少索引会导致全表扫描或数据检索效率低下,从而严重影响查询性能。此查询利用 SQL Server 的动态管理视图 (DMV) 来建议可以提高性能的索引。
查询:
SELECT TOP 5
DB_NAME(mid.database_id) AS database_name,
mid.statement AS table_reference,
mid.equality_columns,
mid.inequality_columns,
mid.included_columns,
migs.user_seeks + migs.user_scans AS total_accesses,
migs.last_user_seek AS last_seek_time,
migs.avg_total_user_cost * migs.avg_user_impact * (migs.user_seeks + migs.user_scans) AS index_advantage_score
FROM sys.dm_db_missing_index_group_stats migs
JOIN sys.dm_db_missing_index_groups mig
ON migs.group_handle = mig.index_group_handle
JOIN sys.dm_db_missing_index_details mid
ON mig.index_handle = mid.index_handle
ORDER BY index_advantage_score DESC;
解释:
WHERE column = value
)。WHERE column > value
)。解释结果:
index_advantage_score
:由于具有较高的潜在性能提升,强烈建议创建索引。total_accesses
):表明该索引经常被使用,因此值得创建它。last_seek_time
):确保索引建议与当前工作负载模式相关。下一步:
目的: 当一个会话锁定其他会话试图访问的资源时,就会发生阻塞,从而导致延迟和潜在的应用程序超时。识别阻塞会话有助于迅速解决争用问题。
查询:
SELECT
r.session_id AS blocked_session_id,
r.blocking_session_id,
s.login_name AS blocked_login,
s.host_name AS blocked_host,
r.wait_type,
r.wait_time,
r.wait_resource
FROM sys.dm_exec_requests AS r
JOIN sys.dm_exec_sessions AS s
ON r.session_id = s.session_id
WHERE r.blocking_session_id <> 0
ORDER BY r.wait_time DESC;
解释:
LCK_M_X
)。解释结果:
wait_time
:表示会话已经等待了相当长一段时间,这可能会影响应用程序的性能。wait_type
:有助于识别阻塞的性质,例如排他锁(LCK_M_X
)或共享锁(LCK_M_S
)。wait_resource
:精确定位导致阻塞的确切资源,以便有针对性地进行故障排除。下一步:
blocking_session_id
来检索有关阻塞会话的详细信息,例如正在运行的查询。KILL [session_id]
。READ COMMITTED SNAPSHOT
)来减少锁定争用。这五个查询为 SQL Server DBA 提供了全面的工具包,以有效地监控和优化其数据库环境:
通过将这些查询集成到您的常规维护例程中,您可以维护一个强大、高效且高性能的 SQL Server 环境。定期监控并根据这些查询的洞察及时优化将有助于防止性能下降并确保数据库运行顺畅。
TOP
子句或添加其他过滤器,以使查询适合您的特定环境和要求。通过持续应用这些实践,您将增强维持最佳性能和快速解决 SQL Server 实例中出现的任何问题的能力。
如有任何疑问,请随时联系我们或分享您对这些问题的经验。持续学习和适应是有效数据库管理的关键。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。