Expert 診斷優化系列-------------針對重點語句調索引

来源:http://www.cnblogs.com/double-K/archive/2016/06/20/5601952.html
-Advertisement-
Play Games

上一篇我們說了索引的重要性,一個索引不僅能讓一條語句起飛,也能大量減少系統對CPU、記憶體、磁碟的依賴。我想上一篇中的例子可以說明瞭。給出上一篇和目錄文鏈接: SQL SERVER全面優化 索引有多重要? SQL SERVER全面優化 Expert for SQL Server 診斷系列 書接前文,我 ...


  上一篇我們說了索引的重要性,一個索引不僅能讓一條語句起飛,也能大量減少系統對CPU、記憶體、磁碟的依賴。我想上一篇中的例子可以說明瞭。給出上一篇和目錄文鏈接:

SQL SERVER全面優化-------索引有多重要?

SQL SERVER全面優化-------Expert for SQL Server 診斷系列

 

  

  書接前文,我們知道了索引的重要,也知道了索引怎麼加,那麼我們應該往那些語句加?語句一條一條漫無目的的優化麽?我怎麼找出系統的問題語句?怎麼樣的一個優先順序? 

  很多對資料庫瞭解不是很多的人,也許一片茫然!還真不知道,那麼多存儲過程,那麼多程式語句,我總不能都看一遍吧?

  對資料庫有些瞭解的人可能會知道用profiler,系統視圖等,這是個不錯的方式!

  但是個人覺得這些不夠直觀,還是不能抓住重點,如果業務多變也會消耗大量時間。

 

  

  所謂工欲善其事,必先利其器!那麼本篇我利用 Expert for sqlserver 講述怎樣抓住重點語句來優化你的系統!

  

  首先還是上座駕:

  

  

 

  

--------------博客地址---------------------------------------------------------------------------------------

Expert 診斷優化系列 http://www.cnblogs.com/double-K/

 

 

廢話不多說,直接開整-----------------------------------------------------------------------------------------

  本文選用的例子為一個伺服器高配,跑了一個小業務,硬體資源充足,但是語句執行很慢!(32CPU,32G記憶體跑了個只有10G 數據文件的庫)

  下麵簡單的一個展示:

  

  

  

 

 

   性能計數器指標請參見前文,本例中磁碟隊列全天小於2,記憶體充足,CPU使用60%略有壓力(主要是缺失索引導致)

  下麵看一下總體的語句執行情況:

  

  

  語句可以看出超過1-3秒的語句有近8W次,3-5秒 5-10秒均接近2W,10秒以上的也有1W+,可見充足的資源配置下系統語句仍然很慢!

  • 語句優先順序 

  前面很多文章中都已經介紹過了,優化一定要針對重點語句,優化10條執行頻率低的語句效果不及半條高頻語句。那麼找到系統中的高頻語句就是優化的重中之重!

   直接上圖!

  

 

    

   圖中按照語句的執行次數排序,這也強烈符合我的優化套路,可以看出系統中執行頻率最高的語句,平均執行時間都在3秒左右甚至更長,邏輯讀都很高,但是影響的行數很少。這就是典型的缺少索引的情況!

 

   高能提示: 看到這樣的一個統計界面,你是否知道如何下手了?怎麼樣的一個優先順序? 沒錯次數從高往低,來吧!開整!

  根據個人習慣也可以按照邏輯讀/寫,cpu消耗等排出優先順序。

 

  • 針對語句調索引

  拿到了重點語句,那麼我們就從重點語句下手詳細分析一下。上一篇已經介紹了簡單粗暴的添加索引,簡單粗暴大概能應對80%的場景了,但是也要有一些註意!下麵新手看官們要認真體會了!

  

 

   

 

  我們看到了缺失索引的提示,這就和前文介紹執行計劃的大綠字是一個個東西。這裡不再詳細介紹。那麼拿到這個索引缺失我們就直接創建麽?前文中告訴你們的答案是直接創建!新的文章中當然要學點新東西!創建前請先核實一下索引!何為核實一下呢? 首先我們看一下執行計劃!由於執行計劃比較大隻貼出消主要耗部分~

  

 

  

 

 

  執行計劃看出,缺失語句主要消耗在兩部分,都是這個customer表,index scan 說明有相關欄位的索引,但是不是最優的!那麼提示的索引算是正確(欄位驗證這裡就忽略了),那麼現在可以創建了? 還需要再核查幾個地方!

 

