SQL Server數(shù)據(jù)庫(kù)卡慢原因分析與解決方法資源被阻塞了和堵阻塞進(jìn)程
廣告:
1 查看Windows事件查看器和SQL Server錯(cuò)誤日志以獲取可能的系統(tǒng)級(jí)或數(shù)據(jù)庫(kù)級(jí)問(wèn)題提示。
2 如果懷疑是鎖競(jìng)爭(zhēng)問(wèn)題,可以查看sys.dm_tran_locks。
3 使用SQL Server Management Studio (SSMS) 連接到數(shù)據(jù)庫(kù)實(shí)例,檢查當(dāng)前活動(dòng)和最近執(zhí)行的查詢(xún)。
-- 查看等待的類(lèi)型 SELECT * FROM sys.dm_os_wait_stats ORDER BY wait_time_ms DESC; -- 查看當(dāng)前等待的請(qǐng)求 SELECT * FROM sys.dm_os_waiting_tasks; -- 查看鎖信息 SELECT * FROM sys.dm_tran_locks; -- 查詢(xún)IO和時(shí)間統(tǒng)計(jì) SET STATISTICS IO ON; SET STATISTICS TIME ON; GO -- 運(yùn)行你的查詢(xún) SELECT * FROM your_table; GO
SQL Server數(shù)據(jù)庫(kù)卡慢可能有以下幾個(gè)原因:
硬件問(wèn)題:包括磁盤(pán)故障、網(wǎng)絡(luò)問(wèn)題、內(nèi)存不足等,這些問(wèn)題會(huì)影響數(shù)據(jù)庫(kù)的讀寫(xiě)性能。(擴(kuò)大服務(wù)器的內(nèi)存,Windows 2000和SQL server 2000能支持4-8G的內(nèi)存。)
查詢(xún)問(wèn)題:復(fù)雜的查詢(xún)、缺少索引、查詢(xún)語(yǔ)句寫(xiě)得不好等都可能導(dǎo)致數(shù)據(jù)庫(kù)卡慢。
鎖問(wèn)題:當(dāng)多個(gè)用戶(hù)同時(shí)訪問(wèn)數(shù)據(jù)庫(kù)時(shí),可能會(huì)出現(xiàn)鎖爭(zhēng)用的情況,導(dǎo)致數(shù)據(jù)庫(kù)操作卡慢。
服務(wù)器負(fù)載過(guò)大:當(dāng)服務(wù)器上同時(shí)運(yùn)行多個(gè)應(yīng)用程序或者數(shù)據(jù)庫(kù),可能會(huì)導(dǎo)致服務(wù)器負(fù)載過(guò)大,從而影響數(shù)據(jù)庫(kù)性能。
數(shù)據(jù)庫(kù)設(shè)置不當(dāng):數(shù)據(jù)庫(kù)的配置參數(shù)沒(méi)有正確設(shè)置,例如緩沖區(qū)大小、最大并發(fā)連接數(shù)等,都可能導(dǎo)致數(shù)據(jù)庫(kù)卡慢。
數(shù)據(jù)庫(kù)日志文件過(guò)大:如果數(shù)據(jù)庫(kù)的日志文件過(guò)大,會(huì)導(dǎo)致寫(xiě)入操作變慢,從而影響數(shù)據(jù)庫(kù)的性能。
數(shù)據(jù)庫(kù)版本過(guò)低:如果使用的SQL Server版本過(guò)低,可能會(huì)存在一些性能問(wèn)題,建議升級(jí)到最新版本。
以上是一些可能導(dǎo)致SQL Server數(shù)據(jù)庫(kù)卡慢的原因,具體要根據(jù)實(shí)際情況來(lái)判斷和解決。
配置虛擬內(nèi)存:虛擬內(nèi)存大小應(yīng)基于計(jì)算機(jī)上并發(fā)運(yùn)行的服務(wù)進(jìn)行配置。運(yùn)行 Microsoft SQL Server? 2000 時(shí),可考慮將虛擬內(nèi)存大小設(shè)置為計(jì)算機(jī)中安裝的物理內(nèi)存的 1.5 倍。如果另外安裝了全文檢索功能,并打算運(yùn)行 Microsoft 搜索服務(wù)以便執(zhí)行全文索引和查詢(xún),可考慮:將虛擬內(nèi)存大小配置為至少是計(jì)算機(jī)中安裝的物理內(nèi)存的 3 倍。將 SQL Server max server memory 服務(wù)器配置選項(xiàng)配置為物理內(nèi)存的 1.5 倍(虛擬內(nèi)存大小設(shè)置的一半)。
sql server 如何查看卡頓的原因 sqlserver查詢(xún)突然很慢:
查詢(xún)速度慢的原因很多,常見(jiàn)如下幾種:
1、沒(méi)有索引或者沒(méi)有用到索引(這是查詢(xún)慢最常見(jiàn)的問(wèn)題,是程序設(shè)計(jì)的缺陷)
2、I/O吞吐量小,形成了瓶頸效應(yīng)。
3、沒(méi)有創(chuàng)建計(jì)算列導(dǎo)致查詢(xún)不優(yōu)化。
4、內(nèi)存不足
5、網(wǎng)絡(luò)速度慢
6、查詢(xún)出的數(shù)據(jù)量過(guò)大(可以采用多次查詢(xún),其他的方法降低數(shù)據(jù)量)
7、鎖或者死鎖(這也是查詢(xún)慢最常見(jiàn)的問(wèn)題,是程序設(shè)計(jì)的缺陷)
8、sp_lock,sp_who,活動(dòng)的用戶(hù)查看,原因是讀寫(xiě)競(jìng)爭(zhēng)資源。
9、返回了不必要的行和列
10、查詢(xún)語(yǔ)句不好,沒(méi)有優(yōu)化
SELECT TOP 10 qs.total_elapsed_time / 1000 AS [Total Elapsed Time (sec)], qs.execution_count, qs.total_logical_reads, qs.total_logical_writes, qs.total_physical_reads, qs.last_execution_time, qs.min_execution_time, qs.max_execution_time, qs.last_worker_time, qs.min_worker_time, qs.max_worker_time, SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS [Statement Text], qp.query_plan FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) AS qp ORDER BY qs.total_elapsed_time DESC;
1 使用動(dòng)態(tài)管理視圖sys.dm_exec_query_stats
我們通過(guò)查詢(xún)sys.dm_exec_query_stats視圖來(lái)獲取耗時(shí)最長(zhǎng)的SQL語(yǔ)句的相關(guān)信息,包括CPU時(shí)間、執(zhí)行時(shí)間、邏輯讀取次數(shù)、物理讀取次數(shù)、邏輯寫(xiě)入次數(shù)、執(zhí)行次數(shù)和SQL語(yǔ)句內(nèi)容。
SELECT TOP 10 total_worker_time/1000 AS total_cpu_time_sec, total_elapsed_time/1000 AS total_duration_sec, total_logical_reads, total_physical_reads, total_logical_writes, execution_count, SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st ORDER BY total_duration_sec DESC;
3 使用動(dòng)態(tài)管理視圖sys.dm_exec_requests
我們查詢(xún)sys.dm_exec_requests視圖來(lái)獲取當(dāng)前執(zhí)行的查詢(xún)請(qǐng)求的信息,包括會(huì)話(huà)ID、開(kāi)始時(shí)間、總執(zhí)行時(shí)間、狀態(tài)和SQL語(yǔ)句內(nèi)容。我們可以根據(jù)需要自定義篩選條件,比如只顯示執(zhí)行時(shí)間超過(guò)10秒的查詢(xún)。
SELECT r.session_id, r.start_time, r.total_elapsed_time/1000 AS total_duration_sec, r.status, t.text AS sql_text FROM sys.dm_exec_requests AS r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t WHERE r.total_elapsed_time > 10000 -- 只顯示執(zhí)行時(shí)間超過(guò)10秒的查詢(xún) ORDER BY r.total_elapsed_time DESC;
結(jié)果:
stateDiagram
[*] --> 查詢(xún)sys.dm_exec_query_stats
--> 分析耗時(shí)最長(zhǎng)的SQL
--> 顯示結(jié)果
--> [*]
查詢(xún)哪些資源被阻塞了 和 堵進(jìn)程:
1)、查詢(xún)哪些資源被阻塞了(spid為阻塞進(jìn)程id)
select * from sys.sysprocesses where status = 'suspended'
2)、查詢(xún)堵進(jìn)程(BlkBy阻塞進(jìn)程id)
sp_who2 active查看堵的進(jìn)程
查詢(xún)spid/BlkBy 阻塞進(jìn)程語(yǔ)句
dbcc inputbuffer(spid)
查看指定數(shù)據(jù)庫(kù)的鎖id進(jìn)行
dbcc opentran(tempdb)
殺進(jìn)程
kill spid with statusonly
查詢(xún)sql語(yǔ)句執(zhí)行時(shí)間和sql語(yǔ)句性能
通過(guò)設(shè)置STATISTICS我們可以查看執(zhí)行SQL時(shí)的系統(tǒng)情況。選項(xiàng)有PROFILE,IO ,TIME。介紹如下:
SET STATISTICS PROFILE ON --顯示分析、編譯和執(zhí)行查詢(xún)所需的時(shí)間(以毫秒為單位)。 SET STATISTICS IO ON --報(bào)告與語(yǔ)句內(nèi)引用的每個(gè)表的掃描數(shù)、邏輯讀取數(shù)(在高速緩存中訪問(wèn)的頁(yè)數(shù))和物理讀取數(shù)(訪問(wèn)磁盤(pán)的次數(shù))有關(guān)的信息。 SET STATISTICS TIME ON --顯示每個(gè)查詢(xún)執(zhí)行后的結(jié)果集,代表查詢(xún)執(zhí)行的配置文件。 SELECT [字段] FROM [表名] --SQL語(yǔ)句 SET STATISTICS PROFILE OFF SET STATISTICS IO OFF SET STATISTICS TIME OFF
其他:https://www.cnblogs.com/Fooo/p/10621595.html
廣告:
- 安裝sql server 2016提示PerfLib 2.0 計(jì)數(shù)器 removal失敗,退出代碼為-2147024894
- Sqlcmd: 錯(cuò)誤: Microsoft SQL Server Native Client 11.0 : SQL Server 網(wǎng)絡(luò)接口: 獲取
- Service Principal Name (SPN) for the SQL Server service. Error: 0x54bCo代理服務(wù)a
- 無(wú)法連接到 microsoft sql server 2022 express localdbWindows API 調(diào)用 WaitForMult