2016-11-04 122 views
0

走向圖here的:我在我的上表數據倉庫工作列1和3SQL Server索引 - 列順序

迷茫,但是也有一些作爲,讓你一鍵兩列主鍵。

第一列是源系統。有三種可能的值可以說IBM,SQL和ORACLE。然後組合鍵的第二部分是它可以是數字或varchar的事務ID。沒有第三欄。除了在記錄加載時將由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。因爲它會立即將鑽取分成第三級的下一級索引。但是,當向同事展示此圖時,他們將其解釋爲第1列是transactionID,第2列是源系統。

列數

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

你問你的數據庫設計還是關於性能? –

+0

您的查詢將不會執行。它會給出一個不明確的列名錯誤。 –

+0

問題是:我應該把最有選擇性的列首先或最後(谷歌!)。大部分內容歸結爲:其他查詢最多使用Col1還是Col2?換句話說,其他查詢的索引如何可重用。 –

回答

0

首先,你應該所有符合條件的列名在查詢中。其次,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

查詢只是一個粗略的例子來顯示基數。隨着源系統有3個獨特的價值觀綁定到一個高基數列與數百萬個獨特的交易ID。所以根據Gordon的說法,Source系統是最具選擇性的列,應該是索引中的第一列。 –