最後活躍 8 months ago

從連線統計、記憶體使用、鎖定交易、效能查詢、索引使用率,到 I/O 熱點與快取命中率,10 大查詢一網打盡,DBA 快收好 📊

check_sql_server_connections.sql 原始檔案
1-- 查詢當前 SQL Server 的總連線數以及不同 IP 來源的連線數
2SELECT
3 COUNT(*) AS TotalConnections, -- 計算總連線數
4 COUNT(DISTINCT client_net_address) AS UniqueIPs -- 計算不同來源 IP 的數量
5FROM sys.dm_exec_connections;
6
7-- 查詢所有當前連線的詳細資訊
8SELECT
9 session_id, -- 連線的會話 ID
10 connect_time, -- 連線建立的時間
11 client_net_address, -- 連線的客戶端 IP 地址
12 local_net_address, -- 伺服器端的本地 IP 地址
13 local_tcp_port, -- 伺服器端的本地 TCP 連接埠
14 protocol_type, -- 連線使用的通訊協定(如 TCP、Named Pipes)
15 encrypt_option -- 連線的加密選項(如 TRUE/FALSE)
16FROM sys.dm_exec_connections
17ORDER BY connect_time DESC; -- 按連線時間排序,最新的在最上方
18
19-- 計算每個客戶端 IP 的連線數量
20SELECT
21 client_net_address, -- 客戶端 IP 地址
22 COUNT(*) AS ConnectionCount -- 來自該 IP 的連線數量
23FROM sys.dm_exec_connections
24GROUP BY client_net_address
25ORDER BY ConnectionCount DESC; -- 按連線數量排序,最多的在最上方
26
27-- 查詢所有處於 "sleeping" 狀態的會話,並統計記憶體使用情況
28SELECT
29 program_name, -- 連線所使用的程式名稱(如 SQL Server Management Studio、應用程式名稱)
30 COUNT(*) AS SessionCount, -- 該程式產生的 "sleeping" 會話數量
31 SUM(memory_usage) * 8 AS TotalMemory_KB, -- 計算總記憶體使用量(KB)
32 SUM(memory_usage) * 8 / 1024 AS TotalMemory_MB -- 計算總記憶體使用量(MB)
33FROM sys.dm_exec_sessions
34WHERE status = 'sleeping' -- 過濾僅查詢 "sleeping" 狀態的會話
35GROUP BY program_name
36ORDER BY TotalMemory_KB DESC; -- 按記憶體使用量排序,使用最多的在最上方
37
sql_server_health_check_queries.sql 原始檔案
1-- ==============================================
2-- 📌 1. 檢查 SQL Server 版本與執行時間
3-- ==============================================
4-- 這可以讓你知道目前 SQL Server 的版本、補丁等級,以及 SQL Server 啟動的時間。
5SELECT
6 SERVERPROPERTY('ProductVersion') AS SQLServerVersion, -- SQL Server 版本
7 SERVERPROPERTY('ProductLevel') AS SQLServerLevel, -- SQL Server 補丁等級(SP、CU)
8 SERVERPROPERTY('Edition') AS SQLEdition, -- SQL Server 版本類型(Standard, Enterprise, Express)
9 sqlserver_start_time AS SQLServerStartTime -- 伺服器上次重啟時間
10FROM sys.dm_os_sys_info;
11
12-- ==============================================
13-- 📌 2. 檢查 SQL Server 記憶體使用狀況
14-- ==============================================
15-- 這段查詢可以幫助你了解 SQL Server 當前使用的記憶體狀況,並檢查是否有記憶體壓力。
16SELECT
17 (physical_memory_in_use_kb / 1024 / 1024) AS SQLServer_Memory_Used_GB, -- SQL Server 目前使用的記憶體
18 (available_commit_limit_kb / 1024 / 1024) AS Available_Commit_Limit_GB, -- SQL Server 允許使用的最大記憶體
19 (virtual_address_space_available_kb / 1024 / 1024) AS Available_Virtual_Memory_GB, -- 剩餘的虛擬記憶體
20 memory_utilization_percentage AS Memory_Utilization_Percentage, -- SQL Server 記憶體使用率(高於 90% 需注意)
21 process_physical_memory_low AS Is_Physical_Memory_Low, -- 是否發生物理記憶體不足(1 = 記憶體不足)
22 process_virtual_memory_low AS Is_Virtual_Memory_Low -- 是否發生虛擬記憶體不足(1 = 記憶體不足)
23FROM sys.dm_os_process_memory;
24
25-- ==============================================
26-- 📌 3. 檢查 SQL Server 最大允許連線數與目前使用數
27-- ==============================================
28-- 這可以幫助你了解 SQL Server 目前的連線數量,以及是否接近上限。
29SELECT
30 value AS MaxConnections -- SQL Server 允許的最大連線數
31FROM sys.configurations
32WHERE name = 'user connections';
33
34SELECT
35 COUNT(*) AS ActiveConnections -- 目前使用中的連線數
36FROM sys.dm_exec_sessions
37WHERE is_user_process = 1;
38
39-- ==============================================
40-- 📌 4. 查找 SQL Server 最長時間的等待類型
41-- ==============================================
42-- 這可以讓你找出系統的瓶頸,例如 CPU 過載、I/O 過慢或記憶體不足。
43SELECT TOP 10
44 wait_type,
45 waiting_tasks_count,
46 wait_time_ms / 1000 AS WaitTimeSec -- 以秒為單位顯示等待時間
47FROM sys.dm_os_wait_stats
48ORDER BY wait_time_ms DESC;
49
50-- ==============================================
51-- 📌 5. 查詢當前最耗資源的前 10 個查詢
52-- ==============================================
53-- 這能讓你找出哪些 SQL 查詢占用了最多的 CPU 或執行時間,以便進行優化。
54SELECT TOP 10
55 qs.total_worker_time / 1000 AS CPU_Time_ms, -- 查詢總 CPU 時間
56 qs.total_elapsed_time / 1000 AS Total_Time_ms, -- 查詢總執行時間
57 qs.execution_count AS ExecutionCount, -- 該查詢執行次數
58 qs.total_logical_reads AS LogicalReads, -- 總記憶體讀取數
59 qs.total_physical_reads AS PhysicalReads, -- 總磁碟讀取數
60 qs.total_logical_writes AS LogicalWrites, -- 總磁碟寫入數
61 q.text AS QueryText -- SQL 查詢內容
62FROM sys.dm_exec_query_stats qs
63CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) q
64ORDER BY qs.total_worker_time DESC;
65
66-- ==============================================
67-- 📌 6. 檢查索引的使用情況(找出沒被用到的索引)
68-- ==============================================
69-- 這可以幫助你找到長期沒被使用的索引,以便考慮是否刪除來減少負擔。
70SELECT
71 OBJECT_NAME(i.object_id) AS TableName, -- 資料表名稱
72 i.name AS IndexName, -- 索引名稱
73 i.index_id,
74 s.user_seeks, -- 索引被查詢優化器選擇使用的次數
75 s.user_scans, -- 索引被完整掃描的次數
76 s.user_lookups, -- 查詢透過索引查找資料的次數
77 s.user_updates -- 該索引有多少次被更新(更新次數高但讀取次數低可能是不必要的索引)
78FROM sys.dm_db_index_usage_stats s
79JOIN sys.indexes i
80 ON i.object_id = s.object_id
81 AND i.index_id = s.index_id
82WHERE OBJECTPROPERTY(i.object_id, 'IsUserTable') = 1
83ORDER BY s.user_updates DESC;
84
85-- ==============================================
86-- 📌 7. 找出索引過多的資料表
87-- ==============================================
88-- 太多索引會影響 INSERT / UPDATE / DELETE 的效能,這能幫助你找出索引過多的資料表。
89SELECT
90 t.name AS TableName,
91 COUNT(i.index_id) AS IndexCount
92FROM sys.indexes i
93JOIN sys.tables t
94 ON i.object_id = t.object_id
95WHERE i.type IN (1, 2) -- 只計算 Clustered 和 Non-Clustered 索引
96GROUP BY t.name
97HAVING COUNT(i.index_id) > 5 -- 假設超過 5 個索引的表值得檢查
98ORDER BY COUNT(i.index_id) DESC;
99
100-- ==============================================
101-- 📌 8. 檢查 SQL Server 是否有交易鎖
102-- ==============================================
103-- 這可以幫助你找出哪個交易正在封鎖其他交易,避免死鎖。
104SELECT
105 blocking_session_id AS BlockingSessionID, -- 鎖住其他交易的會話 ID
106 session_id AS BlockedSessionID, -- 被鎖住的交易會話 ID
107 wait_type,
108 wait_time AS WaitTime_MS -- 等待時間
109FROM sys.dm_exec_requests
110WHERE blocking_session_id <> 0
111ORDER BY wait_time DESC;
112
113-- ==============================================
114-- 📌 9. 找出 I/O 負擔最重的資料表
115-- ==============================================
116-- 這可以幫助你了解哪些表的 I/O 操作最多,找出可能影響效能的表。
117SELECT TOP 10
118 OBJECT_NAME(ps.object_id) AS TableName,
119 SUM(ps.leaf_insert_count + ps.leaf_delete_count + ps.leaf_update_count) AS TotalModifications
120FROM sys.dm_db_index_operational_stats(NULL, NULL, NULL, NULL) ps
121GROUP BY ps.object_id
122ORDER BY TotalModifications DESC;
123
124-- ==============================================
125-- 📌 10. 檢查 SQL Server 記憶體快取命中率(Buffer Pool Hit Ratio)
126-- ==============================================
127-- 這可以幫助你檢查 SQL Server 的記憶體使用是否有效率。
128SELECT
129 ROUND((1.0 - (a.cntr_value * 1.0 / b.cntr_value)) * 100, 2) AS BufferCacheHitRatio
130FROM sys.dm_os_performance_counters a
131JOIN sys.dm_os_performance_counters b
132 ON a.object_name = b.object_name
133WHERE a.counter_name = 'Buffer cache hit ratio base'
134 AND b.counter_name = 'Buffer cache hit ratio';
135