SQL SERVER執行計劃和索引優化基礎

来源:http://www.cnblogs.com/elvis-cnblogs/archive/2017/07/02/7106575.html
-Advertisement-
Play Games

一、如何打開執行計劃? 在Microsoft SQL Server Management Studio中打開“包括實際的執行計劃”(快捷鍵:Ctrl+M),執行SQL語句就可以看到實際的執行計劃(圖文格式,非常直觀),這無疑是最友好的查閱方式。 二、如何看懂實際執行計劃? 執行複雜的腳本之後,看到的 ...


一、如何打開執行計劃?

在Microsoft SQL Server Management Studio中打開“包括實際的執行計劃”(快捷鍵:Ctrl+M),執行SQL語句就可以看到實際的執行計劃(圖文格式,非常直觀),這無疑是最友好的查閱方式。

 

 

二、如何看懂實際執行計劃?

執行複雜的腳本之後,看到的執行計劃,很多人直接懵圈了,這些圖文到底是什麼含義呢,又該如何優化呢?

下麵將列舉常見的執行計劃操作:

Table Scan(全表掃描):如果你的表數據量非常小,表掃描是可以的,並且可能性能會比其他掃描方式好一些;如果是一張大表,這時你必須要優化索引了。大數據量時,全表掃描,性能消耗是非常明顯的。

 

Clustered Index Scan(聚集索引掃描):一般來講,此時也應該優化查詢語句和索引。出現聚集索引掃描,可能因為返回數據的行或列過多、或者沒有明確的WHERE條件觸發索引。此類掃描,應當考慮創建合適的索引、增加更加嚴格的返回列限定、縮小查詢的數據範圍以控制返回行數。

 

Index Seek(索引查找):此時性能是比較好的,表示使用了非聚集索引查找。

 

Clustered Index Seek(聚集索引查找):使用聚集索引(主鍵)查找,實際上這是SQL Server能做的最快的索引查找類型。

 

Bookmark Lookup(書簽查找):也是應當考慮優化的。在SELECT、JOIN、WHERE的欄位中都無法使用非聚集索引來滿足查找,查詢優化器不得不使用額外的聚集索引查找滿足查詢需求的欄位此時可能會引起書簽查找,不過查詢優化器可能也會使用Clustered Index Scan來替代書簽查找。還有一個可能引起書簽查找的原因是SELECT * FROM …,所以任何情況下使用SELECT * 都是不建議的。

 

Stream Aggregate(流聚合):使用了SQLSERVER的聚合函數時,會引起流聚合操作。比如:COUNT,MAX,MIN,AVG,DISTINCT,SUM等。

 

Compute Scalar(計算標量):使用COUNT計數時,會引起該操作;

 

Sort(排序):當使用了無索引的欄位排序時,可能會引起Sort操作;此時應該考慮是否需要該排序操作,或採用其他創建索引的欄位排序。如確實無法改變,則建議在排序欄位添加索引。

 

三、常見的索引優化規則

1,所有的索引優化都是取決於數據量大小,數據量極小時,可不考慮創建索引,創建了索引反而引起性能下降;

2,頻繁查詢、排序或者使用的條件欄位,建議使用索引優化;如:存在自增主鍵時,如果使用創建時間排序,儘量優化為使用主鍵排序;

3,WHERE條件中的表達式儘量放在操作符之後。常見的條件操作符有:=、>、<、!=、BETWEEN AND 等;

舉例:DATEPART(YEAR,CreateTime)>=2017 應該優化為:CreateTime>’2017-01-01 00:00:00’;LEN(ParamValue)=0 應該優化為:0=LEN(ParamValue);

4,存在的值重覆性較高的欄位,不建議創建索引,如:狀態標識列;

5,經常組合使用的多個條件欄位,應該創建複合索引;

6,減少LIKE的使用,LIKE在使用通配符開頭(如:LIKE ‘%A%’)不會使用索引查詢;

7,大欄位禁止創建索引;

8,不能濫用索引,必鬚根據實際需要是創建和維護。索引會引起磁碟和數據維護的開銷,要知道,伺服器的硬碟是非常可貴的。 

 

附:好玩的系統查詢腳本

1,查詢引用了某個字元的資料庫對象,適用於查找使用了某個欄位的存儲過程、視圖等;

SELECT  so.name, sc.text FROM   dbo.syscomments sc , dbo.sysobjects so

WHERE   sc.id = so.id AND sc.text LIKE '%PlatValue%'

--AND so.xtype = 'p' --xtype表示對象類型,p為存儲過程

ORDERBY name

2,查詢某個表的表結構

SELECT  sc.name, st.name AS [DataType], sc.prec

FROM    syscolumns sc

INNER JOIN systypes st ON st.xusertype = sc.xusertype

WHERE   sc.id = OBJECT_ID('PlatParam')

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 原作者,介紹Kotlin中密封類。這些新概念讓您更接近函數式編程成為可能。 ...
  • 把我認為最好的知識,拿來與他人分享,是這一生快事之一! React Native 項目常用第三方組件彙總: react-native-animatable 動畫 react-native-carousel 輪播 react-native-countdown 倒計時 react-native-devi ...
  • 一、GCD基本概念 GCD 全稱Grand Central Dispatch(大中樞隊列調度),是一套低層API,提供了⼀種新的方法來進⾏併發程式編寫。從基本功能上講,GCD有點像NSOperationQueue,他們都允許程式將任務切分為多個單一任務,然後提交⾄⼯作隊列來併發的或者串⾏的執行。GC ...
  • RocksDB作為一個開源的存儲引擎支持事務的ACID特性,而要支持ACID中的I(Isolation),併發控制這塊是少不了的,本文主要討論RocksDB的鎖機制實現,細節會涉及到源碼分析,希望通過本文讀者可以深入瞭解RocksDB併發控制原理。文章主要從以下4方面展開,首先會介紹RocksDB鎖 ...
  • 準備工作 繼續連接到mongo 查看資料庫和集合 創建簡單索引 數據準備,在CMD命令視窗中輸入如下初始化腳本: 1、先檢查一下查詢性能 執行如下腳本:var start=new Date()db.books.find({number:20540})var end=new Date()end - s ...
  • 背景 最近我們遷移了一批伺服器,因我們在azure portal 上新開的VM暫時預設只有英文系統,所以我們在開設好的資料庫伺服器的時候,都會重置資料庫字元排序成中文,避免出現中文亂碼問題,重置參考路徑。但最近有個項目反饋,遷移後出現轉換datatime類型時報錯。 系統環境 Microsoft S ...
  • 本文出處:http://www.cnblogs.com/wy123/p/7106861.html (保留出處並非什麼原創作品權利,本人拙作還遠遠達不到,僅僅是為了鏈接到原文,因為後續對可能存在的一些錯誤進行修正或補充,無他) 最近在SQL Server中多次遇到開發人員提交過來的有性能問題的SQL, ...
  • JDBCJava DataBase Connectivity,java資料庫連接,是一種用於執行SQL語句的Java API。JDBC是Java訪問資料庫的標準規範,可以為不同的關係型資料庫提供統一訪問,它由一組用Java語言編寫的介面和類組成。 驅動JDBC需要連接驅動,驅動是兩個設備要進行通信, ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...