1

Oracle に MESSAGE という名前のテーブルがあり、そのテーブルには列 TERMINALID (VARCHAR2 8 NOT NULL) があります。この列には索引があります。このテーブルには約 300,000,000 のレコードがあります。

これで問題なく動作します (0.0 秒) :

using (var con = new OracleConnection(connectionString2))
{
    try
    {
        con.Open();

        var parameters = new DynamicParameters();
        parameters.Add("PTerminalId", value: "04447777", dbType: System.Data.DbType.AnsiString);
        Console.WriteLine("ora - messages #{0}", con.Query<decimal>("SELECT COUNT(*) FROM MESSAGE WHERE TERMINALID=:PTerminalId", param: parameters).FirstOrDefault());
    }
    finally { con.Close(); }
}

そして、これは失敗します(タイムアウト)

using (var con = new OracleConnection(Properties.Settings.Default.GSMConnectionString2))
{
    try
    {
        con.Open();

        Console.WriteLine("ora - messages #{0}", con.Query<decimal>("SELECT COUNT(*) FROM GSM.MESSAGE WHERE TERMINALID=:PTerminalId", param: new { PTerminalId = "04447777" }).FirstOrDefault());
    }
    finally { con.Close(); }
}

なぜそうなのですか?

4

1 に答える 1

0

基本的に: @Vincentの発言: データ型の不一致により、インデックスが unusable になる可能性があります

追加情報がなければ、dapper はいくつかの仮定を行います。これらの仮定の 1 つは、文字列がデータベースで Unicode であり続けるため、デフォルトでDbType.String. ほとんどの場合、これは正しいか適切ですが、一部のシナリオでは誤動作する可能性がありますDynamicParameters。そのため、追加する文字列パラメーターの型と長さの両方をより明確にする機能も ( 経由で) 提供しています。

于 2013-02-22T00:33:40.187 に答える