2012-09-18 347 views
0

我正在設計一個包含父 - 子關係中兩個表的模式。我關心的一個查詢是,子記錄將在父記錄的兩個字段中基於值重複查詢。用例涉及選擇父記錄中的字段等於1而另一個字段大於零的子記錄。 對於此用例,父記錄不需要任何信息。基於父記錄中的標記的子記錄索引?

一個月的數據工作包含約500,000個父記錄和約1,500,000個子記錄。有問題的用例可能會返回99%的子記錄。

有沒有什麼辦法可以在子表上設置一個基於父表中的critera字段的索引?我已經考慮過反規範化併爲子記錄添加了一些標準字段,但是我很小心這麼做。

回答

1

爲此,它聽起來像一個indexed view會讓你得到你想要的。

您將只能在子表中顯示視圖的顯示中包含列,而在加入父表時需要檢查列= 1。

解決方案的粗略例子可能看起來像下面這樣:

CREATE VIEW dbo.vwChildTableRestrictedByParentValues 
WITH SCHEMABINDING 
AS 
    SELECT ct.col1, ct.col2, ct.etc 
    FROM dbo.ChildTable AS ct 
    INNER JOIN dbo.ParentTable AS pt ON ct.ParentId = pt.ParentId 
    WHERE pt.OneField = 1 
     AND pt.AnotherField > 0; 

GO 

CREATE CLUSTERED INDEX IX_vwChildTableRestrictedByParentValues 
ON dbo.vwChildTableRestrictedByParentValues 
(
    Col1 ASC 
    , Col2 ASC 
    , etc ASC 
) 

凡索引包括要爲子表索引的列。

如果您沒有Enterprise Edition,則必須針對該視圖編寫查詢。如果您有Enterprise,則可以針對表格編寫查詢,但仍然使用您在此處創建的索引。