1. 程式人生 > >第十章——維護索引(7)——使用索引檢視提高效能

第十章——維護索引(7)——使用索引檢視提高效能

前言:

檢視是一個包含了一個或多個表的資料列的虛擬表。通常情況下,它僅僅是儲存了查詢的物件,一個檢視可以當作一個表,可以用於儲存過程、JOIN、使用者自定義函式等等。

檢視包含了下面兩個主要特性:

1、 提供了一個安全機制,用於限制使用者只能訪問特定的資料。

2、 使得開發人員能定製使用者的邏輯檢視。

當你查詢一個檢視時,優化器會產生一個單一的執行計劃給這個查詢。在索引檢視未出現之前,檢視必須解決查詢在執行期間才硬化。所有的JOIN、聚合都在執行時才發生,當建立了索引檢視之後,檢視的結果就會在建立時物化並以物理方式儲存在資料庫中。減少了執行大表上的複雜查詢的開銷。

準備工作:

在開始索引檢視之前,需要先決定哪些列需要包含在索引檢視中,如何選擇候選碼等等:

1、 檢視不能引用其他檢視。

2、 檢視要引用什麼基礎表。

3、 列名必須明確定義別名。

而它的缺點是:

1、 耗費硬碟空間存放。

2、 在DML語句如增刪改的時候,索引建立會有開銷,因為這些一旦執行,索引必須隨機更新。

3、 維護開銷。

在決定建立索引檢視之前,最好標識一下select語句將會使用多少列。如果小範圍的select語句將要使用,如果表不穩定且經常要更新,那麼建立索引檢視並不是件好事。通常情況下,經常JOIN或者聚合,且表很大的查詢,可以考慮使用索引檢視。但是由於它的某些限制,並不適合在OLTP中過度使用。

在建立之前有些SET選項需要配置:

1、 ARITHABORT

2、 CONCAT_NULL_YIELDS_NULL

3、 QUOTED_IDENTIFIER

4、 ANSI_WARNINGS

5、 ANSI_NULLS

6、 ANSI_PADDING

7、 NUMERIC_ROUNDABORT——OFF,其他為ON。

步驟:

1、 首先使用下面的語句建立一個檢視:

 USE AdventureWorks2012
GO
CREATE VIEW POView
WITH SCHEMABINDING
AS
    SELECT  POH.PurchaseOrderID ,
            POH.OrderDate ,
            emp.LoginID ,
            v.name AS VendorName ,
            SUM(POD.OrderQty) AS OrderQty ,
            SUM(POD.OrderQty * POD.UnitPrice) AS Amount ,
            COUNT_BIG(*) AS [Count]
    FROM    Purchasing.PurchaseOrderHeader POH
            INNER JOIN Purchasing.PurchaseOrderDetail AS POD ON POH.PurchaseOrderID = POD.PurchaseOrderID
            INNER JOIN HumanResources.Employee AS EMP ON poh.EmployeeID = EMP.BusinessEntityID
            INNER JOIN Purchasing.Vendor AS V ON POH.VendorID = v.BusinessEntityID
    GROUP BY POH.PurchaseOrderID ,
            POH.OrderDate ,
            emp.LoginID ,
            v.Name
GO
 
CREATE UNIQUE CLUSTERED INDEX IndexPOView ON POView(PurchaseOrderID)
GO


2、 在建立了檢視和檢視上的聚集索引之後,現在是時候看看檢視的效能,開啟實際執行計劃,並在同一個窗體一起執行下面語句:

SELECT TOP 10
        POH.PurchaseOrderID ,
        POH.OrderDate ,
        emp.LoginID ,
        v.name AS VendorName ,
        SUM(POD.OrderQty) AS OrderQty ,
        SUM(POD.OrderQty * POD.UnitPrice) AS Amount ,
        COUNT_BIG(*) AS [Count]