要創建索引的表有多少數據?

 

  

  

  表上有150W+數據 確實適合創建索引!

是否有這個類似索引?

  那麼表上現在有什麼索引呢?是新創建還是修改原有索引呢?

   

 

  一堆索引...一屏沒截下....但是你會發現一個覆蓋索引都沒有?也沒有針對這條語句的最優索引! 也許這個系統的維護人員知道索引的重要性,但是不知道怎麼創建一個最優的索引,HOHO 讓他看看上篇文章就好了!

  那麼這回可以直接創建提示索引就OK了吧? 答案是大寫的“NO”! 還需要你的細心!

  

創建的索引是否能使用? 

  前面 SQL SERVER全面優化-------寫出好語句是習慣 已經提到過,where條件的欄位中不能使用函數,不能有隱式轉換,也不能用 like “%XXXX%” 這樣就不能用索引查找seek了! 我們要看一下是否是提示的索引不能使用!

   

  如果你仔細的看了前文,你會反問:不能用不是就不提示了麽? 哈哈,真是認真,確實是這樣!這裡只是個需要細心的溫馨提示!

  但是每一篇文章重要更深入一下麽,對吧! 前面看到原計劃中customer表使用了index scan ,細心的看官們會發現還有個key lookup,index scan + key lookup 你不覺得奇怪麽?

  

 

  我們看一下具體的語句:語句太長,只貼where 部分了  

 

 

  我們可以看到customername 確實使用了 like ”%%“ 無法使用seek,但是companyid 和createdate 可以使用索引呀~所以我們再看一下 提示出的索引: 

CREATE NONCLUSTERED INDEX [EFS_IX_Customer_b87864c46d0f4d3ca4ad4e4db8232063]
ON [dbo].[Customer] ([CompanyId],[CreateDate])
INCLUDE ([Id],[CustomerId],[CustomerName],[Project],[IndustryOneId],[IndustryTwoId],[SourceId],[StateId],[TypeId],[ProtectId],[Audit],[delFlag])
GO

  還是比較智能吧~這回你可以創建這個索引了!

  

  

  還得啰嗦一句:覆蓋索引雖好,但創建要註意,不要把過多的列放在索引里。個人建議索引的篩選列+包含列不要超過表欄位的1/3 ,純屬個人建議不是那麼絕對。

   

  文章至此已經在上一篇的基礎上又做了一些細節的說明。看官們可以按照優先順序動手了。

 

  • 大面積創建缺失索引

  如果系統完全沒有過保養,表上基本沒有創建過什麼索引,那麼上面的創建方式一樣很傷體力,這裡還有一種簡單粗暴的方式for you!

  

 

 

  大批量創建索引切記不要看到就創建,一定是影響、開銷、次數都很高的,並且要優化合併生成的腳本,也就是上一篇提到的精簡索引!

   

  • 根據執行計劃創建

  這種方式和根據語句創建有異曲同工之妙,但不同的是一般的收集工具只收集1秒以上的語句。預設超過1秒才算慢,但是系統中有些語句執行不到一秒,但非常高頻,這也是需要關註的一大類! 限於篇幅這裡就不展開說了!

  

 

--------------博客地址---------------------------------------------------------------------------------------

Expert 診斷優化系列 http://www.cnblogs.com/double-K/

 

 

