日本在线观看,国产激情视频一区二区在线观看 ,а√天堂资源官网在线资源,性网站在线看,久久99影视,国产精品嫩草影院av蜜臀,精品久久久香蕉免费精品视频,欧美日韩国产一区二区三区地区,国产性做久久久久久,在线看成人短视频

Categories


Tags


使用SQL Server 2000索引視圖提高性能

作者:Gail Erickson

摘要:本文檔介紹 SQL Server 2000 企業版的新功能 - 索引視圖。講解索引視圖并討論一些提高性能的具體方案。

什么是索引視圖?

許多年來,Microsoft? SQL Server? 一直都提供創建虛擬表(稱為視圖)的功能。在過去,這些視圖主要有兩種用途:

提供安全機制,將用戶限制在一個或多個基表中的數據的某個子集。

提供一種機制,允許開發人員定制用戶如何才能以邏輯方式查看存儲在基表中的數據。

SQL Server 2000 已經擴展了 SQL Server 視圖的功能,以提高系統性能。它可以在一個視圖上創建唯一的群集索引和非群集索引,可以改進最復雜查詢的數據訪問性能。在 SQL Server 2000 中,擁有唯一群集索引的視圖被稱為索引視圖。

注意:   索引視圖只是 SQL Server 2000 企業版和 SQL Server 2000 開發人員版的一個功能。

從數據庫管理系統 (DBMS) 的觀點來看,視圖是數據(元數據)的說明。創建典型視圖時,通過 SELECT 語句(定義一個顯示為虛擬表的結果集)來定義元數據。當其它查詢的 FROM 子句中引用了某個視圖時,將從系統目錄中檢索該元數據,并對其進行擴展以代替該視圖的引用。在視圖擴展之后,查詢優化器會為正在執行的查詢編譯單個執行計劃。

如果是非索引視圖,視圖在運行時將被實體化。任何計算(如聯接或聚合)都在為每個引用該視圖的查詢執行查詢期間進行。(視圖并不總需要被完全實體化。查詢可以包含其它一些謂詞、聯接或聚合,以應用于該視圖所引用的表和視圖。)在視圖上創建了唯一的群集索引之后,視圖的結果集會立即被實體化并持續保存在數據庫的物理存儲空間中,以便節省這種操作所占用的大量資源。

在執行查詢時,有兩種方法可以使用索引視圖。查詢可直接引用索引視圖,更重要的是,如果查詢優化器確定視圖能夠替換為查詢的部分或全部,而且這是低成本的查詢計劃,則可以選擇索引視圖。第二種情況是使用索引視圖代替基礎表及其普通索引。此時,不需要在查詢中引用視圖,查詢優化器即可在執行查詢期間使用該視圖。這樣,現有的應用程序無需更改即可從新建的索引視圖中獲益。

通過索引視圖提高的性能

使用索引來提高查詢性能并不是什么新觀念,不過,索引視圖還具有使用標準索引不能獲得的其它性能優點。索引視圖能夠在以下方面提高查詢性能:

能夠預先計算聚合并將其存儲在索引中,從而最大限度地減少在執行查詢期間進行成本很高的計算。

能夠預先聯接表并存儲生成的數據集。

能夠存儲聯接或聚合的組合。

使用視圖的輔助索引

視圖的輔助性非群集索引可以提高其它查詢性能。與表的輔助索引類似,視圖的輔助索引也可以提供更多選項,以便查詢優化器在編譯過程中從中進行選擇。例如,如果查詢包括群集索引未涉及的列,優化器可以在計劃中選擇一個或多個輔助索引,從而避免對索引視圖或基表進行費時的全局掃描。

由于索引需要不斷維護,所以為架構添加索引會增加數據庫的額外開銷。因此應該認真考慮,找到索引和維護額外開銷之間的平衡點。

使用索引視圖的好處

實現索引視圖之前,請先分析數據庫的工作量。運用自己對查詢以及各種工具(例如 SQL 分析器)的知識來鑒別使用索引視圖可以獲益的查詢。如果經常進行聚合和聯接,最好使用索引視圖。

