2009-06-22 72 views
2

我試圖從一個相當複雜的選擇查詢創建一個視圖,它不會讓我把一個聚集索引,因爲我必須使用子查詢和一些聚合函數。在視圖上的sql server聚集索引

我必須得到一個聚集索引,否則使用該視圖的查詢將永遠。顯然sql服務器將只存儲結果集,如果你遇到了一個愚蠢的標準數量。

該視圖的基表是隻讀的,並且每天只能通過批量導入進行更新。我看不出爲什麼結果不能被緩存。

有誰知道任何方式讓sql server來緩存視圖的結果,以便他們可以反過來查詢?我真的不想創建另一個表,因爲它會雪球到處都是一堆變化。

在此先感謝。

+1

請發佈全部樣本 – 2009-06-22 06:36:29

+4

考慮到您的表格每天只更新一次,如何每天填充表格一次,並將查詢結果從雪球轉換爲比視圖更多的更改? – 2009-06-22 06:58:15

+0

發佈一個真實的例子,我確定有人會給你一個可行的解決方案。有一些選項,如計算列可以解決您的問題 – 2009-06-22 12:08:44

回答

3

我認爲您正在尋找的答案是: 請勿使用視圖來執行此操作。 使用一個表格,其中的字段對應於sql查詢返回的字段。 自動化查詢來填充此表

1

簡而言之,由於您提到的原因,無法創建聚集索引。

當您要求一種方法來緩存複雜查詢的結果時,SQL Server提供的並且將解決您的問題的唯一其他對象是一張表。

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

如果您使用SSIS(SQL Server集成服務),這是一個相對微不足道的事情來添加。

+0

感謝的人,更多信息在下面的評論 – andrej351 2009-06-23 00:40:59

1

據我所知,在編譯執行計劃時,SQL Server實質上是將視圖的定義複製並粘貼到查詢的編譯中 - 只要您能夠將索引添加到基礎表中,它應該是可能的從查詢中獲得良好的性能。

+0

我沒有看到任何理由downvote這一點。使用問題中提供的信息,無法知道底層表是否已正確索引。 – 2009-06-22 09:39:06

1

您正在建造的東西聽起來像是數據倉庫,因此您最好的選擇是在數據進入系統後對其進行操作。您可以構建新的非規範化表(或者您正在修改它)並將它們編入索引以允許快速查詢。

如果需要,您可以在這些表格的頂部創建視圖。

0

我有同樣的問題,並最終將子查詢放入聚集索引視圖本身。

1

使用你需要使用COUNT_BIG(),而不是COUNT一個索引視圖中聚集時(),否則該視圖將不會被創建

此外,如果你不是企業版,您需要提供NOEXPAND提示否則優化器將不使用的視圖

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

也許你並不需要一個視圖,但你就是沒有個表上正確的索引,你可以張貼表(包括索引和約束的DDL )