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 个。

哪种类型的索引最适合这种类型的视图?

谢谢

4

2 回答 2

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)

允许查找 byStatusId匹配的行排序TimeSheetId,因此很容易按流聚合进行分组和计数。

于 2013-02-13T19:23:01.150 回答
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)提示来使用视图。

于 2013-02-13T19:23:09.803 回答