2011-10-25 4 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) 
) 

だから、アイデアは「文書」の表は、の残りの部分を結びつける文書とIDに関する基本的な情報が含まれていることですテーブルを文書に追加します。他のすべての表は、更新可能な文書の個々の属性用です。各更新は、タイムスタンプで独自の行を取得します。私が見たいと思っているのは、ドキュメントごとに1つの行で、各属性の最新のバージョンが他のテーブルに入っています(これ以上の詳細化や例が必要な場合は、私に知らせてください)。私はこれを取り除くことができる最も複雑な方法は何ですか? SQL Server 2008の使用。

+0

@marc_s私はあなたの投稿を編集することに感謝しますが、タイトルを「SQL View design」から「SQL Server view design」に変更するとは信じられません。この問題の解決策はプラットフォームに依存しないものであり、Microsoft以外のデータベースソフトウェアを使用している人にとっては非常に便利です。 – joelmdev

+1

高速で効率的なビューが必要な場合は、ポータブルなソリューションはありません。 "SQL Server"の事実は非常に重要です:これはMySQLの罪のように醜いです。例えば、 – gbn

+0

MySqlの私の無知のために私を許しますが、マテリアライズドビューは同様のコードで同様のパフォーマンスを得ることはできませんか? – joelmdev

答えて

2

; 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 
0

SQL Server 2008は、インデックスの計算列をサポートしています。したがって、そのdocument_idの最新の時間を持つ行に対して、 "is_latest"という列を1に設定することができます。今は、あなたがis_latest列を使用することができますクエリをすると、はるかに速くなります。参照してください - そうのようにあなたは、文書IDの最新の属性値を返すために、ビュー内の各属性のCTEを使用することができhttp://msdn.microsoft.com/en-us/library/ms189292.aspx

4

ビューは、効率を高めることはありません。ビューは、拡大するマクロです。

ビューには魔法はありませんが、拡張クエリが大量になる可能性があるため、このビューに参加すると苦労することがあります。

ビューにインデックスを付けることはできますが、NOEXPANDヒントをすべて使用する場合を除き、Enterprise Editionで最も効果的です。

しかし、制限があるときにビューのインデックスを作成しない限り、クエリは非常に簡単です。

1つのアプローチは、Stuart AinsworthのアプローチによるCTEです。もう一つは、私がhere on dba.seと書いた「グループごとの最大」アプローチです。これらのどちらも安全ではありませんindexed views.

+0

申し訳ありませんが、インデックス付きのビューを指定する必要があります。元の投稿を更新するので、私はその点を繰り返し打つことはありません。 – joelmdev

+0

この回答で最後に挙げたポイントについて詳しく説明できますか?つまり、「制限があるときにビューのインデックスを作成しない限り」、「どちらもインデックス付きビューに対しては安全ではありません。 – joelmdev

関連する問題