私は SQL Server 2008 を使用しており、文字列連結を使用してクエリを作成する代わりに、いくつかの古いコードでパラメーターを使用するように取り組んでいます。また、テーブルにインデックスを追加するなどして、作業を高速化する作業も行っています。
私が扱っているテーブルには多くの列 (スター スキーマ レポート データベースの心臓部) があり、4M を超える行があります。テーブルの作成は次のようになります。
CREATE TABLE [dbo].[rptTransaction](
...
[Date] [nvarchar](10) NULL,
...
) ON [PRIMARY]
はい、キーワードと衝突するため、日付列の名前は適切ではありません。彼らは文字列の日付を使用しています [これはレポート データベースであることを思い出してください]。
MS SQL Server Management Studio で次のコードを実行すると:
DECLARE @testDate NVARCHAR = N'2012/03/01';
SELECT COUNT(*)
FROM rptTransaction AS t
WHERE t.Date >= @testDate
AND t.Date <= @testDate
OPTION (RECOMPILE);
GO
結果は次のとおりです。
(No column name)
0
一方、次のコードを実行すると:
DECLARE @testDate NVARCHAR = N'2012/03/01';
SELECT COUNT(*)
FROM rptTransaction AS t
WHERE t.Date >= N'2012/03/01'
AND t.Date <= N'2012/03/01'
OPTION (RECOMPILE);
GO
結果は次のとおりです。
(No column name)
124888
(OPTION (RECOMPILE) を使用しています。そうしないと、パラメータ化されたバージョンが完全なテーブル スキャンを実行するため、時間がかかります。)