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的原因。
答案 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。