索引掃描與索引查找

来源:http://www.cnblogs.com/TTTTTZ/archive/2016/01/04/5099832.html
-Advertisement-
Play Games

掃描與查找操作均是SQL Server從表或索引中讀取數據採用的迭代器,這些也是SQL Server支持的最基本的運算。幾乎在每一個查詢計劃中都可以找到,因此理解它們的不同是很重要的,掃描是在整張表上進行處理,而索引是在整個頁級上進行處理,而查找則返回特定謂詞上一個或多個範圍內的數據行。下麵讓我們....


    掃描與查找操作均是SQL Server從表或索引中讀取數據採用的迭代器,這些也是SQL Server支持的最基本的運算。幾乎在每一個查詢計劃中都可以找到,因此理解它們的不同是很重要的,掃描是在整張表上進行處理,而索引是在整個頁級上進行處理,而查找則返回特定謂詞上一個或多個範圍內的數據行。

   下麵讓我們看一個掃描的例子

   SELECT[OrderId]FROM[Orders]WHERE[RequiedDate]='2015-03-21'

    在Orders表中,並不存在對RequiredDate列的索引,因此,SQL Server必須讀取Orders表的每一行來股幾每一行的RequiredDate謂詞,如果滿足該謂詞條件,則返回該行數據。

   為了最大化的提升性能,SQL Server儘可能地使用掃描迭代器來估計該謂詞,然而,如果該謂詞過於複雜或開銷過大,SQL Server或許使用別的篩選迭代器來估計。以下是WHERE關鍵字中的文本計劃的過程:  

|--Clustered Index Scan(OBJECT:([Orders].[PK_Orders]),
WHERE:([Orders].[RequiredDate]='1998-03-26'))

下圖描述了該操作的流程圖:

    由於掃描表的每一行數據,不論滿足與否,因此,其查詢開銷對錶中的總記錄數是均衡的,當表中的數據很少或滿足謂詞的行比較多時,採用掃描操作有效,如果表中數據量比較大或滿足謂詞的行較少時,使用掃描將讀取更多的頁面或執行更多的I/O操作來獲取數據,這顯而不是最有效的方法.

下麵讓我們看一個關於索引查找的例子,下麵的例子在OrderdDate列上創建了索引:     SELECT [OrderId] FROM [Orders] WHERE [OrderDate] = '1998-02-26'

    這次SQL Server能夠使用索引查找來直接找到滿足謂詞的那些記錄行,這裡稱該謂詞為"查找"謂詞.大多數情況下,SQL Server並不顯式地估計"查找"謂詞,而索引確保了"查找"操作僅返回滿足的數據行,以下是"查找"謂詞的文本計劃:

