SQLServer之索引簡介

来源:https://www.cnblogs.com/vuenote/archive/2018/09/11/9627768.html
-Advertisement-
Play Games

索引設計基礎知識 索引是與表或視圖關聯的磁碟上結構,可以加快從表或視圖中檢索行的速度。 索引包含由表或視圖中的一列或多列生成的鍵。 這些鍵存儲在一個結構(B 樹)中,使 SQL Server 可以快速高效地找到與鍵值關聯的行。 為資料庫及其工作負荷選擇正確的索引是一項需要在查詢速度與更新所需開銷之間 ...


索引設計基礎知識

       索引是與表或視圖關聯的磁碟上結構,可以加快從表或視圖中檢索行的速度。 索引包含由表或視圖中的一列或多列生成的鍵。 這些鍵存儲在一個結構(B 樹)中,使 SQL Server 可以快速高效地找到與鍵值關聯的行。

       為資料庫及其工作負荷選擇正確的索引是一項需要在查詢速度與更新所需開銷之間取得平衡的複雜任務。 如果索引較窄,或者說索引關鍵字中只有很少的幾列,則需要的磁碟空間和維護開銷都較少。 而另一方面,寬索引可覆蓋更多的查詢。 您可能需要試驗若幹不同的設計,才能找到最有效的索引。 可以添加、修改和刪除索引而不影響資料庫架構或應用程式設計。 因此,應試驗多個不同的索引而無需猶豫。

       SQL Server 中的查詢優化器可在大多數情況下可靠地選擇最高效的索引。 總體索引設計策略應為查詢優化器提供可供選擇的多個索引,並依賴查詢優化器做出正確的決定。 這在多種情況下可減少分析時間並獲得良好的性能。 若要查看查詢優化器對特定查詢使用的索引,請在 SQL Server Management Studio 中的“查詢”菜單上選擇“包括實際的執行計劃”。

        不要總是將索引的使用等同於良好的性能,或者將良好的性能等同於索引的高效使用。 如果只要使用索引就能獲得最佳性能,那查詢優化器的工作就簡單了。 但事實上,不正確的索引選擇並不能獲得最佳性能。 因此,查詢優化器的任務是只在索引或索引組合能提高性能時才選擇它,而在索引檢索有礙性能時則避免使用它。

索引分類規則 

  • 聚集還是非聚集。
  • 唯一還是非唯一。
  • 單列還是多列。
  • 索引中的列是升序排序還是降序排序。
  • 非聚集索引是全表還是經過篩選。

索引簡介

聚集索引

聚簇索引是一種對磁碟上實際數據重新組織以按指定的一個或多個列的值排序。

聚集索引基於數據行的鍵值在表內排序和存儲這些數據行,在聚集索引中,表中各行的物理順序與鍵值的邏輯(索引)順序相同。

每個表只能有一個聚集索引,因為數據行本身只能按一個順序存儲。

註意事項

一般情況下,定義聚集索引鍵時使用的列越少越好。

適用情況:

  • 唯一或包含許多不重覆的值。
  • 按順序被訪問。
  • 定義為 IDENTITY。
  • 經常用於對錶中檢索到的數據進行排序。

不適用情況:

  • 頻繁更改的列

    這將導致整行移動,因為資料庫引擎必須按物理順序保留行中的數據值。 這一點要特別註意,因為在大容量事務處理系統中數據通常是可變的。

  • 寬鍵

    寬鍵是若幹列或若幹大型列的組合。 所有非聚集索引將聚集索引中的鍵值用作查找鍵。 為同一表定義的任何非聚集索引都將增大許多,這是因為非聚集索引項包含聚集鍵,同時也包含為此非聚集索引定義的鍵列。

非聚集索引

索引理解為一種特殊的目錄,目錄純粹是目錄,正文純粹是正文的排序方式稱為“非聚集索引”。

非聚集索引包含索引鍵值和指向表數據存儲位置的行定位器。

