說到優化大家可能首先想到就是索引,當然,索引是對數據庫表中的一列或者多列的值進行排序的一種結構,能夠快速訪問數據庫表中特定信息,索引分爲聚簇索引和非聚簇索引兩種,聚簇索引是按照數據存放的物理位置爲順序的,而非聚簇索引就不一樣了,聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索要快,根據數據庫的功能,可以在數據庫設計器中創建三種索引:唯一索引、主鍵索引和聚集索引。好了,對於索引我也是略知一二,這裏就不多說了,網上很多大神都有詳細介紹。
我們公司ERP的某界面一直以來都有一個問題,就是某時間段響應特別慢,只要你查詢卡住的時候,基本就完了,就要關掉系統重新登錄,我們反映過開發商,他們一直也都沒有徹底處理完成,只能拖着,自己從網上找的死鎖檢測代碼新建了一個存儲過程,死鎖代碼是登記或者查詢時存儲過程賦值導致的,因爲能力有限,存儲過程沒辦法自己修改。
因爲該界面涉及到生產的實績登錄,一般擔當在輸入實績時都先查詢出數據再進行輸入保存,通過網上大神對優化的建議,我第一步先找出該表丟失的索引,代碼如下:
-----------返回丟失的索引信息
SELECT avg_total_user_cost * avg_user_impact * ( user_scans + user_seeks ) AS PossibleImprovement ,
last_user_seek ,
last_user_scan ,
[statement] AS [Object] ,
'CREATE INDEX [IDX_'
+ replace(reverse(substring(reverse(statement),1,charindex('[',reverse(statement))-1)),']','')
+'_'
+ CONVERT(VARCHAR(32), GS.group_handle)
+ ']' + ' ON '
+ [statement]
+ ' (' + ISNULL(equality_columns, '')
+ CASE WHEN equality_columns IS NOT NULL AND inequality_columns IS NOT NULL
THEN ','
ELSE ''
END
+ ISNULL(inequality_columns, '') + ')' + ISNULL(' INCLUDE ('
+ included_columns
+ ')', '') AS Create_Index_Syntax
FROM sys.dm_db_missing_index_groups AS G
INNER JOIN sys.dm_db_missing_index_group_stats AS GS ON G.index_group_handle = GS.group_handle
INNER JOIN sys.dm_db_missing_index_details AS D ON G.index_handle = D.index_handle
WHERE [statement]='[數據庫名].]dbo].[表名]' -------------該表就是位於ERP經常卡住的界面
ORDER BY PossibleImprovement DESC
鎖定PossibleImprovement 值最高的前兩列,複製 Create_Index_Syntax 列命令,執行。
運行創建索引命令後,觀察一段時間,查詢速度真的有明細提升,可能是死鎖時間過了才顯得快點,過不久後想看看新建的索引是否被有效使用,運行代碼如下:
---------查詢索引使用率
select distinct db_name(database_id) as N'數據庫名稱',
object_name(a.object_id) as N'表名',
b.name N'索引名稱',
user_seeks N'用戶索引查找次數',
user_scans N'用戶索引掃描次數',
last_user_seek N'最後查找時間',
last_user_scan N'最後掃描時間',
rows as N'表中的行數'
from sys.dm_db_index_usage_stats a join
sys.indexes b
on a.index_id = b.index_id
and a.object_id = b.object_id
join sysindexes c
on c.id = b.object_id
where database_id=db_id('DB名') ---改成要查看的數據庫
and object_name(a.object_id) not like 'sys%'
and object_name(a.object_id)='表名'
order by user_seeks,user_scans,object_name(a.object_id)
通過運行以上代碼發現用戶索引查找次數在迅速上漲,但還是偶爾會產生死鎖,現懷疑是該存儲過程裏的insert 語句導致,只能再反映開發商了,等待大神指點該如何優化。