2016-11-04 25 views
0

は、図hereで行く:私は、列1および3SQL Serverのインデックス - 列の順序

に困惑している私は、データウェアハウスのテーブルに取り組んでいますし、あなたを取得するキーとして使用されている2つの列があります主キー

最初の列はソースシステムです。 3つの可能な値があります。IBM、SQL、ORACLEと言うことができます。次に、複合キーの第2の部分は、数値またはvarcharのできるトランザクションIDです。 3列目はありません。レコードがロードされるときにIdentity(1,1)によって生成される鍵となる秘密鍵以外。だから、下のグラフに私は、クエリ

Select a.Patient, 
     b.Source System, 
     b.TransactionID 
from Patient A 
right join Transactions B 
    on A.sourceSystem = B.sourceSystem and 
     a.transactionID = B.transactionID 
where SourceSystem = "SQL" 

に渡した場合、グラフは、インデックス内のカラム1がSourceSystemに設定されるべきであると考えるように私をリード想像してみてください。以来、すぐにドリルダウンして、次のレベルのインデックスに3分の1になります。しかし、このグラフを同僚に示すと、列1はトランザクションIDになり、列2はソースシステムとして解釈されます。

Colsは

1 2 3 
------------- 
| | 1 | | 
| A |---| | 
| | 2 | | 
|---|---| | 
| | | | 
| | 1 | 9 | 
| B | | | 
| |---| | 
| | 2 | | 
| |---| | 
| | 3 | | 
|---|---| | 
+0

データベースの設計やパフォーマンスについて質問していますか? –

+0

クエリは実行されません。あいまいな列名エラーが発生します。 –

+0

質問は本当にです:私は最も選択的な列を最初または最後に置くべきですか(google that!)。それの多くは次のようなものです:Col1またはCol2を最も頻繁に使用するクエリはありますか?言い換えれば、他のクエリのインデックスはどのように再利用可能かです。 –

答えて

0

まず、あなたは、クエリ内のすべての列名を修飾する必要があります。第2に、left joinは通常right joinより意味があります(セマンティクスはすべての列を最初のテーブルに保持します)。最後に、適切な外部キーの関係がある場合は、外部結合はまったく必要ありません。

はのは、このクエリを考えてみましょう:

Select p.Patient, t.Source System, t.TransactionID 
from Patient p join 
    Transactions t 
    on t.sourceSystem = p.sourceSystem and 
     t.transactionID = p.transactionID 
where t.SourceSystem = 'SQL'; 

このクエリの正しいインデックスがTransactions(SourceSystem, TransactionId)です。

注:

  • 外は、インデックスの選択に影響を与える合流。基本的には、いずれかのテーブルをスキャンしなければならない場合、インデックスはそれほど役に立たないかもしれません。
  • t.SourceSystem = 'SQL'p.SourceSystem = 'SQL'はおそらく最適化が異なります。
  • 患者は本当にトランザクションIDを持っていますか?それは奇妙に思える。
+0

クエリーは、カーディナリティーを示すための大まかな例でした。ソースシステムでは、100万のユニークなトランザクションIDを持つ3つのユニークな値が高いカーディナリティー列に結びついています。ゴードンの言うところによると、ソースシステムは最も選択的な列で、インデックスの最初の列にする必要があります。 –

関連する問題