使用DateTime类型参数,Dapper查询速度慢?

时间:2015-02-10 02:53:53

标签: oracle dapper parameterized

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

查询速度慢,时间为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()

查询速度很快,时间是00:00:00.4604229


以下是一个新的测试用例。数据库中的所有测试记录数均为39。

group1:使用Oracle.ManagedDataAccess

test1:00:00:01.9456767。使用dapper和datetime是datetime类型(eg1。:begin_time)

test2:00:00:00.6667549。使用dapper和datetime是字符串类型(例如.to_date(:begin_time,format))

test3:00:00:01.8552286。使用ado.net/OracleCommand/OracleDataAdapter和datetime是datetime类型(eg1。:begin_time)

test4:00:00:00.0592419。使用ado.net/OracleCommand/OracleDataAdapter和datetime是字符串类型(例如.to_date(:begin_time,format))


group2:使用System.Data.OracleClient

test5:00:00:00.0184799。使用dapper和datetime是datetime类型(eg1。:begin_time)

test6:00:00:00.1158088。使用dapper和datetime是字符串类型(例如.to_date(:begin_time,format))

test7:00:00:00.0193022。使用ado.net/OracleCommand/OracleDataAdapter和datetime是datetime类型(eg1。:begin_time)

test8:00:00:00.0185583。使用ado.net/OracleCommand/OracleDataAdapter和datetime是字符串类型(例如.to_date(:begin_time,format))

我发现如果使用System.Data.OracleClient两种方式都很快。只使用Oracle.ManagedDataAccess,eg1速度慢,eg2速度快。

可能是Oracle.ManagedDataAccess的原因。

2 个答案:

答案 0 :(得分:4)

我一直遇到类似Oracle.ManagedDataAccess的问题,我发现DateTime参数在查询中转换为Timestamp。如果您的时间列是Date而不是Timestamp,Oracle会隐式将其转换为Timestamp,并且无法使用该列上的任何索引。

尝试将您的查询重写为:

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

看看这是否会提高效果。

答案 1 :(得分:1)

试试吧。

SqlMapper.AddTypeMap(typeof(DateTime), DbType.Date);

因为Dapper默认设置typeof(DateTime)等于DbType.DateTime,

但DbType.DateTime默认等于OracleDbType.TimeStamp,

所以可以设置DbType.Date映射OracleDbType.Date。