可以對錶或索引視圖創建多個非聚集索引,一個表如果沒有聚簇索引時,可有250個非聚簇索引。

通常,設計非聚集索引是為改善經常使用的、沒有建立聚集索引的查詢的性能。

與使用書中索引的方式相似,查詢優化器在搜索數據值時,先搜索非聚集索引以找到數據值在表中的位置,然後直接從該位置檢索數據。 這使非聚集索引成為完全匹配查詢的最佳選擇,因為索引包含說明查詢所搜索的數據值在表中的精確位置的項。

每個非聚簇索引提供訪問數據的不同排序順序。

註意事項

適用於:

  • 某列常用於集合函數(如Sum,....)。
  • 覆蓋查詢。
  • 大量非重覆值,如姓氏和名字的組合(前提是聚集索引被用於其他列)。
  • 查尋出的數據不超過表中數據量的20%。

唯一索引

唯一索引能夠保證索引鍵中不包含重覆的值,從而使表中的每一行從某種方式上具有唯一性。

只有當唯一性是數據本身的特征時,指定唯一索引才有意義。

使用多列唯一索引,索引能夠保證索引鍵中值的每個組合都是唯一的。

聚集索引和非聚集索引都可以是唯一的。 只要列中的數據是唯一的,就可以為同一個表創建一個唯一聚集索引和多個唯一非聚集索引。

註意事項

優點:

  • 能夠確保定義的列的數據完整性。
  • 提供了對查詢優化器有用的附加信息。

主鍵索引

主鍵是一個約束(constraint),它依附在一個索引上,這個索引可以是聚集索引,也可以是非聚集索引。

在資料庫關係圖中為表定義一個主鍵將自動創建主鍵索引,只能說明它上面有個索引,但不一定就是聚集索引。

主鍵具有唯一性,而只有唯一性索引才具有唯一性,主鍵索引要求主鍵中的每個值是唯一的。

當在查詢中使用主鍵索引時,它還允許快速訪問數據。

主鍵索引是唯一索引的特殊類型。

主鍵是索引,但索引不一定是主鍵。

篩選索引

篩選索引是一種經過優化的非聚集索引,尤其適用於涵蓋從定義完善的數據子集中選擇數據的查詢。

篩選索引使用篩選謂詞對錶中的部分行進行索引。

與全表索引相比,設計良好的篩選索引可以提高查詢性能、減少索引維護開銷並可降低索引存儲開銷

篩選索引與全表索引相比具有以下優點:

  • 提高了查詢性能和計劃質量
  • 減少了索引維護開銷
  • 減少了索引存儲開銷
  • 僅包含少量非 NULL 值的稀疏列。
  • 包含多種類別的數據的異類列。
  • 包含多個範圍的值(如美元金額、時間和日期)的列。
  • 由列值的簡單比較邏輯定義的表分區。

註意事項

適用於:

  • 數據子集的篩選索引

  在列中只有少量相關值需要查詢時,可以針對值的子集創建篩選索引。

  • 異類數據的篩選索引

          表中含有異類數據行時,可以為一種或多種類別的數據創建篩選索引。

  • 鍵列

          最好在篩選索引定義中包含少量的鍵或包含列,並且只包含查詢優化器為查詢執行計劃選擇篩選索引所需的列。 無論某一篩選索引是否涵蓋了查詢,查詢優化器都可以為查詢選擇此篩選索引。 但是,如果某一篩選索引涵蓋了查詢,則查詢優化器更有可能選擇此篩選索引。

  • 篩選謂詞中的數據轉換運算符

          如果篩選索引結果的篩選索引表達式中指定的比較運算符會導致隱式或顯式數據轉換,則轉換髮生在比較運算符的左邊時,會出現錯誤。 解決方法是在比較運算符的右邊編寫包含數據轉換運算符(CAST 或 CONVERT)的篩選索引表達式。

全文索引概念