|--Index Seek(OBJECT:([Orders].[OrderDate]),

SEEK:([Orders].[OrderDate]=CONVERT_IMPLICIT(datetime,[@1],0)) ORDERED FORWARD

註意:SQL Server自動使用@1參數替換查詢文本中的參數

由此看來,查找僅掃描滿足該謂詞的數據頁,其查詢開銷顯然要比表中總記錄數的開銷低,因此,對於高選擇度的查詢謂詞操作,查找通常是最有效的策略.也就是說,對於估計大表中的數據時,使用查找謂詞是比較有效率的.

SQL Server將掃描與查找進行區分,如同將在堆(無聚集索引的對象)上掃描,聚集索引上的掃描,非聚集索引上的掃描進行分區.下表說明瞭這些出現在的查詢計劃中的掃描與查找運算.

     
     
     

 

 

掃描

查找

表掃描

 

聚集索引

聚集索引找描

聚集索引查找

非聚集索引

索引掃描

索引查找

 

 

 

 

 

 

可查找的謂詞與覆蓋列

         SQL Server在執行索引查找之前,它需要確定索引的鍵是否滿足查詢中的謂詞,我們稱該謂詞為"可查找的謂詞",SQL Server必須確定該索引是否包含或"覆蓋"查詢中引用的列集合.下麵描述瞭如何確定哪個謂詞是可查找的,哪個謂詞不是可查找的,哪些列需要索引覆蓋.

單列索引

         在單列索引上判斷謂詞是否是可查找的是很容易的,SQL Server使用單列索引來響應多數簡單的比較(包括相等和不等(大於,小於等))或者更複雜的表達式,如在列上運算的函數和LIKE %謂詞,這些運算符將阻止SQL Server使用索引查找.

例如,假設我們在Col1列上創建了單列索引,可以在以下謂詞上進行索引查找:

  • [Col1] = 3.14
  • [Col1] > 100
  • [Col1] BETWEEN 0 AND 99
  • [Col1] LIKE 'abc%'
  • [Col1] IN (2, 3, 5, 7)

然頁,在以下謂詞上將不能使用索引查找:

  • ABS([Col1]) = 1
  • [Col1] + 1 = 9
  • [Col1] LIKE '%abc'
  • 下麵我通過一些例子來介紹單列索引:

首先創建一些架構對象: create table person (id int, last_name varchar(30), first_name varchar(30))

create unique clustered index person_id on person (id) create index person_name on person (last_name, first_name)

 

以下是三個查詢及其各自的文本查詢計劃,第一個查詢在person_name索引上進行查找,第二個查詢首先在第一個鍵列上進行索引查找,然後使用residual謂詞來估計first_name,第三個查詢不能使用索引查找,而是使用了索引掃描來處理residual謂詞.

select id from person where last_name = 'Doe' and first_name = 'John'

|--Index Seek(OBJECT:([person].[person_name]), SEEK:([person].[last_name]='Doe' AND [person].[first_name]='John'))

 

select id from person where last_name > 'Doe' and first_name = 'John'

|--Index Seek(OBJECT:([person].[person_name]), SEEK:([person].[last_name] > 'Doe'),  WHERE:([person].[first_name]='John'))

 

select id from person where last_name like '%oe' and first_name = 'John'

  |--Index Scan(OBJECT:([person].[person_name]),  WHERE:([person].[first_name]='John' AND [person].[last_name] like '%oe'))

上面三條查詢的圖形查詢計劃:


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

-Advertisement-
Play Games
更多相關文章
  • 一.Ajax介紹 Ajax是2005年2月才誕生但是現在已經炙手可熱的一項全新技術.這項新技術能夠極大地改善網站的用戶體驗. 什麼是Ajax Ajax是非同步Javascript和XML(Asynchronous JavaScript and XML)的英文縮寫. Ajax的核心理...
  • /// /// 根據年月日計算星期幾/// /// 年/// 月/// 日/// publicstaticstringCaculateWeekDay(inty,intm,intd){if(m == 1) m = 13;if(m == 2) m = 14;intweek = (d + 2 * m + ...
  • 如題目所示,本文要來聊一聊在游戲開發中經常會涉及到的話題——游戲AI。設計游戲AI的目標之一是要找到一種便於使用並容易拓展的的方案,常見的一些游戲AI方案包括了有限狀態機(FSM)、分層有限狀態機(HFSM)、面向目標的動作規劃(GOAP)以及分層任務網路(HTN)和行為樹(BT)等等。下麵我們就來...
  • 1.新建一個頁面,ImageCode.aspx2.在Page_Load中添加如下代碼string tmp = RndNum(4); HttpCookie a = new HttpCookie("ImageV ", tmp); Respo...
  • 存儲管理子系統(DFSMS)存儲管理也是系統的一項基本服務。系統存儲管理子系統(Storage Management System,SMS)定義了系統中的各種輸入/輸出設備,並控制這些設備的操作;同時,它還提供文件系統的基本功能,使用戶可以方便、快速地訪問數據。系統的各種程式及數據都保存在硬碟上,如...
  • 一.TCP/IP協議族 TCP/IP是一個協議族,通常分不同層次進行開發,每個層次負責不同的通信功能。包含以下四個層次:1. 鏈路層,也稱作數據鏈路層或者網路介面層,通常包括操作系統中的設備驅動程式和電腦中對應的網路介面卡。它們一起處理與電纜(或其他任何傳輸媒介)的物理介面細節。2. 網路層,.....
  • 今天下午,幫同事重寫了一個MySQL SQL語句,該SQL語句涉及兩張表,其中一張表是字典表(需返回一個欄位),另一張表是業務表(本身就有150個欄位,需全部返回),當然,欄位的個數是否合理在這裡不予評價。平時,返回的數據大概5w左右,系統尚能收到數據。但12月31日那天,數據量大概20w,導致SQ...
  • 原理:使用公用表表達式的遞歸查詢 傳送門:https://msdn.microsoft.com/zh-cn/library/ms186243 問題:指定一個父級,查詢出該父級下麵的所有節點。 舉例說明:存在表 ComponentI為子,PP_ComponentID為父。 CREATE PROCEDU...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...