索引

来源:http://www.cnblogs.com/ciwen91/archive/2017/01/03/6244624.html
-Advertisement-
Play Games

SqlServer的性能問題大部分是因為缺少索引或索引不當導致的,因此熟悉掌握索引相關知識是精通SqlServer的第一步。我們可以從索引的數據結構瞭解索引的本質;掌握聚集索引和非聚集索引的區別有助於我們在不同場景下走出誤區、建立合適索引;在一些場景下你也有可能需要用到索引視圖 索引的數據結構 在S ...


      SqlServer的性能問題大部分是因為缺少索引或索引不當導致的,因此熟悉掌握索引相關知識是精通SqlServer的第一步。我們可以從索引的數據結構瞭解索引的本質;掌握聚集索引和非聚集索引的區別有助於我們在不同場景下走出誤區、建立合適索引;在一些場景下你也有可能需要用到索引視圖。

索引的數據結構

在SqlServer中,聚集索引和非聚集索引都是以B+樹存儲。一顆m階的B+樹滿足下列條件:

  • 樹中每個結點至多有m個孩子。除根結點和葉子結點外,其它每個結點至少有m/2個孩子。根結點至少有兩個孩子。
  • 所有葉子結點都位於同一層。
  • 有n顆子樹的結點中含有n個關鍵字,每個關鍵字不保存數據,只用來索引,所有數據都保存在葉子結點。葉子結點本身依關鍵字的大小順序鏈接。

  

二叉查找演算法效率很高,但由於樹的深度過大會導致頻繁的磁碟I/O,影響查詢效率。平衡多路查找樹(B樹)可以大大減少樹的深度,作為索引的數據結構非常適合。

聚集索引的葉子節點存的是數據。

 

非聚集索引的葉子節點存的是指向堆或聚集索引的指針.

 

 

聚集索引、非聚集索引

區別

  • 聚集索引存儲的記錄在物理上是連續的,非聚集索引對應的記錄在物理上並不連續。(非聚集索引的鍵值在物理上是連續的)
  • 聚集索引一張表只能有一個,非聚集索引有多個

索引列的選擇

  • 根據Where條件、Order條件選擇列
  • 優先選取選擇性大的列,過濾條件精確的列(“=”要優於”between”)

書簽查找

當使用非聚集索引查找時,如果查詢用到的列不包含在非聚集索引中時,就需要一次書簽查找來檢索其它欄位。書簽查找會產生更多的邏輯讀,當書簽查找次數過多(幾百或幾千),SqlServer會捨棄非聚集索引而使用全表掃描(索引失效),這會導致查詢效率非常低。

包含列

將不在非聚集索引中的列放到包含列中,可以避免書簽查找。相對於聚集索引,由於每頁的數據更多,查詢效率最高。

適用場景

  • 需要讀取大量數據時(統計):通常會使用聚集索引。如果查詢用到列總大小遠小於行大小,應選擇非聚集索引+包含列(連續讀的數據量小很多)。
  • 不需要讀取大量數據時(分頁查詢):優先使用聚集索引(索引過多會影響更新、刪除性能。)
  • 多視角都滿足使用聚集索引的場景時,基於數據量大的查詢建立聚集索引,其它的建立非聚集索引。

    註:多視角指的多個維度或方面去查看數據,它們的索引列不同

           數據量大小評估需要綜合參考查詢涉及的行數和列的大小   

索引視圖

  概念

      為視圖創建唯一聚集索引可以提高查詢性能,因為視圖在資料庫中的存儲方式與具有聚集索引的表的存儲方式相同。查詢優化器可以使用索引視圖加快查詢速度。優化器使用索引視圖是隱式的,並不需要在查詢中引用該視圖。

      創建唯一聚集索引後可以創建更多的非聚集索引。

適用場景

      需要創建索引的列分佈在多個表上。

限制

      視圖定義中不能包含統計函數(count、distinct、min、max),Outer連接、開窗函數、集合函數(union、except)等。

              

參考

B樹

http://www.cnblogs.com/tgycoder/p/5077017.html

http://www.cnblogs.com/zhijianliutang/archive/2012/02/03/2337340.html

書簽查找

http://www.cnblogs.com/lzrabbit/archive/2012/05/21/2499389.html

索引視圖

https://msdn.microsoft.com/zh-cn/library/ms191432.aspx


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

-Advertisement-
Play Games
更多相關文章
  • 禁用:.attr("disabled","disabled"); 啟用:.removeAttr("disabled"); ...
  • 一、AJAX示例1.1、優點1.2、缺點1.3、jQuery AJAX示例二、延遲對象(Deferred)2.1、回調函數2.2、deferred.done三、跨域3.1、什麼是跨域3.2、JSONP跨域3.3、jQuery使用JSONP跨域3.4、跨域資源共用(CORS)3.5、小結四、彈出層五、... ...
  • 一、前端MVC概要 1.1、庫與框架的區別 框架是一個軟體的半成品,在全局範圍內給了大的約束。庫是工具,在單點上給我們提供功能。框架是依賴庫的。AngularJS是框架而jQuery則是庫。 1.2、AMD與CMD 在傳統的非模塊化JavaScript開發中有許多問題:命名衝突、文件依賴、跨環境共用 ...
  • 查看npm的所有版本 運行命令: 命令運行後,會輸出到目前為止npm的所有版本。 將npm升級到某個版本。 升級前本機版本號是2.14.12,可通過npm -v查看。 命令運行,升級到3.1.0版: 升級完成後,查看一下本機npm的版本,就是升級後的版本。 參考: Updating npm ...
  • 01.01_電腦基礎知識(電腦概述)(瞭解) A:什麼是電腦?電腦在生活中的應用舉例 電腦(Computer)全稱:電子電腦,俗稱電腦。是一種能夠按照程式運行,自動、高速處理海量數據的現代化智能電子設備。由硬體和軟體所組成,沒有安裝任何軟體的電腦稱為裸機。常見的形式有台式電腦、筆記本 ...
  • 一、下載並安裝class-dump 下載class-dump-3.5.dmg 點擊下載 下載完成以後雙擊.dmg的文件,將裡面的class-dump拷貝到/usr/local/bin 設置許可權chmod 777 /usr/local/bin/class-dump 在控制台輸入class-dump,顯 ...
  • JDK安裝與配置 一、下載 JDK是ORACLE提供免費下載使用的,官網地址:https://www.oracle.com/index.html 一般選擇Java SE版本即可,企業版的選擇Java EE 下載的JDK版本(目前最新的是JDK8u112) JDK的開發包以及相關的文檔下載 勾選同意, ...
  • 轉載請註明出處:http://www.cnblogs.com/Joanna-Yan/p/6241354.html 首先看一張國內Top500 Android應用中它們用到的第三方推送以及所占數量: 現在總結下Android平臺下幾種推送方案的基本情況以及優缺點: 一、使用GCM(Google Clo ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...