并非所有查詢都會從索引視圖中獲益。與普通索引類似,如果未使用索引視圖,就沒有好處可言。在此情況下,不但不能提高性能,還會加大磁盤空間的占用、增加維護和優化的成本。但是,如果使用了索引視圖,它們可以(成數量級地)明顯地提高數據訪問的性能。這是因為查詢優化器使用存儲在索引視圖中的預先計算的結果,從而大大降低了執行查詢的成本。

查詢優化器只在查詢的成本比較大時才考慮使用索引視圖。這樣可以避免在查詢優化成本超出因使用索引視圖而節省的成本時,試圖使用各種索引視圖。當查詢成本低于 1 時,幾乎不使用索引視圖。

使用索引視圖可以受益的應用包括:

決定支持工作量

數據集市

聯機分析處理 (OLAP) 庫和源

數據挖掘工作量

從查詢的類型和模式的角度來看,受益的應用可被歸納為包含以下內容的應用:

大表的聯接和聚合

查詢的重復模式

重復聚合相同或重疊的列集

針對相同關鍵字重復聯接相同的表

上述的組合

相反,包含許多寫入的聯機事務處理 (OLTP) 系統或更新頻繁的數據庫,可能會因為要同時更新視圖和根本基表而使維護成本增加,所以不能利用索引視圖。

查詢優化器如何使用索引視圖

SQL Server 查詢優化器可自動確定何時可以將索引視圖用于給定的查詢執行中。查詢中無需直接引用視圖,優化器就可以將該視圖用于查詢執行計劃。因此,無需對現有的應用程序本身進行任何更改,這些應用程序即可利用索引視圖。唯一需要做的就是創建索引視圖。

優化器的考慮因素

查詢優化器會考慮幾個條件來確定索引視圖能涵蓋部分查詢還是整個查詢。這些條件符合查詢中的單個 FROM 子句并包含以下內容:

查詢 FROM 子句中的表必須是索引視圖 FROM 子句中的表的超集。

查詢中的聯接條件必須是視圖中聯接條件的超集。

查詢中的聚合列必須是視圖中的聚合列的子集。

查詢選擇列表中的所有表達式都必須源自于視圖選擇列表或源自于不包括在視圖定義中的表。

查詢搜索條件謂詞必須是視圖定義中搜索條件謂詞的超集。視圖搜索謂詞中的每個合取項都必須以同樣的形式出現在查詢搜索謂詞中。

查詢搜索條件謂詞中的所有列(屬于視圖定義中的表)都必須出現在下列一項或多項中:

視圖定義中的同一個謂詞。

GROUP BY 列表。

視圖選擇列表(若沒有 GROUP BY 列表)。

如果查詢包含多個 FROM 子句(子查詢、派生表、UNION),優化器可以選擇多個索引視圖來管理含有多個 FROM 子句的查詢。

注意:   也存在例外情形,即優化器可能將兩個 FROM 子句折疊成一個(將子查詢折疊成聯接或將派生表折疊成聯接變體)。如果出現此類情況,索引視圖替換可能會涵蓋原查詢中的多個 FROM 子句。

本文檔結尾介紹了演示這些條件的查詢示例。而建議的最佳方法就是:讓查詢優化器來確定在查詢執行計劃中使用哪些索引(如果有的話)。

使用 NOEXPAND 選項

NOEXPAND 選項強制查詢優化器象對待包含群集索引的普通表一樣對待視圖。在此情況下,必須在 FROM 子句中直接引用索引視圖。例如:

SELECT Column1, Column2, .。。 FROM Table1, View1 WITH (NOEXPAND)WHERE .。。

使用 EXPAND VIEWS 選項

另外,用戶可以在查詢結束時通過使用 EXPAND VIEWS 選項,明確地將索引視圖排除在考慮之外。例如:

SELECT Column1, Column2, .。。 FROM Table1, View1 WHERE .。。OPTION (EXPAND VIEWS)

如果使用該選項,查詢優化器在評估低成本的方法(該方法涉及查詢中引用的列)時將忽略所有視圖索引。

設計的考慮因素

