2008-09-02 11 views
9

Microsoft SQL Server 2005データベースビューを使用して何百ものCrystal Reportsレポートを生成することはめったにありません(毎月/四半期)。これらのビューは、私がそれらから読んでいないすべての時間中にCPUサイクルとRAMを無駄にしていますか?私はめったに私の意見から読んで以来、私は代わりにストアドプロシージャ、一時テーブル、または短命の通常のテーブルを使用する必要がありますか?多くのデータベースビューを作成できますか?

私はDBAではないので、データベースサーバーの内部で何が起こっているのか分かりません。

データベースビューが多すぎる可能性はありますか?ベストプラクティスとは何ですか?

答えて

8

大部分は問題ではありません。はい、SQL ServerはSELECT * FROMテーブル(システムカタログで 'table'を調べる必要があります)を解析するときに選択肢が増えますが、そのために高度に最適化されていて、十分なRAMがあれば(現在、 0〜1,000ビューの違いに気付かないでしょう。

しかし、人々の視点から見ると、何百ものビューが何をしているのかを把握し、把握しようとするのはおそらく不可能なので、おそらく多くのコードが重複している可能性があります。これらの重複したビューに埋め込まれているビジネスルールが変更されるとどうなりますか?

ビジネス・ロジックを擬似表にカプセル化することが主な視点です(person表があるかもしれませんが、次に「active_persons」というビューがあります)。レポートごとにビューを作成することは、各レポートが非常に孤立してユニークでない限り、再利用する能力がない場合は馬鹿なりょうです。

1

ビューは、呼び出されたときにのみCPU /メモリーリソースを占有します。

いずれにせよ、統合可能なものを統合し、削除可能なものを削除することがベストプラクティスです。文字通りレポートでのみ使用される場合は、ビューの一貫した名前付け基準を選択して、特定のビューについては、

また、トランザクション分離が本当に必要でない限り、クエリでNOLOCKテーブルヒントを使用することを検討してください。

- ケビン・フェアチャイルド

+0

私は答えに同意しますが、NOLOCKの提案では同意しません。私はNOLOCKをどこにでも置いている人がたくさんいるのを見て、なぜ彼らが一貫性の問題を抱えているのか疑問に思います。そのような節はその用途を持っていますが、ほとんどの場合、虐待されています。 READ_COMMITTED_SNAPSHOTを使用すると、ロックを避けることができます。 – Diego

+0

@Diego、* anything *は悪用することができます;)しかし、単純なクエリの場合、特に汚い読みに絶対に気を配らないと、人々がそれを出すほど悪くはありません。ああ、StackOverflowはたくさんのクエリでもStackOverflowを使っています。 http://www.codinghorror.com/blog/2008/08/deadlocked.htmlとhttp://stackoverflow.com/a/1453087/3743を参照してください。その日の終わりには、それは判断の呼び出しです。あなたのデータと、あなたが作る可能性のあるトレードオフに基づいている必要があります。 –

+0

それは本当です、それはあまりにも多くの人々が彼らが書いた貧しいクエリを仕事にする聖杯としてNOLOCKを見ているだけです。多くの開発者はSQLを気にかけない、好きではない、あるいは単純にcr.pであることを知りません。 NOLOCKは、コードレビューと大量のリファクタリングに比べて簡単なエスケープルートのようです。私はNOLOCKS上に完全に構​​築されたシステムを維持しなければならなかった、単一のものを取り除くことはそれをクラッシュさせるだろう。それは非常に悪かったので、私は毎日開発者と議論していたので、彼らは "NOLOCK崇拝者"でした。私は「疑わしい場合は使用しないでください。確かな場合は使用しないでください」と言います。 :) – Diego

1

ビューでは、プリセットパラメータで頻繁に実行クエリです。同じデータを常に見ていることがわかっている場合は、使いやすさとデータバインディングのためのビューを作成できます。

つまり、ビューから選択すると、実行しているクエリとともにビュー定義クエリが実行されます。

例えば、vwCustomersWhoHavePaidがある場合:

Select * from vwCustomersWhoHavePaid where datepaid > '08/01/08' 

あなたが実際にあるクエリ:あなたはリターンを実行している

Select * from customers where paid = 1 

、クエリ8月以降支払った顧客は、最初にこのようにフォーマットされます実行中:

Select * from (Select * from customers where paid = 1) where datepaid > '08/01/08' 

これはあなたが保持する必要がありますビューを作成する際は、頻繁に見るデータを格納する方法です。これは、データを整理してアクセスするのが単なる方法です。

1

あなたは次のように質問します。舞台裏では何が起こっていますか?

ビューはSQLテキストの束です。クエリでビューが使用されると、SQL ServerはそのSQLテキストをクエリに配置します。これは最適化の前に発生します。結果として、オプティマイザは、最良の実行計画のために2つの別々のコード片ではなく、組み合わされたコードを考慮することができます。

クエリの実行計画を見てください。そこには学ぶほどのことがあります。

SQL Serverには、というクラスタ化ビューという概念もあります。 A クラスタビューは、システム管理の結果セットです(基になるテーブルの各挿入/更新/削除により、クラスタビューのデータに挿入/更新/削除が発生する可能性があります)。ビューは、というクラスタリングビューが動作するように動作すると考えるのはよくある間違いです。

関連する問題