FROM    Purchasing.PurchaseOrderHeader POH
        INNER JOIN Purchasing.PurchaseOrderDetail AS POD ON POH.PurchaseOrderID = POD.PurchaseOrderID
        INNER JOIN HumanResources.Employee AS EMP ON poh.EmployeeID = EMP.BusinessEntityID
        INNER JOIN Purchasing.Vendor AS V ON POH.VendorID = v.BusinessEntityID
GROUP BY POH.PurchaseOrderID ,
        POH.OrderDate ,
        emp.LoginID ,
        v.Name
    go   
SELECT TOP 10
        *
FROM    POView WITH ( NOEXPAND )


3、 觀察其執行計劃:

可以看出,普通查詢的開銷是索引檢視的9倍(不是絕對值),因為第一個查詢使用了多個索引,而第二個查詢只用了一個。

 

分析:

對於應用程式來說,檢視是否是索引檢視,都對源程式沒有影響,優化器會自動優化這些步驟,有時候優化器會選擇直接訪問表上的索引而不是使用索引檢視,在測試環境中,可以直接測試查詢或者索引檢視。如果優化器使用了表上的索引,也可以強制使用WITH NOEXPAND提示來限定使用索引,僅當查詢優化器確定在 SQL Server 的查詢計劃中使用索引檢視有益時,SQL Server 才會選擇WITH NOEXPAND。

擴充套件資訊:

索引檢視必須使用WITHSCHEMABINDING選項,以便檢視引用的表不會被隨意修改甚至刪除。索引檢視不支援HAVING,CUBE和ROLLUP。

相關推薦

會話管理 會話驗證

Shiro 提供了會話驗證排程器,用於定期的驗證會話是否已過期,如果過期將停止會話;出於效能考慮,一般情況下都是獲取會話時來驗證會話是否過期並停止會話的;但是如在web環境中,如果使用者不主動退出是不知道會話是否過期的,因此需要定期的檢測會話是否過期,Shiro 提供了會話

會話管理 sessionFactory

sessionFactory 是建立會話的工廠,根據相應的Subject 上下文資訊來建立會話;預設提供了SimpleSessionFactory用來建立SimpleSession會話。 首先自定義一個Session: public class OnlineSession

《利用python進行資料分析》 時間序列

stamp = ts.index[2] print ts[stamp],'\n' #還有更方便的用法,傳入可以被解釋為日期的字串 print ts['1/10/2011'] print ts['20110110'],'\n' #對於較長的時間序列,只需傳入“年”或“年月”即可輕鬆選取資料切片 long_ts

——維護索引7——使用索引檢視提高效能

前言:檢視是一個包含了一個或多個表的資料列的虛擬表。通常情況下,它僅僅是儲存了查詢的物件,一個檢視可以當作一個表,可以用於儲存過程、JOIN、使用者自定義函式等等。檢視包含了下面兩個主要特性:1、 提供了一個安全機制,用於限制使用者只能訪問特定的資料。2、 使得開發人員能定製

——維護索引3——通過重建索引提高效能

前言:重建一個索引只是在內部刪除並重建索引,使得碎片消失、統計資訊更新、物理順序重新排列組織。它會壓縮資料頁,按照填充因子填充適當的資料。如果有需要,也會新增新的資料頁。這些操作有利於提高資料查詢的速度,但是這個工作如果發生在大表上面,將是非常耗時耗資源的。準備工作:首先先要

資料庫系統概論: 資料庫恢復技術

第十章  資料庫恢復技術10.1  事務的基本概念10.1.1.事務 1、事務(Transaction)是使用者定義的一個數據庫操作序列,這些操作要麼全做,要麼全不做,是一個不可分割的工作單位。 2、事務和程式是兩個概念 (1)在關係資料庫中,一個事務可

讀書筆記 ---- 《計算機網路—謝希仁7版》---- 4 網路層下篇

第4章 網路層(上篇):https://blog.csdn.net/pcwl1206/article/details/83999363 本文目錄: 4.4  網際網路的路由選擇協議 4.4.1  有關路由選擇協議的幾個基本概念 4.4.2  內部閘道器協

C++Primer五版 習題答案1~10

1:這個比較簡單,類比下 find() 函式也就知道了。 #include<iostream> #include<algorithm> #include<vector> using namespace std; void main() {