為數據庫系統找到適當的索引集是相當復雜的。盡管在設計普通索引時要考慮許多可能性,但將索引視圖添加到架構會極大地增加設計和潛在結果的復雜性。例如,索引視圖可用于:

查詢中所引用表的任何子集。

查詢中條件的任何子集(屬于表的上述子集)

分組列。

聚合函數,如 SUM.

應同時設計表的索引和索引視圖,以便從各個結構中獲得最佳結果。由于索引和索引視圖都可能對給定的查詢有用,所以單獨設計它們會導致多余的建議方案,以致存儲和維護開銷較高。在調整數據庫的物理設計時,必須均衡考慮各種查詢集的性能要求與數據庫系統必須支持的更新操作。因此,為索引視圖找到一種合理的物理設計是一項很具挑戰性的任務,因而應該盡可能地使用“索引微調向導”。

如果存在許多索引視圖可供查詢優化器考慮用于特定查詢,查詢優化成本會顯著增加。查詢優化器可能考慮為查詢中表的任意子集定義的所有索引視圖。拒絕每一個視圖之前,必須對它進行語法分析,然后研究其是否可能成為潛在的替換體。這可能需要一些時間,尤其是在有數百個此類的視圖用于給定的查詢時。

視圖必須符合幾項要求,您才能為其創建唯一的群集索引。在設計階段,請考慮以下要求:

視圖以及視圖中引用的所有表都必須在同一數據庫中,并具有同一個所有者。

索引視圖無需包含要供優化器使用的查詢中引用的所有表。

必須先為視圖創建唯一群集索引,然后才可以創建其它索引。

創建基表、視圖和索引以及修改基表和視圖中的數據時,必須正確設置某些 SET 選項(在本文檔的后文中討論)。另外,如果這些 SET 選項正確,查詢優化器將不考慮索引視圖。

視圖必須使用架構綁定創建,視圖中引用的任何用戶定義的函數必須使用 SCHEMABINDING 選項創建。

另外,還要求有一定的磁盤空間來存放由索引視圖定義的數據。

設計準則

設計索引視圖時,請考慮以下準則:

設計的索引視圖必須能用于多個查詢或多個計算。

例如,包含某列的 SUM 和某列的 COUNT_BIG 的索引視圖可用于包含函數 SUM、COUNT、COUNT_BIG 或 AVG 的查詢。由于只需檢索視圖中的少數幾行,而不是基表中的所有行,且執行 AVG 函數要求的部分計算已經完成,所以查詢將比較快。

使索引保持緊湊。

通過使用最少的列數和盡可能少的字節數,優化器在查找行數據時可獲得最高的效率。相反,如果定義了大的群集索引關鍵字,則為視圖定義的任何輔助性非群集索引都將明顯增大,這是因為非群集索引項除包含索引定義的列之外,還將包含群集關鍵字。

考慮生成的索引視圖的大小。

在單純的聚合情況下,如果索引視圖的大小類似于原表的大小,使用索引視圖可能無法明顯提高任何性能。

設計多個較小的索引視圖來加快部分進程的速度。

有時可能無法設計出能滿足整個查詢需要的索引視圖。此時即可考慮創建這樣一些索引視圖,每個索引視圖執行一部分查詢。

考慮以下示例:

經常執行的查詢會聚合一個數據庫中的數據,再聚合另一個數據庫中的數據,然后聯接結果。由于索引視圖不能引用多個數據庫中的表,所以您不能設計一個視圖來執行整個進程。不過,可以為要進行聚合的每個數據庫創建索引視圖。如果優化器能夠將索引視圖與現有查詢相匹配,至少聚合處理將會因為不必記錄現有查詢而提高速度。盡管聯接處理不會加快,整個查詢的速度卻因使用了存儲在索引視圖中的聚合而加快。

經常執行的查詢會聚合多個表中的數據,然后使用 UNION 來將結果結合起來。UNION 不允許在索引視圖中使用。您可以設計一些視圖來執行每個單獨的聚合運算。然后優化器可以選擇索引視圖來加快查詢的速度,而無需記錄查詢。盡管 UNION 處理沒有改進,單個聚合進程卻得以改進。

使用“索引微調向導”