-----------------------------------------------------------------------------------------------------

 

  總結 : 往往一個系統的整體緩慢都是因為索引問題導致的,優化索引是對你系統最簡單的保養!

      不要小看一條語句的威力,一條語句足可以讓你的系統徹底無法工作!

     相反優化一條重要的高頻語句就可以讓你的系統變的流暢!

     

     優化索引要有自己的方法,不能逮到一條做一條,效率又差又可能抓不住重點。

     每個人優化都有自己的一套方法,只有是夠系統,夠全面就可以。本文只是簡單介紹自己的優化方式,不喜勿噴~

 

 Expert工具下載鏈接: http://www.grqsh.com/product_Expert.html

相關文章鏈接 : 

SQL SERVER全面優化-------索引有多重要?

SQL SERVER全面優化-------寫出好語句是習慣

Expert 診斷優化系列------------------語句調優三板斧

 ----------------------------------------------------------------------------------------------------

註:此文章為原創,歡迎轉載,請在文章頁面明顯位置給出此文鏈接!
若您覺得這篇文章還不錯請點擊下右下角的推薦,非常感謝!

  引用高大俠的一句話 :“拒絕SQL Server背鍋,從我做起!”

為了方便閱讀給出系列文章的導讀鏈接:

SQL SERVER全面優化-------Expert for SQL Server 診斷系列

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • synchronized 是 java 多線程編程中用於使線程之間的操作串列化的關鍵字。這種措施類似於資料庫中使用排他鎖實現併發控制,但是有所不同的是,資料庫中是對數據對象加鎖,而 java 則是對將要執行的代碼加鎖。 在 java 中使用 synchronized 關鍵字時需要註意以下幾點: 1. ...
  • 1.啟動zookeeper集群 對於hadoop,使用Zookeeper的事件處理確保整個集群只有一個活躍的NameNode,存儲配置信息,對於HBase,使用Zookeeper的事件處理確保整個集群只有一個HMaster,察覺HRegionServer的聯機和宕機,存儲訪問控制列表等 啟動命令:c ...
  • 用戶反映記賬操作時,提示ora-25153:臨時表空間為空 1、先查詢表空間情況:select * from dba_tablespaces where contents='TEMPORARY';查詢返回兩條記錄,說明存在兩個臨時表空間,如下: 2、再查看視圖dba_temp_files和v$tem ...
  • 如圖 我使用的是sqlserver2012登錄的,select @@version 查詢出來的卻是2008 ,而且附加不了2012的資料庫。 在網上搜到解決方法:1確認是否安裝了2012(廢話沒安裝是不能啟動的),2確認2012的服務有沒有啟動 3.選擇2012的伺服器: 這種情況主要發生在多資料庫 ...
  • 如何正確地建立SCOTT/TIGER演示模式 執行腳本 (1)cd [ORACLE_HOME]/sqlplus/demo。 (2)以任意用戶身份連接後運行demobld.sql。 註:關於腳本文件的位置和名稱,不同的版本有所不同。 如我的Oracle版本是10G,並運行在Windows操作系統模式下 ...
  • 在一個項目中遇到的問題:系統日誌過大,後來用delete語句刪除了(相當的慢),結果資料庫日誌又變成很大了(差不多10G),所以又得把資料庫日誌刪除。 方法: --備份系統中的部份日誌--SELECT * INTO #keep FROM CcsSystemLog WHERE logTime > '2 ...
  • 兩表聯合後,需要添加多個查詢條件的解決方案 一、 這是我第一次在項目組做融資租賃時遇到的問題,代碼如下: public ComposedBean OverdueReminder(Map param) throws CommonException{ ComposedBean composedBean ...
  • 這一篇博客主要講鍵的創建,約束的創建。修改對象和刪除對象。 主鍵:主鍵是每行的唯一標識符,必須包含唯一值(因此不能為NULL)。由於主鍵在關係中資料庫的重要性,因此它是所有鍵和約束中最重要的。一個表最多可以有一個主鍵。很少不需要主鍵的表。主鍵聲明具有唯一性。常用有identity自動增長值和GUID ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...