DateTime 유형 매개 변수로 더 진한 쿼리가 느린가요?

dapper oracle parameterized

문제

예 .1

string sql="select * from A where time>=:begin_time and time<=:end_time";

DateTime bt = new DateTime(2013, 04, 19);
DateTime et = new DateTime(2013, 04, 20, 15, 0, 0);
conn.Query<Object>(sql,new {begin_time=bt,end_time=et}).ToList()

쿼리가 느리고 시간은 00 : 00 : 02.2142132입니다.


예 .2

string sql="select * from A where time>=to_date(:begin_time,'yyyy-mm-dd      hh24:mi:ss') and time<to_date=(:end_time,'yyyy-mm-dd hh24:mi:ss')";

conn.Query<Object>(sql,new {begin_time="2013-04-19 0:00:00",end_time="2013-04-20 15:00:00"}).ToList()

쿼리가 빠르며, 시간은 00 : 00 : 00.4604229입니다.


다음은 새로운 테스트 케이스입니다. 모든 테스트 레코드 수는 데이터베이스에서 39입니다.

group1 : Oracle.ManagedDataAccess 사용

test1 : 00 : 00 : 01.9456767. dapper를 사용하고 datetime은 datetime 유형입니다 (예 : .1 : begin_time).

test2 : 00 : 00 : 00.6667549. dapper를 사용하고 datetime은 문자열 유형입니다 (예 : 2. to_date (: begin_time, format)).

test3 : 00 : 00 : 01.8552286. ado.net/OracleCommand/OracleDataAdapter를 사용하고 datetime은 datetime 유형입니다 (예 : 1. : begin_time).

test4 : 00 : 00 : 00.0592419. ado.net/OracleCommand/OracleDataAdapter를 사용하고 datetime은 문자열 유형입니다 (예 : 2. to_date (: begin_time, format)).


group2 : System.Data.OracleClient 사용

test5 : 00 : 00 : 00.0184799. dapper를 사용하고 datetime은 datetime 유형입니다 (예 : .1 : begin_time).

test6 : 00 : 00 : 00.1158088. dapper를 사용하고 datetime은 문자열 유형입니다 (예 : 2. to_date (: begin_time, format)).

test7 : 00 : 00 : 00.0193022 ado.net/OracleCommand/OracleDataAdapter를 사용하고 datetime은 datetime 유형입니다 (예 : 1. : begin_time).

test8 : 00 : 00 : 00.0185583. ado.net/OracleCommand/OracleDataAdapter를 사용하고 datetime은 문자열 유형입니다 (예 : 2. to_date (: begin_time, format)).

System.Data.OracleClient를 사용하면 두 가지 방법이 빠릅니다. Oracle.ManagedDataAccess 만 사용하십시오. eg1은 sill이 느리고 eg2는 빠릅니다.

Oracle.ManagedDataAccess의 원인 일 수 있습니다.

인기 답변

나는 Oracle.ManagedDataAccess와 비슷한 문제를 겪어 왔으며 DateTime 매개 변수가 쿼리 내에서 Timestamp 로 변환된다는 것을 발견했습니다. 시간 열이 시간 Timestamp 대신 Date 경우 Oracle은 이것을 암시 적으로 Timestamp 변환하며 해당 열에 대한 색인을 사용할 수 없습니다.

다음과 같이 쿼리를 다시 작성하십시오.

select * from A where time>=cast(:begin_time as date) and time<=:cast(end_time as date)

그리고 그것이 성능을 향상시키는 지보십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.