“索引微調向導”除建議使用基表的索引之外,還建議使用索引視圖。使用該向導可提高管理員確定索引和索引視圖相結合的能力,從而優化針對數據庫執行的典型混合查詢的性能。

由于“索引微調向導”強制使用所有必需的 SET 選項(以確保結果集的正確性),其索引視圖將會成功創建。不過,如果您的應用程序的選項沒有按照要求設置,可能無法利用這些視圖。對那些參與索引視圖定義的表執行的插入、更新或刪除操作可能會失敗。

維護索引視圖

SQL Server 自動維護索引視圖,這與維護任何其它索引的情況類似。對于普通索引而言,每個索引都直接連接到單個表。通過對基礎表執行每個 INSERT、UPDATE 或 DELETE 操作,索引相應地進行了更新,以便使存儲在該索引中的值始終與表一致。

索引視圖的維護與此類似。不過,如果視圖引用了多個表,則對這些表中的任何一個進行更新都需要更新索引視圖。與普通索引不同的是,對任何一個參與的表執行一次行插入操作都可能導致在索引視圖中進行多次行插入操作。更新和刪除操作的情況也是如此。因此,較之于維護表的索引,維護索引視圖的代價更為高昂。

在 SQL Server 2000 中,某些視圖可以更新。如果某個視圖可以更新,則使用 INSERT、UPDATE 和 DELETE 語句可通過該視圖直接修改根本基表。為某個視圖創建索引并不會妨礙該視圖的更新。有關可更新視圖的詳細信息,請參閱關于 SQL Server 2000 的“SQL Server 聯機圖書”中的“通過視圖修改數據(英文)”。

維護成本的考慮因素

設計索引視圖時應該考慮以下幾點:

數據庫中需要有一個額外的存儲空間用于索引視圖。索引視圖的結果集以類似于典型表存儲空間的方式物理保存在數據庫中。

SQL Server 自動維護視圖。因此,對定義視圖所據的基表的任何更改都可能引起視圖索引的一處或多處更改,從而導致維護開銷的增加。

一個視圖獲得的凈性能提高就是視圖提供的查詢執行節約總計與存儲和維護該視圖耗費的成本之間的差。

估計視圖將占用的所需存儲空間要相對簡單一些。用 SQL 查詢分析器的“顯示估計的執行計劃”工具求視圖定義中 SELECT 語句的值。該工具將得出查詢返回的行數和行大小的近似值。將這兩個值相乘,即可估計出視圖的可能大小。不過這只是一個近似值。視圖索引的實際大小只能通過創建視圖索引來精確得出。

從 SQL Server 執行的自動維護考慮因素的觀點出發,“顯示估計的執行計劃”的功能可能會對此開銷的影響有所了解。如果用 SQL 查詢分析器評估修改視圖的語句(針對視圖的 UPDATE 語句、針對基表的 INSERT 語句),SHOWPLAN 將包括該語句的維護操作。同時考慮此成本和此操作將在生產環境中發生的次數,可以指示視圖維護的可能成本。

通常建議對視圖或基表進行的任何修改和更新都應該盡可能地成批執行,而不要單獨進行。這樣可以減少視圖維護的某些開銷。

創建索引視圖

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

確保將在視圖中引用的所有現有表的 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 操作。

查詢優化器使用索引視圖來生成查詢計劃。

如果使用的是 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 排序運算符。

添加包括 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) 聚合,因此不會被第二個查詢使用。可以創建另一個可以同時滿足上述兩個查詢的索引視圖。

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 新聞組,其站點是:news://news.microsoft.com(英文)。

關于 SQL Server 的 Microsoft 正式課程。有關最新的課程信息,請參閱 Microsoft 培訓和服務站點(英文)。

來源:月光博客


Public @ 2009-04-05 15:47:53

什么是IDC,新手站長如何選擇IDC商

IDC是指互聯網數據中心(Internet Data Center),是提供互聯網基礎設施、硬件、網絡、安全系統等技術支持的專業服務提供商。 選擇IDC商需要考慮以下幾點: 1. 服務質量:要選擇有高可靠性、高帶寬、高速率等各項服務保障的服務商。 2. 價格:應該詢問詳細的價格方案,包括相關的費用、域名、存儲等。 3. 安全性:安全問題在IDC行業中尤為關鍵,選擇IDC商需要查看其提供的安

