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)

StatusId並べ替えられた一致する行を使用してルックアップを許可するため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 に答える