2013-02-13 70 views
0

索引我有如下創建視圖: -型適合視圖

CREATE VIEW [dbo].[vwNumberOfEditsForTimeSheets] 
AS 
SELECT TOP (100) PERCENT TimeSheetId, COUNT(TimeSheetId) AS NumberOfEdits 
FROM  dbo.TimeSheetLogs AS tsl 
WHERE (StatusId = 27) 
GROUP BY TimeSheetId 
ORDER BY TimeSheetId 

它可能有大約1,00,000條目現在將被約500個,每天增加1000個。

哪種類型的索引對此類視圖最適合?

感謝

+3

對於初學者來說,擺脫「TOP 100 PERCENT/ORDER BY」。優化程序簡化了查詢中無意義的部分,並且在沒有排序的情況下進行選擇時,它會對排序順序做出虛假承諾。 – 2013-02-13 19:20:13

+0

你對這種觀點有什麼樣的**詢問? – 2013-02-13 19:26:35

+0

@marc_s我使用select查詢來獲取指定時間表的所有記錄,並顯示它們被編輯的次數。 我有一個狀態部分在我的項目中,如果它被設置爲不活動我有一個不同的新條目,這是活動條目,這種方式可以有多個特定的TimeSheetId條目。 – user1960365 2013-02-13 19:33:01

回答

2

你可以在實際上使用索引視圖這裏

CREATE VIEW [dbo].[vwNumberOfEditsForTimeSheets] 
WITH SCHEMABINDING 
AS 
    SELECT TimeSheetId, 
     COUNT_BIG(*) AS NumberOfEdits 
    FROM dbo.TimeSheetLogs AS tsl 
    WHERE (StatusId = 27) 
    GROUP BY TimeSheetId 

GO 

CREATE UNIQUE CLUSTERED INDEX IX 
    ON [dbo].[vwNumberOfEditsForTimeSheets](TimeSheetId) 

版上依賴你可能需要使用NOEXPAND提示讓它使用。

如果你不想使用索引視圖,則最佳的指標在基表支持SELECT查詢是

CREATE NONCLUSTERED INDEX IX ON dbo.TimeSheetLogs(StatusId, TimeSheetId) 

StatusIdTimeSheetId,並下令匹配的行alllow查找因此很容易通過流聚合進行分組和統計。

+0

有什麼需要使用COUNT_BIG? – user1960365 2013-02-13 19:37:52

+0

@ user1960365 - 這是索引視圖的許多限制之一,你不能使用COUNT,但必須使用COUNT_BIG,它們基本上是相同的,除了第二個支持更大數量的行並返回bigint比'int' – 2013-02-13 19:39:34

+0

所以第二個是使用更多的資源,那麼它應該是。所以你不覺得Count在這種情況下會是更好的選擇嗎? – user1960365 2013-02-13 19:44:05

2

請注意,索引視圖使您的查詢速度更快,但在更新(插入,更新,刪除和合並)基本表時,它們需要更多維護。您應該通過針對您的全部工作量進行測試,而不僅僅是針對視圖的選擇來檢查此視圖是否值得爲此付費。

CREATE VIEW [dbo].[vwNumberOfEditsForTimeSheets] 
WITH SCHEMABINDING 
AS 
    SELECT TimeSheetId, COUNT_BIG(*) AS NumberOfEdits 
    FROM dbo.TimeSheetLogs AS tsl 
    WHERE (StatusId = 27) 
    GROUP BY TimeSheetId; 
GO 
CREATE UNIQUE CLUSTERED INDEX TSId 
    ON dbo.vwNumberOfEditsForTimeSheets(TimeSheetId); 
GO 

如果你是標準版,您可能需要使用WITH (NOEXPAND)提示使用視圖。

+0

何時應該這個WITH(NOEXPAND)被使用。 我正在使用SQLSERVER2012 Express。 你能向我解釋一下嗎? – user1960365 2013-02-13 19:36:00

+0

@ user1960365 - 您將需要提示,否則索引視圖將不會被使用,它仍然會訪問基表。示例語法'SELECT * FROM [dbo]。[vwNumberOfEditsForTimeSheets] WITH(NOEXPAND)'。只有在企業版引擎(包括開發者版本)這不是必需的。 – 2013-02-13 19:42:53