Public @ 2023-06-20 20:50:18

六個步驟搞定更換網站服務器

最近又不少站長朋友發帖咨詢說要更換網站的服務器了,但是怕誤操作導致網站被K,因為已經有不少的站長朋友來反饋,說自己因為換了IP導致網站被K了。那么今天百度站長平臺新人訓練營版主EVER非你不愛就來跟大家談一下,如何更換網站服務器,換IP,把損失降低到最低,現在我們通過對織夢網站的舉例,來進一步的操作!一、備份您的網站首先要做的是將我們的網站進行數據庫的打包,對于織夢系統的網站來說,只需要在后臺選擇

Public @ 2022-09-09 15:49:35

SQL Server 2005數據庫修改sa密碼的方法

在 SQL Server 2005 中修改 sa 賬戶的密碼,可以通過以下步驟完成: 1. 以系統管理員身份登錄 SQL Server 2005 數據庫。 2. 在“對象資源管理器”中展開“安全性”節點,找到“登錄名”節點。 3. 右鍵單擊“sa”賬戶,選擇“屬性”。 4. 在“一般”標簽頁中,修改“密碼”字段,輸入新密碼。 5. 點擊“確定”按鈕保存修改。 以上就是在 SQL Se

Public @ 2023-06-22 09:00:11

如何避免ASP的SQL的執行效率低

要避免ASP SQL的執行效率低,可以采取以下措施: 1. 編寫高效的SQL查詢語句:優化SQL查詢語句,避免重復查詢,使用合適的索引和限制查詢結果的數量等,可以提高執行效率。 2. 優化數據庫設計:設計良好的數據庫結構,包括合適的表結構、索引、關系等,可以提高查詢效率。 3. 使用緩存:將查詢結果緩存起來,避免頻繁的查詢數據庫,提高響應速度。 4. 使用合適的數據訪問技術:考慮使用存儲過程、視

Public @ 2023-07-31 11:00:25

更多您感興趣的搜索