全文引擎使用全文索引中的信息來編譯可快速搜索表中的特定詞或片語的全文查詢。 全文索引將有關重要的詞及其位置的信息存儲在資料庫表的一列或多列中。 全文索引是一種特殊類型的基於標記的功能性索引,它是由 SQL Server全文引擎生成和維護的。 生成全文索引的過程不同於生成其他類型的索引。 全文引擎並非基於特定行中存儲的值來構造 B 樹結構,而是基於要編製索引的文本中的各個標記來生成倒排、堆積且壓縮的索引結構。 全文索引大小僅受運行 SQL Server 實例的電腦的可用記憶體資源限制。

從 SQL Server 2008開始,全文索引與資料庫引擎集成在一起,而不是像 SQL Server早期版本那樣位於文件系統中。對於新資料庫,全文目錄現在為不屬於任何文件組的虛擬對象;它僅是一個表示一組全文索引的邏輯概念。

註意事項

  • 全文索引是針對數據表,只能對錶創建全文索引,不能對資料庫創建全文索引。
  • 每個資料庫可以不包含全文目錄或包含多個全文目錄,一個全文目錄可以包含多個全文索引,但一個全文索引只能用於構成一個全文目錄。
  • 一個數據表只能創建一個全文索引,一個全文索引可以包含多個欄位。
  • 創建全文索引的表必須要有一個唯一的非空索引,並且這個唯一的非空的索引只能是一個欄位,不能是組合欄位。
  • 若要對某個表創建全文索引,該表必須具有一個唯一且非 Null 的列。您可以對以下類型的列創建全文索引:charvarcharncharnvarchartextntextimagexmlvarbinary 和 varbinary(max),從而可對這些列進行全文搜索。對數據類型為 varbinaryvarbinary(max)image 或 xml 的列創建全文索引需要您指定類型列。類型列是用來存儲每行中文檔的文件擴展名(.doc、.pdf、xls 等)的表列。

XML索引

XML 索引分為下列類別:主 XML 索引和輔助 XML 索引

主 XML 索引

主 XML 索引對 XML 列中 XML 實例內的所有標記、值和路徑進行索引。 若要創建主 XML 索引,相應 XML 列所在的表必須對該表的主鍵創建了聚集索引。 SQL Server 使用此主鍵將主 XML 索引中的行與包含此 XML 列的表中的行關聯起來。

主 XML 索引是中的 XML Blob 的已拆分和持久的表示形式xml數據類型列。 對於列中的每個 XML 二進位大型對象 (BLOB),索引將創建數個數據行。 該索引中的行數大約等於 XML 二進位大型對象中的節點數。 當查詢檢索完整的 XML 實例時, SQL Server 會提供此 XML 列中的實例。 XML 實例中的查詢使用主 XML 索引,並可以通過使用索引本身返回標量值或 XML 子樹。

輔助 XML 索引

為了增強搜索性能,可以創建輔助 XML 索引。 必須有了主 XML 索引才能創建輔助索引。 輔助索引的類型如下:

  • PATH 輔助 XML 索引

     如果查詢通常對 xml 類型列指定路徑表達式,則 PATH 輔助索引可以提高搜索的速度。

  • VALUE 輔助 XML 索引

          如果查詢是基於值的查詢,例如 /Root/ProductDescription/@*[. = "Mountain Bike"] 或 //ProductDescription[@Name = "Mountain Bike"],且沒有完全指定路徑或路徑包含有通配符,則生成基於主 XML 索引中的節點值所創建的輔助 XML 索引可以更快地獲得結果。

          VALUE 索引的鍵列是主 XML 索引的節點值和路徑。 如果您的工作負荷涉及到查詢 XML 實例中的值,但不知道包含這些值的元素名稱或屬性名稱,則 VALUE 索引可能會很有用。

  • PROPERTY 輔助 XML 索引

          從單個 XML 實例檢索一個或多個值的查詢適用 PROPERTY 索引。 通過檢索對象屬性時,會發生這種value () 方法的xml類型並且知道對象的主鍵值。

          PROPERTY 索引是對主 XML 索引的列(PK、Path 和節點值)創建的,其中 PK 是基表的主鍵。

