2013-10-01 68 views
0

所以我有這樣的表結構(簡體)索引視圖尋找空引用不INNER JOIN或子查詢

Create Table Transaction 
{ 
    TransactionId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    ReplacesTransactionId INT 
    .. 
    .. 
} 

所以我想創建一個索引視圖使得下面的例子將返回舊的數據庫只有第二個角色(因爲它取代了第一個)

Insert Into Transaction (TransactionId, ReplacesTransactionId, ..) Values (1,0 ..) 
Insert Into Transaction (TransactionId, ReplacesTransactionId, ..) Values (2,1 ..) 

有許多的創建這個查詢的方式,但我想創建一個索引視圖,這意味着我不能使用子查詢,左連接或節選。示例查詢(使用LEFT JOIN)可以。

SELECT trans1.* FROM Transaction trans1 
LEFT JOIN Transaction trans2 on trans1.TransactionId = trans2.ReplacesTransactionId 
Where trans2.TransacationId IS NULL 

很明顯,我堅持數據庫的結構,並希望提高使用數據的應用程序的性能。

有什麼建議嗎?

+0

如果遇到一個明智的查詢不符合索引視圖規則的問題,那麼很可能任何重新編寫查詢都會遇到相同規則或另一個同樣錯誤的規則。我看不到修復您所顯示的查詢。 –

回答

0

這裏的內容基本上是一個分層數據集,您要在該數據集中預先遍歷層次結構並將結果存儲在索引視圖中,但AFAIK索引視圖不支持這一點。

另一方面,對於改善性能的更大目標而言,這可能不是唯一的攻擊角度。首先,最明顯的問題是:我們可以假設TransactionId被聚集,ReplacesTransactionId被索引?如果沒有,那將是我的前兩個變化。如果索引已經很好,那麼下一步就是查看左連接的查詢計劃並查看是否有任何內容跳出。一般而言(沒有看到查詢計劃):一種可能的方法是嘗試將SELECT語句轉換爲「涵蓋查詢」(請參閱​​https://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/)。這很可能意味着一些組合:

  • 減少在SELECT語句中的列數(更換SELECT *)
  • 增加一些「包括」列上ReplacesTransactionId指數(無論是在SSMS,或者使用CREATE INDEX的INCLUDES子句)。

祝你好運!

+0

非常感謝您的幫助。我開始意識到,我試圖達到的目標可能是不可能的。很高興有其他人確認。 – user2834135

+0

我有一個後續的想法 - 即使你被困在結構中,你是否能夠創建一個額外的表?我想也許是這樣,因爲創建一個額外的視圖是一個選項。如果是這樣,請記住,「索引視圖」實際上只是一個內容自動管理的表格。因此,你可以通過創建一個輔助表(即使命名像一個視圖,如果你想),然後使用觸發器來自動填充它。有點類似的例子,請參閱http://stackoverflow.com/a/19101016/2824445 –