0.526169s
亚洲精品一区二区三区99| 含羞草www国产在线视频| 日韩精品免费在线视频| 亚洲大胆人体视频| 国产亚洲精品久久久| 亚洲天天在线日亚洲洲精| 亚洲美女久久久| 一区二区三区回区在观看免费视频| 一区二区在线视频| 久久91精品国产91久久跳| 91精品国产91久久久久久不卡| 欧美夜福利tv在线| 快色在线观看| 日本大臀精品| 少女频道在线观看高清 | 最新精品视频在线| 国产青青草在线| 日本天码aⅴ片在线电影网站| 久热在线观看视频| 在线日韩成人| 水蜜桃精品av一区二区| 在线成人亚洲| 福利视频网站一区二区三区| 国产欧美一区二区在线| 亚洲国产精品欧美一二99| 欧美视频在线一区二区三区| 精品久久久久久无| 成人444kkkk在线观看| 国产精品极品美女在线观看免费| 91成人福利在线观看| 麻豆传媒在线免费| 精品久久免费| 欧美+亚洲+精品+三区| 美女视频一区二区三区| 久久久久久久久99精品| 欧美日韩精品在线视频| 亚洲精品美女网站| 热久久这里只有| 国产黄色片在线观看| 婷婷综合六月| 日韩av免费大片| 久草精品在线观看| 一区二区三区精品| 亚洲国产私拍精品国模在线观看| 久久久久久中文字幕| 中文资源在线网| av有声小说一区二区三区| 欧美三级美国一级| 国产成人综合精品三级| 精品久久久久久亚洲国产300 | 欧美美女搞黄| 亚洲三级电影| 亚洲在线日韩| 亚洲欧美在线视频观看| 欧美不卡激情三级在线观看| 久久久久久久久久久人体| 三级理论午夜在线观看| 成人亚洲视频| 亚洲三级国产| 曰韩精品一区二区| 亚洲欧洲偷拍精品| 欧美黑人孕妇孕交| 日本一区免费网站| 欧美视频久久| 国产精品久久网站| 亚洲系列中文字幕| 中文字幕在线永久在线视频| 亚洲第一会所| 毛片一区二区| 岛国视频午夜一区免费在线观看 | 欧美大胆在线视频| 69av在线| 国产欧美日韩精品一区二区三区| 国产精品主播直播| 精品婷婷伊人一区三区三| 欧美一区二区.| 大香伊人中文字幕精品| 午夜精品免费| 尤物av一区二区| 成年无码av片在线| 欧美videossex| 亚洲福利精品| 红桃av永久久久| 国语自产在线不卡| 性孕妇free特大另类| 一本久道久久久| 亚洲成a人片综合在线| 久久五月天色综合| 影院在线观看全集免费观看| 婷婷成人综合| 国产日韩欧美在线一区| 在线日韩第一页| 超鹏97在线| 中国成人一区| 精品久久久久久中文字幕一区奶水| 九九九热精品免费视频观看网站| 在线不卡日本v二区707| 在线播放日韩| 91国在线观看| 独立日3在线观看完整版| 2023国产精华国产精品| 91丨porny丨户外露出| 在线观看亚洲视频| xxxx成人| 蜜桃视频免费观看一区| 欧美成人免费网站| 国产精品99999| 国产精品日韩| 日韩美女一区二区三区四区| 国内三级在线观看| 99在线热播精品免费99热| 欧美日韩视频专区在线播放| 97在线观看免费高清视频| 水蜜桃久久夜色精品一区| 精品久久在线播放| 在线观看av片| 最新日韩av| 亚洲国产精品嫩草影院久久| 久久精品视频观看| 看片的网站亚洲| 一本大道亚洲视频| 欧美www.| 国产精品美女视频| 国产精品男女猛烈高潮激情| 亚洲另类av| 色哟哟一区二区在线观看| 亚洲超碰在线| 免费亚洲婷婷| 国产丝袜一区二区三区免费视频| √天堂8资源中文在线| 成人黄页在线观看| 国内精品视频在线| 另类图片第一页| 欧美性69xxxx肥| 污污网站在线| 奇米一区二区三区av| 国产一区二区三区视频免费| 丁香久久综合| 又紧又大又爽精品一区二区| 成人精品aaaa网站| 欧美精品午夜| 亚洲精品456在线播放狼人| 美女网站在线看| 亚洲国产成人在线| 国产一级二级在线| 一区二区毛片| 色吧影院999| 日本成人精品| 日本韩国欧美一区二区三区| 国产一级在线| 99久久综合国产精品| 国产成人精品一区二区在线| 97视频热人人精品免费| 亚洲国产美女精品久久久久∴| 欧美一级大片| 亚洲一区免费观看| 日本最黄一级片免费在线| 国产成人免费在线观看不卡| 国产91在线播放| 黄色免费成人| 中文字幕亚洲一区| 日韩av网站在线免费观看| 日韩午夜激情av| 成人国产精品入口免费视频| 亚洲乱码中文字幕| 日本美女在线中文版| 97超碰欧美中文字幕| 一级片免费看| 国产精一品亚洲二区在线视频| 国产精品啪视频| 日韩国产成人精品| 国产极品精品在线观看| 午夜综合激情| 青青在线视频一区二区三区| 国语自产精品视频在线看8查询8| 中文字幕亚洲欧美日韩在线不卡 | 国产精品九色蝌蚪自拍| 伊人网站在线| 91丨porny丨国产| 中文字幕一区二区三区免费视频| 麻豆一区二区在线| 成人黄色大片在线免费观看| 免费精品视频在线| 99在线欧洲视频| 国产成人午夜电影网| 探花国产精品| kk眼镜猥琐国模调教系列一区二区 | 豆花视频一区二区| 日韩免费视频一区| 99久久香蕉| 亚洲毛片在线免费观看| 久久99国产成人小视频| 国产亚洲人成a一在线v站| 欧美色蜜桃97| 国产69精品久久久久9| 久久亚洲综合| 好吊的妞视频这里都有| 成年人网站91| 欧美jizz18性欧美| 欧美日韩国产中文精品字幕自在自线|