2011-10-25 34 views
1

我有一個數據庫,我正在運行大型查詢,我想用視圖進行簡化。雖然有更多的人,這些表基本上是這樣的(僞代碼):SQL Server視圖設計

TABLE document (
Id int PRIMARY KEY, 
    /*more metadata columns*/ 
) 

TABLE name (
    Id int PRIMARY KEY, 
    documentId int FOREIGN KEY REFERENCES document.Id, 
    date DATETIME, 
    text varchar(MAX) 
) 

TABLE description (
    Id int PRIMARY KEY, 
    documentId int FOREIGN KEY REFERENCES document.Id, 
    date DATETIME, 
    text varchar(MAX) 
) 

這樣的想法是,「文檔」表包含有關關係的其餘部分的文檔和標識的基本信息表格到文檔。所有其他表格都是針對可更新文檔的各個屬性。每個更新都有一個帶有時間戳的行。我希望視圖拉的是每個文檔一行,每個文檔包含其他表中包含的每個屬性的最新版本(如果需要進一步闡述或示例,請讓我知道,我將提供)。什麼是我可以把它取消的最不可思議的方式?使用SQL Server 2008.

+0

@marc_s,我很感激您花時間編輯我的文章,但我不認爲將標題從「SQL視圖設計」更改爲「SQL Server視圖設計」是有保證的。這個問題的解決方案很可能與平臺無關,因此對於那些使用微軟以外的數據庫軟件的人來說是有用的。 – joelmdev

+1

如果你想要一個快速,高效的視圖,那麼沒有便攜式解決方案。 「SQL Server」的事實非常重要:這將是醜陋的,因爲在MySQL中犯罪,例如 – gbn

+0

請原諒我對MySql的無知,但是沒有物化視圖會爲類似代碼帶來類似的性能提升嗎? – joelmdev

回答

2

你可以使用一個CTE爲每個屬性視圖內返回最新的屬性值的documentid,像這樣:

; WITH cName AS 
(SELECT * 
FROM (SELECT ID, documentID, 
     date, text, 
     ranking = ROW_NUMBER() OVER (PARTITION BY documentID ORDER BY date DESC) 
     FROM name) x 
WHERE ranking = 1), 
.... [more CTE's here] 
SELECT columnlist 
FROM document d JOIN cName cn ON d.id=cn.documentid 
4

視圖不會提高效率。視圖只是一個擴展的宏。

視圖中沒有魔法:但如果您加入此視圖,則會受到影響,因爲擴展後的查詢可能會變得很龐大。

您可以將視圖編入索引,但這些視圖對於企業版來說效果最佳,除非您想要全部使用NOEXPAND提示。

也就是說,查詢非常簡單:除非您想在有限制的情況下爲視圖編制索引。

根據Stuart Ainsworth的方法,一種方法是CTE。另一個是我描述的「每組最多一個」方法here on dba.se。這些都不是安全的indexed views.

+0

對不起,應該指定索引視圖。更新原始帖子,所以我不會在這一點上反覆抨擊。 – joelmdev

+0

你能詳細解釋一下你在這個答案中提出的最後一點嗎?即「......除非你想在有限制時爲視圖編制索引」,以及「這些對索引視圖都不安全」。 – joelmdev