SELECT * FROM orders
WHERE YEAR(created_at) = 2023;
该查询对字段created_at使用函数,破坏了索引有序性。应改写为:
SELECT * FROM orders
WHERE created_at >= '2023-01-01'
AND created_at < '2024-01-01';
通过范围比较保留索引能力,提升查询效率。
2.3 利用系统视图定位慢查询源头
在数据库性能调优中,系统视图是分析慢查询的核心工具。通过查询如 `information_schema.processlist` 或 MySQL 的 `performance_schema.events_statements_history`,可实时查看正在执行的SQL及其执行时长。
关键系统视图示例
SELECT
DIGEST_TEXT,
AVG_TIMER_WAIT / 1000000000 AS avg_latency_sec,
EXEC_COUNT
FROM performance_schema.events_statements_summary_by_digest
WHERE AVG_TIMER_WAIT > 10000000000
ORDER BY avg_latency_sec DESC
LIMIT 5;
在高并发数据库环境中,阻塞会话是导致性能下降的常见原因。通过 SQL Server 提供的动态管理视图(DMV),可以实时捕捉正在发生的阻塞链。
关键 DMV 视图
主要依赖以下视图:
sys.dm_exec_requests:获取当前请求的执行状态
sys.dm_exec_sessions:查看会话详细信息
sys.dm_os_waiting_tasks:识别等待中的任务及其阻塞者
查询阻塞会话的典型脚本
SELECT
wt.blocking_session_id AS BlockingSessID,
wt.session_id AS WaitingSessID,
s.login_name,
s.host_name,
r.wait_type,
r.wait_time,
r.command
FROM sys.dm_os_waiting_tasks wt
INNER JOIN sys.dm_exec_sessions s ON wt.session_id = s.session_id
INNER JOIN sys.dm_exec_requests r ON wt.session_id = r.session_id
WHERE wt.blocking_session_id IS NOT NULL;
-- 低效写法:触发全表扫描
SELECT * FROM orders
WHERE YEAR(create_time) = 2023;
-- 高效写法:利用索引范围扫描
SELECT * FROM orders
WHERE create_time >= '2023-01-01'
AND create_time < '2024-01-01';
TempDB 是 SQL Server 中用于存储临时对象和中间执行结果的关键系统数据库。高并发场景下,TempDB 容易成为性能瓶颈,主要表现为 PAGELATCH_UP 或 PAGELATCH_EX 等等待类型。
常见争用类型识别
通过动态管理视图可定位争用源:
SELECT
wait_type,
waiting_tasks_count,
signal_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE 'PAGELATCH%' OR wait_type LIKE 'PAGEIOLATCH%'
ORDER BY signal_wait_time_ms DESC;
MySQL 提供 information_schema.INNODB_TRX 和 performance_schema.data_locks 表用于实时监控事务状态与锁持有情况。
SELECT
r.trx_id waiting_trx_id,
b.trx_id blocking_trx_id,
b.trx_query blocking_query,
b.trx_mysql_thread_id blocking_thread
FROM performance_schema.data_lock_waits w
JOIN information_schema.INNODB_TRX b ON b.trx_id = w.blocking_engine_transaction_id
JOIN information_schema.INNODB_TRX r ON r.trx_id = w.requesting_engine_transaction_id;
上述查询可定位正在被阻塞的事务及其阻塞者,结合线程 ID 可进一步追踪至应用层调用栈。
阻塞链可视化
层级
事务ID
状态
1
T1
持有行锁,阻塞T2
2
T2
等待T1,阻塞T3
3
T3
等待T2,形成链式阻塞
通过持续采集并绘制此类关系图,可实现对长尾阻塞的精准定位与提前预警。
4.4 基于 Extended Events 的实时性能捕获
事件会话的创建与配置
Extended Events 是 SQL Server 中轻量级的性能监控框架,适用于实时捕获数据库引擎的行为。通过创建自定义事件会话,可精准追踪特定性能指标。
CREATE EVENT SESSION [PerfCapture] ON SERVER
ADD EVENT sqlserver.rpc_completed(
WHERE duration > 50000),
ADD EVENT sqlserver.sql_batch_completed(
WHERE cpu_time > 100000)
ADD TARGET package0.ring_buffer
WITH (MAX_DISPATCH_LATENCY = 1 SECONDS);