SQL Server 2005 データベースに対していくつかのカスタム レポートを作成しています。データベースは、私たちが実行するサードパーティの管理アプリケーションに属しています。私が取得しているデータは、サイトの主な目的に含まれていないため、タイムスタンプ列を除いて、データの大部分はインデックス化されていません。今のところ、関連するテーブルは 1 つだけです。約 7 億行のテーブルです。したがって、50 行のみを返すクエリを実行すると、700mil すべてをポーリングする必要があります。
私はこれをスピードアップしようとしていますが、WHERE 句に追加するすべての列にインデックスを付けたくありません。多くのインデックスを追加すると、速度が大幅に向上するかどうかはわかりません (または、違う?)。したがって、テーブルに新しいインデックスを追加できなかった場合のベスト プラクティスはどうなるか知りたいです。
ストアド プロシージャは最適ではないようです。インデックス付きビューが最良のアイデアでしょうか? 考え?
テーブル スキーマは次のとおりです。
DeviceGuid (PK, uniqueidentifier, not null)
DeviceID (int, not null)
WindowsEventID (PK, int, not null) (indexed)
EventLog (varchar(64), not null)
EventSource (varchar(64), not null)
EventID (int, not null)
Severity (int, not null)
Description (nvarchar(max), not null)
TimeOfEvent (PK, datetime, not null) (indexed)
OccurrenceNbr (int, not null)
サンプルクエリは次のとおりです。
SELECT COUNT(*) AS NumOcc, EventID, EventLog, EventSource, Severity, TimeOfEvent, Description
FROM WindowsEvent
WHERE DeviceID='34818'
AND Severity=1
AND TimeOfEvent >= DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), '2010/10/27 12:00:00 AM')
AND TimeOfEvent <= DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), '2010/11/3 12:00:00 AM')
AND EventID<>34113
AND EventID<>34114
AND EventID<>34112
AND EventID<>57755
AND EventSource<>'AutoImportSvc.exe'
AND EventLog='Application'
GROUP BY EventID, EventLog, EventSource, Severity, Description
ORDER BY NumOcc DESC
たぶん、クエリは最悪です... 4.5 分で 53 行が返されます。