2013-02-19 1 views
1

오라클에 MESSAGE라는 테이블이 있고 TERMINALID (VARCHAR2 8 NOT NULL) 열이 있습니다. 이 열에 대한 색인이 있습니다. 이 테이블에는 약 300,000,000 개의 레코드가 있습니다.Dapper, Oracle 및 명령 매개 변수

이제 미세 (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(); } 
} 

?

+0

첫 번째 코드는 0.0 초 후에 실행됩니다. 두 번째 코드가 시간 초과됩니다. –

+0

두 번째 쿼리에서 매개 변수의 데이터 형식을 지정하는 방법이 있습니까? –

+0

아니오; 나는 그것을 좋아하지 않는다. –

답변

0

기본적으로 : @ Vincent가 말한 바 : a datatype mismatch can make indexes unusable.

추가 정보가 없다면, dapper는 몇 가지 가정을합니다. 이러한 가정 중 하나는 문자열이 계속 데이터베이스에서 유니 코드가 될 것이므로 기본값은 DbType.String입니다. 대부분의 경우이 값은 정확하거나 적절하지만 일부 시나리오에서는 오작동 할 수 있습니다. 따라서 우리는 추가 할 문자열 매개 변수의 유형과 길이에 대해 더 명시 적으로 (DynamicParameters을 통해) 기능을 제공합니다.