MySQL5.7從入門到精通--------讀書筆記4

7.5.1  帶ANY、SOME、ALL的子查詢         子查詢是指一個查詢語句巢狀在另外一個查詢語句中的查詢。         在SELECT子句中先計運算元查詢,子查詢結果作為來外外層另外一個查詢的過濾條件。即另外一個查詢的查詢條件就是子查詢中返回的資料記錄。

04-VTK基礎2

輸入 per 系統 相關 bsp 開發者 框模型 bject -h 【譯者:這個系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一書作的中文翻譯(出版時間2010年,ISBN: 978-1-930934-23-8),

04-VTK基礎3

.net http tput 作用 lte osi amp 組成 演示 【譯者:這個系列教程是以Kitware公司出版的《VTK User’s Guide -11th edition》一書作的中文翻譯(出版時間2010年,ISBN: 978-1-930934-2

8 傳輸層1_TCP/UDP協議的應用場景

一個數 選擇 str 根據 connect .cn eight 安全 器) 1. 傳輸層的兩個協議 1.1 TCP和UDP協議的應用場景 (1)TCP協議:如果要傳輸的內容比較多,需要將發送的內容分成多個數據包發送。這就要求在傳輸層用TCP協議,在發送方和接收方建立連接

8 傳輸層2_UDP協議

之前 用戶數 發送數據 1-1 效率 沒有 strong 而是 系統 2. 用戶數據報協議(UDP) 2.1 UDP的特點 (1)UDP是無連接的,即發送數據之前不需要建立連接,因此減少了開銷和發送數據之前的時延。 (2)UDP使用了盡最大努力交付,即不保證可靠交付,因此主

8 傳輸層6_擁塞控制

法線 enter 部分 col alt 概念 接下來 tran 增加 6. 擁塞控制 6.1 擁塞控制的原理 (1)理想狀態下:路由器R1和R2向R3提供負載不超過1000Mb/s,都能從R3發送到R4。當提供的負載超過1000Mb/s後,不能再提高了,多余的數據包將被

9 應用層4_超文本傳輸協議HTTP

span 關閉連接 多圖 帳戶 通過 從服務器 -668 傳輸協議 分享 5. 超文本傳輸協議HTTP 5.1 統一資源定位符URL (1)URL的一般形式:<協議>://<主機>:<端口>/<路徑>   ①協議後面必須寫上“

9 應用層5_文件傳輸協議FTP

public 被動模式 更多 保留 允許 服務器端 磁盤 stat 命令 6. 文件傳輸協議FTP 6.1 FTP主動和被動模式 (1)FTP協議   ①與其他協議不同,FTP協議在客戶端訪問FTP服務器時需要建立兩個TCP連接。一個用來傳輸FTP命令,一個用來傳輸數據。

《Java從小白到大牛精簡版》之6 運算符

java java小 白 java初學者 Java語言中的運算符(也稱操作符)在風格和功能上都與C 和C++極為相似。本章為大家介紹Java語言中一些主要的運算符,包括算術運算符、關系運算符、邏輯運算符、位運算符和其他運算符。6.1 算術運算符Java中的算術運算符主要用來組織數值類型數據的算術運

深入理解計算機系統_3e 家庭作業部分 CS:APP3e chapter 4 homework

ray design sed copy default ror this 處理 implement 4.52以後的題目中的代碼大多是書上的,如需使用請聯系 [email protected] 流水線部分只寫了偶數題號的,這幾天太浮躁,落下了好多課。。。 4.

: Git 介紹 [Learn Android Studio 漢化教程]

features 發布 double to do oda 日誌功能 測試 相關 rds Learn Android Studio 漢化教程 Let’s reset even further to remove all traces of your work on

鼠標CHECKER1

技術 uname rect amp tom line lineto bject lock CHECKER1程序將客戶區劃分成25個矩形,構成一個5*5的數組。如果在其中一個矩形內單擊鼠標,就用X形填充該矩形。再次單擊,則X形消失。 1 /*-------------