SQL 查詢性能優化----解決書簽查找

来源:http://www.cnblogs.com/androidshouce/archive/2016/06/14/5582763.html
-Advertisement-
Play Games

先來看看什麼是書簽查找: 當優化器所選擇的非聚簇索引只包含查詢請求的一部分欄位時,就需要一個查找(lookup)來檢索其他欄位來滿足請求。對一個有聚簇索引的表來說是一個鍵查找(key lookup),對一個堆表來說是一個RID查找(RID lookup)。這種查找即是——書簽查找。 書簽查找根據索引 ...


先來看看什麼是書簽查找: 

    當優化器所選擇的非聚簇索引只包含查詢請求的一部分欄位時,就需要一個查找(lookup)來檢索其他欄位來滿足請求。對一個有聚簇索引的表來說是一個鍵查找(key lookup),對一個堆表來說是一個RID查找(RID lookup)。這種查找即是——書簽查找。

   書簽查找根據索引的行定位器從表中讀取數據。因此,除了索引頁面的邏輯讀取外,還需要數據頁面的邏輯讀取。

從索引的行定位器到從表中讀取數據這之間會產生一些額外的開銷,本文就來解決這個開銷。 

先看下我的測試表結構: 

          

 

其中可以看出 有一個 聚簇索引 PK_UserID  和一個 非聚簇索引IX_UserName。

 

看看產生書簽 查找的效果: 

select UserName,Gender from  dbo.UserInfo where UserName='userN600' 

按上面的 SQL 產生執行計劃 可以看出, 會產生一個書簽查找(Key Lookup),如下圖

 

          

 

如果把上面的 SQL 改寫成

select UserName from  dbo.UserInfo where UserName='userN600'

 

          

可以看出 書簽查找 沒有了。

 

        本SQL 產生書簽查找的 主要原因是   本SQL 優化器會選擇 非聚簇索引IX_UserName,來執生SQL  。IX_UserName 索引不包含 Gender 這個欄位 於是產生個從索引到 數據表的 一個 查找 即 書簽查找。

 

解決書簽查找:

 

方法一、使用一個 聚簇索引 

     對於聚簇索引, 索引的葉子頁面和表的數據頁面相同,因此,當讀取聚簇索引 鍵列的值時,數據引擎可以讀取其它列的值而不需要任何行定位,這樣就解決了書簽查找。 

     對於這句SQL ( select UserName,Gender from  dbo.UserInfo where UserName='userN600')解決了書簽查找的辦法就是在UserName 上 建聚簇索引 ,因為一個表只有一個聚簇索引 ,這就意味著刪除現有聚簇索引(PK_UserID),將會造成其它從表 中的外鍵約束 要發生更改,這需要考一些相關的工作,可能嚴重影響依賴於現有聚簇索引的其它查詢。

 

方法二、使用一個 覆蓋索引 

    覆蓋索引 是在所有為滿足SQL 查詢不用到達基本表所需的列 建立的非聚簇索引。如果查詢遇到一個索引並且完全不需要引用底層數據表,那麼 該索引可以被認為是 覆蓋索引。 

      對於這句SQL ( select UserName,Gender from  dbo.UserInfo where UserName='userN600') 解決書簽查找的辦法就是 在非聚簇索引IX_UserName 里包含 Gender 欄位。 

      也就是在 建索引時 用INCLUDE 語句,具體操作如下

        

 

    用INCLUDE 最好在 以下情況下使用:

        1、不希望增加索引鍵的大小,但是仍然可以建一個 覆蓋索引;

        2、打算索引一種不能被索引的數據類型(除了文本、NTEXT和圖像);

        3、已經超過了一個索引的關鍵字列的最大數量

 

方法三、使用  索引連接

  索引連接  是使用多個索引之間一個索引交叉來完全覆蓋一個查詢。如果覆蓋索引變的非常寬,那麼就可以考慮索引連接。 

    對於這句SQL ( select UserName,Gender from  dbo.UserInfo where UserName='userN600' and Gender=1)可以在 Gender 上 建一個非聚簇索引就行了。

    對於這個例 子,可能 SQL 優化器並沒有同時 選 用非聚簇索引IX_UserName 和 我們新建立在Gender 上的索引,這時我們可以告知  SQL 優化器 同時使用 這個兩上索引,操作如下 

      select Gender,UserName from UserInfo  with(index (IX_Gender,IX_UserName)) where UserName='jins' and Gender=0


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

-Advertisement-
Play Games
更多相關文章
  • 在使用storyboard和xib時,我們經常要用到ScrollView,還有自動佈局AutoLayout,但是ScrollView和AutoLayout 結合使用,相對來說有點複雜。根據實踐,我說一下我的理解,在故事板或xib中,ScrollView是根據其下麵的一個View的大小來確定Conte ...
  • 先來說說分享,畢竟沒有分享何來接收分享可談? 分享目前已實現的有兩種方式:後臺代碼實現、ShareActionProvider實現,接著先說通過代碼實現 這裡分享的是圖片,圖片以二進位的形式進行傳遞,所以用Intent.EXTRA_STREAM來標誌附加的消息類型。 如果是文字的話原理是一樣的,只需 ...
  • 一般我們提示的時候都是直接提示文字的,其實Toast也可以顯示圖片 常用方法 例子 1.只顯示圖片的Toast 2.顯示圖片和文字 3.設計自己的Toast 有時候上面兩種還沒能滿足自己的要求,就可以自定義佈局(我在drawable中放了兩張圖片,詹姆斯和庫里的) 準備佈局文件 準備好你想要展示的T ...
  • 1.參數文件的定義、作用 oracle資料庫通過一系列參數來對資料庫進行配置。這些參數是以鍵-值對的形式來表 示的,如:MAXLOGFILES=50BACKGROUND_DUMP_DEST=C:DUMP其中,等號左邊是參數名,右邊是對應的參數的值,值的類型有多種,典型的如數字和 字元串. 參數文件就 ...
  • 傳統MySQL+ Memcached架構遇到的問題 實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題: 1.MySQL需要不斷進行拆庫拆表,Memca ...
  • 大家可能都聽說了,微軟在幾個星期前宣佈發佈可以在Linux上完整運行的SQL Server!如果你想看下在Linux上SQL Server如何運行,進行查詢是什麼樣的體驗,可以看下下麵的視頻。 ...
  • mysql cache功能分析: 1 mysql的cache功能的key的生成原理是:把select語句按照一定的hash規則生成唯一的key,select的結果生成value,即key=>value。所以對於cache而言,select語句是區分大小寫的,也區分空格的。兩個select語句必須完完 ...
  • 我們使用oracle的人都知道可以通過rownum偽列得到查詢結果序列前面的指定的行,為了下麵更好的進行說明問題,我們先來創建一個數據表table1: create table table1 (AAA integer primary key, BBB varchar(30)); 然後在table1中 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...