アプリケーションに SubSonic SimpleRepository テンプレートを使用しています。SQL 2000 データベースを指す VS2010 で ASP .NET WebForms プロジェクトを作成しました。
SubSonic がパラメーター化されたクエリで常に varchar ではなく nvarchar を使用しているという問題があります。これにより、SQL はインデックス シークではなくインデックス スキャンを実行します。プロファイラーから SQL を取得し、パラメーターをテーブルのフィールドのように varchar にするように変更しました。これは非常に高速に実行されます (<1 秒対 8 秒)。
プロファイラーからの SubSonic クエリ
exec sp_executesql N'SELECT [t0].[ADDRESS_L1], [t0].[ADDRESS_L2], [t0].[ADDRESS_L3], [t0].[CITY], [t0].[COUNTRY] FROM [aveadmin].[SAPADD] AS t0 WHERE (([t0].[SITE_ID] = @p0) AND ((([t0].[ADDRESS_TYPE] = @p1) AND 1 <> 0) OR (([t0].[ADDRESS_TYPE] = @p2) AND 0 <> 0)))', N'@p0 nvarchar(16),@p1 nvarchar(2),@p2 nvarchar(2)', @p0 = N'BCF8A0A27E543EE1', @p1 = N'00', @p2 = N'03'
手動で変更されたクエリ
exec sp_executesql N'SELECT [t0].[ADDRESS_L1], [t0].[ADDRESS_L2], [t0].[ADDRESS_L3], [t0].[CITY], [t0].[COUNTRY] FROM [aveadmin].[SAPADD] AS t0 WHERE (([t0].[SITE_ID] = @p0) AND ((([t0].[ADDRESS_TYPE] = @p1) AND 1 <> 0) OR (([t0].[ADDRESS_TYPE] = @p2) AND 0 <> 0)))', N'@p0 varchar(16),@p1 varchar(2),@p2 varchar(2)', @p0 = N'BCF8A0A27E543EE1', @p1 = N'00', @p2 = N'03'
SITE_ID
とはADDRESS_TYPE
ですvarchars
。varchar
代わりにクエリを強制的に使用する方法はありますnvarchar
か?