以下為創建一個或多個輔助索引的一些準則:

  • 如果工作負荷對 XML 列大量使用路徑表達式,則 PATH 輔助 XML 索引可能會提高工作負荷的處理速度。 最常見的情況是在 Transact-SQL 的 WHERE 子句中對 XML 列使用 exist() 方法。

  • 如果工作負荷通過使用路徑表達式從單個 XML 實例中檢索多個值,則在 PROPERTY 索引中聚集各個 XML 實例中的路徑可能會很有用。 這種情況通常出現在屬性包方案中,此時提取對象的屬性並且已知其主鍵值。

  • 如果工作負荷涉及查詢 XML 實例中的值,但不知道包含那些值的元素名稱或屬性名稱,則您可能希望創建 VALUE 索引。 這通常出現在 descendant 軸查找中,例如 //author[last-name="Howard"],其中 <author> 元素可以出現在層次結構的任何級別上。 這種情況也出現在通配符查詢中,例如 /book [@* = "novel"],其中查詢將查找具有某個值為“novel”的屬性的 <book> 元素。


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

-Advertisement-
Play Games
更多相關文章
  • 一、文件比較運算符 1. e filename 如果 filename存在,則為真 如: [ -e /var/log/syslog ] 2. -d filename 如果 filename為目錄,則為真 如: [ -d /tmp/mydir ] 3. -f filename 如果 filename為 ...
  • 最近在觀察一些大數據方面的職位。特貢獻一套面試題,希望對找工作的博友們一點幫助! 1.簡述Linux以及Linux命令 cd命令 ls命令 mkdir和rmdir命令 cp命令 mv命令 rm命令 cat命令 tac命令 more命令 head命令 tail命令 touch命令 chown命令 fi ...
  • MongoDB 是高性能數據,但是在使用的過程中,大家偶爾還會碰到一些性能問題。MongoDB和其它關係型資料庫相比,例如 SQL Server 、MySQL 、Oracle 相比來說,相對較新,很多人對其不是很熟悉,所以很多開發、DBA往往是註重功能的實現,而忽視了性能的要求。其實,MongoDB ...
  • MongoDB日誌記錄了資料庫實例的健康狀態、語句的執行狀況、資源的消耗情況,所以日誌對於分析資料庫服務和性能優化很有幫助。 因此,很有必要花費一些時間來學習解析一下MongoDB的日誌文件。 日誌信息的格式 <日誌時間> <嚴重級別> <信息所屬分類> [<內容>] <消息> 例如 : 2014- ...
  • 一.binlog 二進位其它選項 在二進位日誌記錄了數據的變化過程,對於數據的完整性和安全性起著非常重要作用。在mysql中還提供了一些其它參數選項,來進行更小粒度的管理。 1.1 binlog-do-db=db_name 該選項告訴主伺服器,當前db_name庫會更新記錄到二進位日誌中,其它所有沒 ...
  • 1.字典表(sys_dict) 作用:用於存放多組值不變的基礎數據,只對系統提供查詢功能. *記錄的新增、更新、刪除都是通過手動進行操作. *其中dict_code為dict_title的編碼,相同dict_title的記錄為同一組基礎數據,每組基礎數據下又有多對dict_value與dict_na ...
  • Preface When I was compiling the sysbench just now,I encountered some failures in the precedure.I'll show the issue and workaround below. Issues 1. Ex ...
  • 一: redis資料庫安裝 系統環境:linux系統(centos/redhat):Red Hat Enterprise Linux Server release 6.8 (Santiago) redis版本:4.0.11 說明:由於本次採用的是源碼安裝(適用於在生產環境中無法訪問外網的情況),所以 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...