簡體   English   中英

視圖上的SQL Server聚集索引

[英]sql server clustered index on a view

我試圖從一個非常復雜的選擇查詢中創建一個視圖,它不會讓我在上面放一個聚簇索引,因為我必須使用子查詢和一些聚合函數。

我必須在上面獲得聚簇索引,否則使用該視圖的查詢將永遠花費。 顯然,如果您滿足愚蠢的條件,sql server將僅存儲結果集。

該視圖的基本表是只讀的,並且每天僅通過一次批量導入進行更新。 我看不到為什么無法緩存結果。

有誰知道以任何方式使sql server緩存視圖結果,以便以后可以查詢? 我真的不想創建另一個表cos,該表cosball會在整個地方滾雪球般變成一堆變化。

提前致謝。

我認為您正在尋找的答案是:不要使用視圖來執行此操作。 使用具有與sql查詢返回的字段相對應的字段的表。 自動查詢以填充此表

簡短的答案是,由於您提到的原因,無法創建聚集索引。

當您請求一種方法來緩存復雜查詢的結果時,SQL Server提供的唯一另一個對象(將解決您的問題)是一個表。

如果自動化存在問題,則應考慮創建視圖,但僅應將其用作插入表的方式,以便您可以在批量插入后立即將表截斷/插入表中(從視圖中選擇)。

如果使用SSIS(SQL Server集成服務),這是一件相對瑣碎的事情。

據我所知,在編譯執行計划時,SQL Server本質上會將視圖的定義復制並粘貼到其編譯查詢中-只要您能夠向基礎表中添加索引,就應該可以獲得良好的性能。從查詢中。

您所構建的內容聽起來像是數據倉庫,因此,最好的選擇是一旦將數據放入系統中就對其進行操作。 您可以構建新的非規范化表(或進行其他修改),並對它們建立索引以允許快速查詢。

然后,您可以根據需要在這些表的頂部構建視圖。

在索引視圖中使用聚合時,您需要使用COUNT_BIG()而不是COUNT(),否則將不會創建該視圖

另外,如果您不在企業版上,則需要提供NOEXPAND提示,否則優化器將不會使用該視圖

SELECT *
FROM YourView WITH(NOEXPAND)
WHERE ....

也許您不需要視圖,但是在表上沒有正確的索引,是否可以發布表的DDL(包括索引和約束)

我遇到了同樣的問題,最終將子查詢本身放在了聚集索引視圖中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM