¿La consulta de Dapper es lenta con el parámetro de tipo DateTime?

dapper oracle parameterized

Pregunta

eg.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()

la consulta es lenta, la hora es 00: 00: 02.2142132


eg.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()

la consulta es rápida, la hora es 00: 00: 00.4604229


El siguiente es un nuevo caso de prueba. todo el recuento de registros de prueba es 39 desde la base de datos.

group1: use Oracle.ManagedDataAccess

test1: 00: 00: 01.9456767. use dapper y datetime es tipo de fecha y hora (por ejemplo, 1..: begin_time)

test2: 00: 00: 00.6667549. use dapper y datetime es tipo de cadena (por ejemplo, 2. to_date (: begin_time, format))

test3: 00: 00: 01.8552286. use ado.net/OracleCommand/OracleDataAdapter y datetime es tipo de fecha y hora (por ejemplo, 1..: begin_time)

test4: 00: 00: 00.0592419. utilice ado.net/OracleCommand/OracleDataAdapter y datetime es tipo de cadena (por ej., 2. to_date (: begin_time, format))


group2: use System.Data.OracleClient

test5: 00: 00: 00.0184799. use dapper y datetime es tipo de fecha y hora (por ejemplo, 1..: begin_time)

test6: 00: 00: 00.1158088. use dapper y datetime es tipo de cadena (por ejemplo, 2. to_date (: begin_time, format))

test7: 00: 00: 00.0193022. use ado.net/OracleCommand/OracleDataAdapter y datetime es tipo de fecha y hora (por ejemplo, 1..: begin_time)

test8: 00: 00: 00.0185583. utilice ado.net/OracleCommand/OracleDataAdapter y datetime es tipo de cadena (por ej., 2. to_date (: begin_time, format))

Encontré si uso System.Data.OracleClient dos maneras son rápidas. solo use Oracle.ManagedDataAccess, el eg1 es lento y eg2 es rápido.

Puede ser la causa de Oracle.ManagedDataAccess.

Respuesta popular

He estado teniendo un problema similar con Oracle.ManagedDataAccess, y descubrí que los parámetros de DateTime se convierten en Timestamp dentro de la consulta. Si su columna de tiempo es una Date lugar de una Timestamp de Timestamp , Oracle lo convertirá implícitamente en una Timestamp y no podrá usar ningún índice en esa columna.

Intente volver a escribir su consulta para que sea:

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

Y mira si eso mejora el rendimiento.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué