いくつかのパラメータに基づいてカウントを行う場合は、インデックスがUploadDate
に定義されている場合、大きな違いはないと私は考えています。ストアドプロシージャを使用している場合、それは次のようになります。
CREATE PROCEDURE dbo.GetCount
(
@FromDate DATETIME2 = '1900-01-01',
@ToDate DATETIME2 = '9999-12-31',
-- other filters may come here
)
AS
BEGIN
SELECT COUNT(id)
FROM [Documents]
WHERE UploadDate > @FromDate AND @ToDate < @ToDate
END
GO
-- get all
EXEC dbo.GetCount
-- get from date
EXEC dbo.GetCount @FromDate = '2015-03-01'
-- to date
EXEC dbo.GetCount @ToDate = '2016-03-01'
-- both
EXEC dbo.GetCount @FromDate = '2015-03-01', @ToDate = '2016-03-01'
あなたはまた、は、動的SQL作成することによって、実行するための最低限のSQLを取得しようとすることができます:
CREATE PROCEDURE dbo.GetCount
(
@FromDate DATETIME2 = NULL,
@ToDate DATETIME2 = NULL
-- other filters may come here
)
AS
BEGIN
DECLARE @SQL NVARCHAR(4000) = N'
SELECT COUNT(id) FROM [Documents]
WHERE 1 = 1
'
IF (@FromDate IS NOT NULL) @SQL = @SQL + ' UploadDate > @FromDate'
IF (@ToDate IS NOT NULL) @SQL = @SQL + ' UploadDate > @ToDate'
EXECUTE sp_executesql @SQL, '@FromDate DATETIME2, @ToDate DATETIME2', @FromDate, @ToDate
END
これを左および/または右に開いた間隔の柔軟性を提供する。
のアプリケーション層(たとえばLINQ2SQL)からクエリを動的に生成する場合は、パラメータに基づいて最適なオプションを生成することができます。これにより、最短で最速のクエリが得られます。
var query = DbContext.Documents;
if (fromDate.HasValue) query = query.Where(UploadDate > fromDate.Value);
if (toDate.HasValue) query = query.Where(UploadDate < toDate.Value);
int count = query.Count();
最後の2つのソリューションでも、新しいフィルタを簡単に追加できます。
その列にインデックスがある場合、それは問題ではありません。 –
サンプルデータと望ましい結果を提供してください。 –
おそらく。クラスタード・インデックス(および主キー)が存在するかぎり、単純な(2番目の)照会が優先され、できるだけ高速になります。 where句を追加することで、パフォーマンスを低下させることができますが、フィルタリング対象の列とその列に含まれるデータのインデックスに依存します。 – Igor