0

アプリケーションに 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ですvarcharsvarchar代わりにクエリを強制的に使用する方法はありますnvarcharか?

4

2 に答える 2

2

クエリで nvarchar の代わりに varchar を使用するように強制する方法はありますか?

この動作を変更するには、SubSonic のソース コードを変更する必要があります。

于 2011-03-16T16:35:30.220 に答える
0

[前の回答は正しいです。詳細は次のとおりです。]

nvarchar の使用は、Sql2005Schema.cs の GetNativeType() という関数でハードコーディングされています。パッチを当てて再構築するのは簡単です。おい、これがOSSだ!これがソースコードの目的です!

これがコードです。

            case DbType.AnsiString:
            case DbType.AnsiStringFixedLength:
            case DbType.String:
            case DbType.StringFixedLength:
                return "nvarchar";

理論的には、生成されたコード (SQLServer.ttinclude を参照) は、実際には DbType.AnsiString と DbType.String を別々の型として生成します。switch ステートメントを分割し、一方に「varchar」を生成し、他方に「nvarchar」を生成できるはずです。たぶん、作者はそれが問題ではないと思ったのでしょう。試してみることをお勧めします (ただし、単体テストが壊れる可能性があります)。

于 2012-01-14T09:39:03.907 に答える