SQL SERVER數(shù)據(jù)庫(kù)重建索引的方法
一.查詢(xún)思路
1.想要判斷數(shù)據(jù)庫(kù)查詢(xún)緩慢的問(wèn)題,可以使用如下語(yǔ)句,可以列出查詢(xún)語(yǔ)句的平均時(shí)間,總時(shí)間,所用的CPU時(shí)間等信息
SELECT creation_time N'語(yǔ)句編譯時(shí)間' ,last_execution_time N'上次執(zhí)行時(shí)間' ,total_physical_reads N'物理讀取總次數(shù)' ,total_logical_reads/execution_count N'每次邏輯讀次數(shù)' ,total_logical_reads N'邏輯讀取總次數(shù)' ,total_logical_writes N'邏輯寫(xiě)入總次數(shù)' , execution_count N'執(zhí)行次數(shù)' , total_worker_time/1000 N'所用的CPU總時(shí)間ms' , total_elapsed_time/1000 N'總花費(fèi)時(shí)間ms' , (total_elapsed_time / execution_count)/1000 N'平均時(shí)間ms' ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offsetEND - qs.statement_start_offset)/2) + 1) N'執(zhí)行語(yǔ)句' FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st where SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offsetEND - qs.statement_start_offset)/2) + 1) not like'%fetch%' ORDER BY total_elapsed_time / execution_count DESC;
2.列出數(shù)據(jù)庫(kù)每個(gè)表的數(shù)據(jù)量,并且需要運(yùn)維人員對(duì)業(yè)務(wù)足夠了解,知道大概哪些表是查詢(xún)量最多的,可以查看“排在前面的表的磁盤(pán)使用情況”:
3.查看表碎片的情況,可以使用命令
DBCC SHOWCONTIG
可以看到該表掃描密度只有33.52%(最佳狀態(tài)是100%,每個(gè)表頁(yè)都寫(xiě)滿(mǎn)數(shù)據(jù)),遠(yuǎn)遠(yuǎn)低于最佳計(jì)數(shù),也就是說(shuō)這個(gè)表的利用率很低,本來(lái)掃描一頁(yè) 就能出結(jié)果,現(xiàn)在可能需要掃描三頁(yè),增加了查詢(xún)時(shí)間;而邏輯碎片和區(qū)碎片都很多(一般認(rèn)為超過(guò)30%就需要優(yōu)化了),也就是說(shuō)同樣一頁(yè),數(shù)據(jù)很少而碎片很 多,占用了過(guò)多的數(shù)據(jù)庫(kù)資源。
4.根據(jù)你對(duì)業(yè)務(wù)的了解,找出查詢(xún)最多的表,對(duì)比他的數(shù)據(jù),查詢(xún)時(shí)間,和碎片程度可以判斷出該表是否需要整理碎片,重建索引,以提高數(shù)據(jù)庫(kù)性能。
重建索引的語(yǔ)句為:
use[數(shù)據(jù)庫(kù)名]
ALTER INDEX ALL ON [表名稱(chēng)] REBUILD;
重建后,同樣的一張表NWME_Company_Index,再次查詢(xún)表碎片情況的結(jié)果如下:
可以看到密度已經(jīng)變?yōu)?6.9%,而邏輯碎片幾乎沒(méi)有了。
5.現(xiàn)在可以看一下整理碎片后,是否真的對(duì)查詢(xún)性能優(yōu)化了,再次運(yùn)行第一點(diǎn)列出的命令查看可以發(fā)現(xiàn),大部分查詢(xún)語(yǔ)句所用的平均時(shí)間都下降了接近一半:
現(xiàn)在可以到前臺(tái)實(shí)際體驗(yàn)優(yōu)化后的效果了。
相關(guān)文章
SQL?Server?2012?搭建數(shù)據(jù)庫(kù)AlwaysOn(數(shù)據(jù)庫(kù)高可用集群)
這篇文章主要介紹了SQL?Server?2012?搭建數(shù)據(jù)庫(kù)AlwaysOn(數(shù)據(jù)庫(kù)高可用集群),需要的朋友可以參考下2023-05-05SQL語(yǔ)句分組獲取記錄的第一條數(shù)據(jù)的方法
SQL語(yǔ)句分組獲取記錄的第一條數(shù)據(jù)的方法,使用Northwind 數(shù)據(jù)庫(kù)為例子2012-07-07解析SQL?Server?CDC配合Kafka?Connect監(jiān)聽(tīng)數(shù)據(jù)變化的問(wèn)題
這篇文章主要介紹了SQL?Server?CDC配合Kafka?Connect監(jiān)聽(tīng)數(shù)據(jù)變化,除了數(shù)據(jù)庫(kù)開(kāi)啟CDC支持以外,主要還是要將變更的數(shù)據(jù)通過(guò)Kafka?Connect傳輸數(shù)據(jù),Debezium是目前官方推薦的連接器,本文給大家分享實(shí)現(xiàn)步驟,感興趣的朋友跟隨小編一起看看吧2021-12-12SQL Server中查詢(xún)結(jié)果超出了查詢(xún)時(shí)間范圍解決方法
在本篇文章里小編給大家整理的是關(guān)于SQL Server中查詢(xún)結(jié)果超出了查詢(xún)時(shí)間范圍解決方法,有需要的朋友們學(xué)習(xí)下。2019-11-11sqlserver下將數(shù)據(jù)庫(kù)記錄的列記錄轉(zhuǎn)換成行記錄的方法
sqlserver下將數(shù)據(jù)庫(kù)記錄的列記錄轉(zhuǎn)換成行記錄的方法分享,需要的朋友可以參考下。2011-07-07SQL Server 作業(yè)的備份(備份作業(yè)非備份數(shù)據(jù)庫(kù))
我的方法是把作業(yè)導(dǎo)出成文件備份起來(lái),因?yàn)楫?dāng)你服務(wù)器維護(hù)的多了的時(shí)候很多你的作業(yè) 就很成問(wèn)題,很麻煩2012-06-06SQLServer2014故障轉(zhuǎn)移群集的部署的圖文教程
本文主要介紹了SQLServer2014故障轉(zhuǎn)移群集的部署的圖文教程,文中通過(guò)圖文介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01sql update 觸發(fā)器 可獲得被update的行的信息
sql update 觸發(fā)器 可獲得被update的行的信息,需要的朋友可以參考下。2010-06-06sqlserver自動(dòng)增長(zhǎng)列引起的問(wèn)題解決方法
僅當(dāng)使用了列列表并且 IDENTITY_INSERT 為 ON 時(shí),才能為表'*'中的標(biāo)識(shí)列指定顯式值。2011-10-10