日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL Server 2000 索引视图提高性能2

發布時間:2024/4/15 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL Server 2000 索引视图提高性能2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
創建索引視圖

創建索引視圖所需的步驟與視圖的成功實現密不可分。

  • 確保將在視圖中引用的所有現有表的 SET 選項都正確。
  • 創建任何新表和視圖之前,確保會話的 SET 選項已正確設置。
  • 確保視圖定義是確定的。
  • 使用 WITH SCHEMABINDING 選項創建視圖。
  • 創建視圖的唯一群集索引。

  • 使用 SET 選項以獲得一致的結果

    如果在執行查詢時啟用不同的 SET 選項,則在 SQL Server 中對同一個表達式求值會產生不同的結果。例如,將 SET 選項 CONCAT_NULL_YIELDS_NULL 設置為 ON 之后,表達式 'abc' + NULL 返回的值是 NULL。而將 CONCAT_NULL_YIEDS_NULL 設置為 OFF 之后,該表達式得出的結果卻是 'abc'。索引視圖要求多個 SET 選項的值都固定,以確保這些視圖能夠得到正確維護并返回一致的結果。

    只要出現以下情況,就必須將下表中的 SET 選項設置為要求的值列中所示的值:

    • 創建了索引視圖。
    • 對索引視圖中引用的任何表執行了任何 INSERT、UPDATE 或 DELETE 操作。
    • 查詢優化器使用索引視圖來生成查詢計劃。
    SET
    選項
    要求
    的值
    默認
    服務器
    的值
    OLE DB

    ODBC
    的值
    DB LIB
    的值
    ANSI_NULLSONOFFONOFF
    ANSI_PADDINGONONONOFF
    ANSI_WARNINGONOFFONOFF
    ARITHABORTONOFFOFFOFF
    CONCAT_NULL_YIELDS_NULLONOFFONOFF
    NUMERIC_ROUNDABORTOFFOFFOFFOFF
    QUOTED_IDENTIFIERONOFFONOFF

    如果使用的是 OLE DB 或 ODBC 服務器連接,唯一必須修改的值是 ARITHABORT 的設置。所有 DB LIB 值都必須使用 sp_configure 在服務器級上正確設置或使用 SET 命令從應用程序正確設置。有關 SET 選項的詳細信息,請參閱關于 SQL Server 2000 的“SQL Server 聯機圖書”中的“使用 SQL Server 中的選項(英文)”。


    使用確定性函數

    索引視圖的定義必須是確定性的。如果選擇列表中的所有表達式以及 WHERE 和 GROUP BY 子句都是確定性的,則視圖就是確定性的。只要用特定的一組輸入值對確定性表達式進行求值,一定會返回同一個結果。只有確定性函數可以加入確定性表達式。例如,DATEADD 是確定性函數,因為將任何給定的一組變量值賦予它的三個參數進行求值,返回的總是同一個結果。而 GETDATE 則不是確定性函數,因為始終用同一個變量調用它,而它每次執行后返回的值都不相同。有關詳細信息,請參閱關于 SQL Server 2000 的“SQL Server 聯機圖書”中的“確定性和非確定性函數”。

    即便某個表達式是確定性的,但如果其中包含浮動表達式,確切的結果就可能取決于處理器的體系結構或微代碼的版本。要確保 SQL Server 2000 中數據的完整性,此類表達式只能加入索引視圖的非關鍵列。不包含浮動表達式的確定性表達式被稱為精確的表達式。只有精確的確定性表達式可以加入索引視圖的關鍵列和 WHERE 或 GROUP BY 子句。

    使用 COLUMNPROPERTY 函數和 IsDeterministic 屬性來確定視圖列是否是確定性的。使用 COLUMNPROPERTY 函數和 IsPrecise 屬性來確定包含架構綁定的視圖中的確定性列是否是精確的。如果為 TRUE,則 COLUMNPROPERTY 會返回 1,如果為 FALSE,則返回 0,如果是無效的輸入(列不是確定性的),則返回 NULL。例如,SELECT COLUMNPROPERTY(Object_Id('Vdiscount1'),'SumDiscountPrice','IsPrecise') 返回的是 0,因為 SumDiscountPrice 列引用了表 Order Details 中的浮動列 Discount。而同一視圖中的列 SumPrice 既是確定性的又是精確的。

    注意:???該 SELECT 語句所基于的視圖能夠在示例部分找到(視圖 1)。


    其它要求

    除“設計準則”、“使用 SET 選項以獲得一致的結果”和“使用確定性函數”部分中列出的要求之外,還必須符合以下要求。

    基表要求

    • 基表在創建時必須正確設置 SET 選項,否則就不能被包含架構綁定的視圖引用。
    • 表必須通過視圖定義中的兩部分名稱(所有者.表名)引用。

    函數要求

    • 用戶定義的函數必須使用 WITH SCHEMABINDING 選項創建。
    • 用戶定義的函數必須通過兩部分名稱(所有者.函數)引用。

    視圖要求

    • 視圖必須使用 WITH SCHEMABINDING 選項創建。
    • 視圖必須只引用同一數據庫中的基表,而不能引用其它視圖。

    語法限制

    對視圖定義的語法有幾個限制。視圖定義不能包含以下內容:

    • COUNT(*)
    • ROWSET 函數
    • 派生表
    • 自聯接
    • DISTINCT
    • STDEV、VARIANCE、AVG
    • Float* 列、文本列、ntext 列、圖像列
    • 子查詢
    • 全文謂詞(CONTAIN、FREETEXT)
    • 可空表達式的 SUM
    • MIN、MAX
    • TOP
    • OUTER 聯接
    • UNION

    注意:???索引視圖可以包含浮動列,不過,此類列不能包含在群集索引關鍵字中。

    GROUP BY 限制

    如果未使用 GROUP BY,表達式不能在選擇列表中使用。

    如果使用了 GROUP BY,則 VIEW 定義:

    • 必須包含 COUNT_BIG(*)。
    • 不得包含 HAVING、CUBE 或 ROLLUP。

    這些限制只適用于索引視圖定義。查詢可以在其執行計劃中使用索引視圖,即便該索引視圖并不符合這些 GROUP BY 限制。

    索引要求

    • 執行 CREATE INDEX 語句的用戶必須是視圖所有者。
    • 如果視圖定義中包含 GROUP BY 子句,唯一群集索引的關鍵字只能引用 GROUP BY 子句中指定的列。


    示例

    本部分的示例闡述索引視圖在兩種主要查詢(聚合和聯接)中的使用問題。同時還說明查詢優化器在確定某個索引視圖是否可用時使用的條件。有關這些條件的完整列表,請參閱查詢優化器如何使用索引視圖。

    查詢基于 Northwind(SQL Server 2000 中提供的數據庫樣本)中的表,并可以寫入的方式執行。創建視圖的前后,最好使用 SQL 查詢優化器中的“顯示執行計劃”工具來查看查詢優化器選定的計劃。盡管示例中闡述了優化器是如何選擇成本最低的執行計劃的,但因為 Northwind 數據庫樣本太小,因此無法體現性能的提高。

    以下查詢顯示如何從 Order Details 表中返回具有最大總折扣的五種產品的兩個方法。

    查詢 1

    SELECT TOP 5 ProductID, SUM(UnitPrice*Quantity) - SUM(UnitPrice*Quantity*(1.00-Discount))AS Rebate FROM [Order Details] GROUP BY ProductID ORDER BY Rebate DESC

    查詢 2

    SELECT TOP 5 ProductID, SUM(UnitPrice*Quantity*Discount)AS Rebate FROM [Order Details] GROUP BY ProductID ORDER BY Rebate DESC

    查詢優化器選定的執行計劃包含:

    • Order Details 表的群集索引掃描,估計有 2,155 行。
    • 哈希匹配/聚合運算符,該運算符基于 GROUP BY 列將選定的行放入哈希表,然后計算每行的 SUM 聚合。
    • 基于 ORDER BY 子句的 TOP 5 排序運算符。

    視圖 1

    添加包括 Rebate 列所需聚合的索引視圖將更改查詢 1 的查詢執行計劃。在數百萬行的大表上,查詢的性能也將明顯提高。

    CREATE VIEW Vdiscount1 WITH SCHEMABINDING AS SELECT SUM(UnitPrice*Quantity)AS SumPrice, SUM(UnitPrice*Quantity*(1.00-Discount)) AS SumDiscountPrice, COUNT_BIG(*) AS Count, ProductID FROM dbo.[Order Details] GROUP BY ProductID GO CREATE UNIQUE CLUSTERED INDEX VDiscountInd ON Vdiscount1 (ProductID)

    第一個查詢的執行計劃顯示 Vdiscount1 視圖由查詢優化器使用。不過,由于該視圖不包含 SUM(UnitPrice*Quantity*Discount) 聚合,因此不會被第二個查詢使用??梢詣摻硪粋€可以同時滿足上述兩個查詢的索引視圖。

    視圖 2

    CREATE VIEW Vdiscount2 WITH SCHEMABINDING AS SELECT SUM(UnitPrice*Quantity)AS SumPrice, SUM(UnitPrice*Quantity*(1.00-Discount))AS SumDiscountPrice, SUM(UnitPrice*Quantity*Discount)AS SumDiscountPrice2, COUNT_BIG(*) AS Count, ProductID FROM dbo.[Order Details] GROUP BY ProductID GO CREATE UNIQUE CLUSTERED INDEX VDiscountInd ON Vdiscount2 (ProductID)

    有了該索引視圖,現在兩個查詢的查詢執行計劃包含:

    • 對 Vdiscount2 視圖的群集索引掃描,估計有 77 行
    • 基于 ORDER BY 子句的 TOP 5 排序函數

    查詢優化器選擇該視圖是因為它提供了最低的執行成本,盡管在查詢中并未引用該視圖。

    查詢 3

    查詢 3 類似于前幾個查詢,只是 ProductID 已被 OrderID 所取代,視圖定義中沒有包括該列。這違背了以下條件:查詢選擇列表中的所有表達式都必須能從未包括在視圖定義內的表的視圖選擇列表中派生。

    SELECT TOP 3 OrderID, SUM(UnitPrice*Quantity*Discount) OrderRebate FROM dbo.[Order Details] GROUP BY OrderID ORDER BY OrderRebate desc

    要求單獨的索引視圖來滿足該查詢??梢詫?Vdiscount2 進行修改,使它包括 OrderID,但是所生成視圖的行數將與原表的行數相同,因此,提供的性能也不會高于使用基表所提供的性能。

    查詢 4

    該查詢可生成每個產品的平均價格。

    SELECT ProductName, od.ProductID, AVG(od.UnitPrice*(1.00-Discount)) AS AvgPrice, SUM(od.Quantity) AS Units FROM [Order Details] od, Products p WHERE od.ProductID=p.ProductID GROUP BY ProductName, od.ProductID

    索引視圖的定義中不能包括復雜的聚合(例如,STDEV、VARIANCE、AVG),不過,如果索引視圖中包括幾個聯合起來執行復雜聚合的簡單聚合函數,即可用于執行包含 AVG 的查詢。

    視圖 3

    該索引視圖包含執行 AVG 函數所需的簡單聚合函數。在創建了視圖 3 后執行查詢 4 時,執行計劃會顯示正被使用的視圖。優化器可以從視圖的簡單聚合列 Price Count 中導出 AVG 表達式。

    CREATE VIEW View3 WITH SCHEMABINDING AS SELECT ProductID, SUM(UnitPrice*(1.00-Discount))AS Price, COUNT_BIG(*)AS Count, SUM(Quantity)AS Units FROM dbo.[Order Details] GROUP BY ProductID Go CREATE UNIQUE CLUSTERED INDEX iv3 ON View3 (ProductID)

    查詢 5

    該查詢與查詢 4 相同,只不過包括一個附加搜索條件。即使該附加搜索條件只引用未包括在視圖定義內的表中的列,視圖 3 也將用于該查詢。

    SELECT ProductName, od.ProductID, AVG(od.UnitPrice*(1.00-Discount)) AS AvgPrice, SUM(od.Quantity)AS Units FROM [Order Details] AS od, Products AS p WHERE od.ProductID=p.ProductID AND p.ProductName like '%Tofu%' GROUP BY ProductName, od.ProductID

    查詢 6

    查詢優化器不能將視圖 3 用于該查詢。附加搜索條件 od.UnitPrice>10 包含視圖定義內的表中的列,而該列卻不出現在 GROUP BY 列表中,搜索謂詞也不出現在視圖定義中。

    SELECT ProductName, od.ProductID, AVG(od.UnitPrice*(1.00-Discount)) AS AvgPrice, SUM(od.Quantity) AS Units FROM [Order Details] od, Products p WHERE od.ProductID = p.ProductID AND od.UnitPrice > 10 GROUP BY ProductName, od.ProductID

    查詢 7

    相反,查詢優化器可以將視圖 3 用于查詢 7,原因是新搜索條件 od.ProductID in (1,2,13,41) 中定義的列包括在視圖定義內的 GROUP BY 子句中。

    SELECT ProductName, od.ProductID, AVG(od.UnitPrice*(1.00-Discount)) AS AvgPrice, SUM(od.Quantity) AS Units FROM [Order Details] AS od, Products AS p WHERE od.ProductID = p.ProductID AND od.ProductID in (1,2,13,41) GROUP BY ProductName, od.ProductID

    視圖 4

    該視圖在視圖定義中包括了列 od.Discount,可以滿足查詢 6 的條件。

    CREATE VIEW View4 WITH SCHEMABINDING AS SELECT ProductName, od.ProductID, SUM(od.UnitPrice*(1.00-Discount)) AS AvgPrice, SUM(od.Quantity) AS Units, COUNT_BIG(*) AS Count FROM dbo.[Order Details] AS od, dbo.Products AS p WHERE od.ProductID = p.ProductID AND od.UnitPrice > 10 GROUP BY ProductName, od.ProductID GO CREATE UNIQUE CLUSTERED INDEX VdiscountInd on View4 (ProductName, ProductID)

    查詢 8

    視圖 4 的同一個索引還將用于一個添加了與表 Orders 的聯接的查詢。該查詢符合以下條件:查詢 FROM 子句中列出的表是索引視圖的 FROM 子句中表的超集。

    SELECT ProductName, od.ProductID, AVG(od.UnitPrice*(1.00-Discount)) AS AvgPrice, SUM(od.Quantity) AS Units FROM dbo.[Order Details] AS od, dbo.Products AS p, dbo.Orders AS o WHERE od.ProductID = p.ProductID and o.OrderID = od.OrderID AND od.UnitPrice > 10 GROUP BY ProductName, od.ProductID

    最后兩個查詢是查詢 8 的變體。每個變體都違背了一個優化器條件,因此與查詢 8 不同,不能使用視圖 4。

    查詢 8a

    由于視圖定義中的 UnitPrice > 10 與查詢中的 UnitPrice > 25 之間的 WHERE 子句不匹配,所以 Q8a 不能使用索引視圖。查詢搜索條件謂詞必須是視圖定義中搜索條件謂詞的超集。

    SELECT ProductName, od.ProductID, AVG(od.UnitPrice*(1.00-Discount)) AvgPrice, SUM(od.Quantity) AS Units FROM dbo.[Order Details] AS od, dbo.Products AS p, dbo.Orders AS o WHERE od.ProductID = p.ProductID and o.OrderID = od.OrderID AND od.UnitPrice > 25 GROUP BY ProductName, od.ProductID

    查詢 8b

    注意,表 Orders 沒有參與索引視圖 V4 的定義。盡管如此,在該表中添加謂詞將禁止使用索引視圖,原因是添加的謂詞可能會消除聚合中的其它行(如查詢 8b 中所示)。

    SELECT ProductName, od.ProductID, AVG(od.UnitPrice*(1.00-Discount)) AS AvgPrice, SUM(od.Quantity) AS Units FROM dbo.[Order Details] AS od, dbo.Products AS p, dbo.Orders AS o WHERE od.ProductID = p.ProductID and o.OrderID = od.OrderID AND od.UnitPrice > 10 AND o.OrderDate > '01/01/1998' GROUP BY ProductName, od.ProductID


    有關詳細信息

    Microsoft SQL Server 2000 聯機圖書包含索引視圖的詳細信息。有關其它信息,請參閱以下資源:

    • Microsoft SQL Server Web 站點(中文)。
    • Microsoft SQL Server 開發人員中心(英文)。
    • SQL Server 雜志(英文)。
    • Microsoft.public.sqlserver.server 和 microsoft.public.sqlserver.datawarehouse 新聞組,其站點是:http://communities.microsoft.com/newsgroups/default.asp?icp=chinacommunity&slcid=cn&MSCOMTB=ICP_中文新聞組(中文)。
    • 關于 SQL Server 的 Microsoft 正式課程。有關最新的課程信息,請參閱 Microsoft 培訓和服務站點(英文)

    總結

    以上是生活随笔為你收集整理的SQL Server 2000 索引视图提高性能2的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 色婷婷www | 不卡av在线 | 男人的天堂在线播放 | 国产情侣一区二区 | 欧美日韩不卡视频 | 中文日韩在线 | 在线看黄色网 | 特黄特色大片免费播放器使用方法 | av丁香 | 亚洲人视频在线 | 久艹在线视频 | 鲁鲁狠狠狠7777一区二区 | 在线观看污网站 | 精品久久久久久中文字幕 | 国产视频xxx | 日批网址 | 成人在线看片 | 亚洲制服丝袜av | 国产色av| 国模一区二区 | 日本人妖xxxx | 国产码视频| 福利视频导航网 | 99这里有精品 | 亚洲精品天堂在线观看 | 在线电影一区二区三区 | 天天躁日日躁狠狠躁伊人 | 成人网在线播放 | 中文字幕人妻一区二区在线视频 | 综合网亚洲 | 女人的天堂网站 | 国产精品欧美大片 | 极品国产一区 | 亚洲毛片久久 | 婷婷六月综合 | 中文字幕11页中文字幕11页 | 狠狠干伊人网 | 欧美壮男野外gaytube | 国产精品9191 | 久久精品色妇熟妇丰满人妻 | 神马久久av| 97成人资源站 | 苍井空亚洲精品aa片在线播放 | 九月丁香婷婷 | 欧美 日韩 高清 | 日本青青草视频 | 波多野吉衣一区二区 | 中文字幕人妻丝袜乱一区三区 | 亚洲精品成人久久 | 伦理片一区二区 | 国产综合久久久久久鬼色 | 中文无码日韩欧 | 五月婷婷色| xxxx视频在线 | 无码国产69精品久久久久同性 | 九九在线观看高清免费 | 天天干天天操天天插 | 亚洲伊人天堂 | 国产综合视频在线 | 波多野一区 | 久久久少妇 | 99riAv国产精品无码鲁大师 | 有码av在线 | 男生裸体视频 | 黄色一级黄色片 | 性巴克成人免费网站 | 久久中文字幕在线 | www.四虎精品 | 久久机热这里只有精品 | aaa黄色一级片 | 国产精品美女久久 | 91九色视频在线观看 | 成人丁香婷婷 | 亚洲精品一二三区 | 男人天堂五月天 | 91免费视频播放 | 日韩在线一卡二卡 | 色伊伊| 欧美日韩字幕 | 成人免费毛片色戒 | 国产热99 | 亚洲一区二区三区电影 | 日本美女在线 | 美女精品在线观看 | 国产高潮网站 | 娇小6一8小毛片 | 一区二区不卡在线观看 | 动漫av在线播放 | 在线观看黄色小视频 | 精产国产伦理一二三区 | 国产成人无码一区二区在线播放 | 免费在线一级片 | 国产色区| 少妇人妻一级a毛片 | av久操| 综合久久一区二区 | 天天插天天操天天干 | 国产视频手机在线观看 | 亚洲中文字幕一区二区在线观看 |