2011-07-01 13 views
0

私のテーブルの束に基本的なSQL-VIEWを形成するのに助けが必要です。ここでは簡単な概要が..私はClaimDetailテーブルをきたし、それはなどStatusID、BrandID、SalespersonID、のようないくつかのルックアップフィールドを持っているSQLビュー、パフォーマンス、および1対多の関係からのカウント

  • だいつものよう
  • 、ルックアップフィールドはmasterStatusの、MasterBrandのようなテーブルをマスターするマップ、... {構造:ID、Title}
  • また、2つの他の表のコメントとファイルがあります。クレームは複数のコメントと複数のファイルを持つことができます。
  • クレームのリストになるダッシュボードを表示する必要があります。私はマスターテーブルからのタイトルとコメント&ファイルの数を表示する必要があります。

このダッシュボードは、特定の詳細に限定されたCustomerタイプのユーザーと、内部ユーザー向けの詳細なビューの2つのビューがあります。顧客ビューは内部ビューのサブセットであると言えます。と は両方 ユーザーのデータをフェッチするためにそれを使用単一vw_Internalビューを作成します。

  1. オプト#1 -

    は、私は2つのオプションを参照してください。 #2オプト

  2. :vw_Customer INNERが マスターテーブルのJOIN:私は、私は のようなになりますvw_Internalを作成 がお客様のために必要とされるこれらのフィールドをonltと たvw_Customer を作成します。要するに、 の基本vw_Customerを拡張して、 個のフィールドを追加します。

オプション2はスピードとパフォーマンスの観点から理にかなっていますか?オプト#1はシンプルですが、膨大な数のレコードを考慮して、ダッシュボードに含まれない余分なルックアップを少しでも待つ必要はありません。

最後に、私が言及した最後の機能のための方法はありますか?つまり、は、ClaimDetailテーブルと1対多の関係を持つコメントとファイルの数を取得しています。私はちょうどクレームが任意のコメントを持っているかどうかを示すブール値フィールドまたはatleastが必要です(ファイルと同じです) - カウントが0の場合はfalseとなります。この機能によるパフォーマンスへの影響も懸念しています。

ありがとうございます。

答えて

1

ビューの定義に関しては、2つのビューを作成して、それらを別々にしています。どちらのビューもどちらのビューも参照しません。これにより、クエリを独立して最適化できるようになり、ビューの上にレイヤーを重ねると問題が発生することがなくなります。レイヤーが多すぎると、データベースの管理、保守、リファクタリングが特に困難になります。

データ集約については、共通の戦術には以下のものがあります。、コントラスト、テストを比較し、ご使用の環境に最もよく合うものを見るために外挿し:

サブクエリ

SELECT mt.Id, st1.HowMany, st2.HowManyOther, <etc> 
from MainTable mt 
    inner join (select Id, count(*) HowMany 
       from SubTable1 
       group by Id) st1 
    on st1.Id = mt.Id 
    inner join (select Id, count(*) HowMany 
       from SubTable2 
       group by Id) st2 
    on st2.Id = mt.Id 

はかなり簡単、サブクエリは一種のコストがかかるかもしれませんけれども、でも、適切なインデックスで。

数(個別のxxは)

SELECT mt.Id, count(distinct st1.UniqueKey) HowMany, count(distinct st2.UniqueKey) HowManyOther, <etc> 
from MainTable mt 
    inner join SubTable1 st1 
    on st1.Id = mt.Id 
    inner join SubTable2 
    on st2.Id = mt.Id 

これは「サブテーブル」内の単一のユニークなコラムを必要とし、あなたが外部結合またはNULLで対処する必要があれば厄介取得します。


追加


まず、あなたは、カウントを確認するように、内側を交換すると(左)、外側は長い間、サブテーブルから0+カウントを生成します上記のクエリのいずれかに参加して合流(NULLが集計されないため)「正しい」テーブルで処理が行われています。あなたの環境でどちらが最適かを理解するには、両方のクエリを作成してテストする必要があります。私は2番目を推測したいと思います。なぜなら、最初のクエリではサブクエリのテーブルでテーブルスキャンが必要なのに対し、2番目のクエリでは結合が行われるため最適化が向上しますがSQLクエリオプティマイザは私よりもスマートです(インデックスを知っていて、あなたのデータ)を表示したいのです。

「階層化ビュー」に関して、私が論理権を守っているなら、複雑な/包括的なクエリ(すべての結合、すべての関連する列)として内部ビューを構築してから、うまくいけば簡単です

SELECT <customerOnlyColumns> 
from vw_Internal 
+0

ありがとうございます。メインビューとラッパービューを維持するという私の意図は、ロジックを2回複製する必要がないということでした。オプション#1またはオプト#2?パフォーマンスビューポイントと違いがあるかどうか教えてください。 –

+0

サブテーブルの数については、LEFT OUTER JOINパターンに続くものが必要です。> = 0のサブレコード(> = 1でない)があるかもしれないからです。私は両方のクエリが可能になることを願っています。 –

+0

私はKelleyの明確な説明の答えを受け入れるだろうし、他に誰も出てこなかったので:-) –