索引優化(一)

說到優化大家可能首先想到就是索引,當然,索引是對數據庫表中的一列或者多列的值進行排序的一種結構,能夠快速訪問數據庫表中特定信息,索引分爲聚簇索引和非聚簇索引兩種,聚簇索引是按照數據存放的物理位置爲順序的,而非聚簇索引就不一樣了,聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索要快,根據數據庫的功能,可以在數據庫設計器中創建三種索引:唯一索引、主鍵索引和聚集索引。好了,對於索引我也是略知一二,這裏就不多說了,網上很多大神都有詳細介紹。

我們公司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 語句導致,只能再反映開發商了,等待大神指點該如何優化。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章