Requête Dapper lente avec le paramètre de type DateTime?

dapper oracle parameterized

Question

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 requête est lente, l'heure est 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 requête est rapide, l'heure est 00: 00: 00.4604229


Ce qui suit est un nouveau cas de test. tous les enregistrements de compte sont 39 à partir de la base de données.

group1: utilisez Oracle.ManagedDataAccess

test1: 00: 00: 01.9456767. utiliser dapper et datetime est le type datetime (eg .1:: begin_time)

test2: 00: 00: 00.6667549. utilisez dapper et datetime est un type de chaîne (eg2. to_date (: begin_time, format))

test3: 00: 00: 01.8552286. utilisez ado.net/OracleCommand/OracleDataAdapter et datetime est le type datetime (eg1.: begin_time)

test4: 00: 00: 00.0592419. utilisez ado.net/OracleCommand/OracleDataAdapter et datetime est le type de chaîne (par exemple, 2. to_date (: begin_time, format))


group2: Utiliser System.Data.OracleClient

test5: 00: 00: 00.0184799. utiliser dapper et datetime est le type datetime (eg .1:: begin_time)

test6: 00: 00: 00.1158088. utilisez dapper et datetime est un type de chaîne (eg2. to_date (: begin_time, format))

test7: 00: 00: 00.0193022. utilisez ado.net/OracleCommand/OracleDataAdapter et datetime est le type datetime (eg1.: begin_time)

test8: 00: 00: 00.0185583. utilisez ado.net/OracleCommand/OracleDataAdapter et datetime est le type de chaîne (par exemple, 2. to_date (: begin_time, format))

J'ai trouvé si utiliser System.Data.OracleClient deux manières sont rapides. utilisez uniquement Oracle.ManagedDataAccess, eg1 est sill slow et eg2 est rapide.

Peut être la cause d'Oracle.ManagedDataAccess.

Réponse populaire

J'ai eu un problème similaire avec Oracle.ManagedDataAccess, et j'ai découvert que les paramètres DateTime sont convertis en Timestamp dans la requête. Si votre colonne de temps est une Date au lieu d'un Timestamp , Oracle le convertira implicitement en Timestamp et ne pourra pas utiliser d'index sur cette colonne.

Essayez de réécrire votre requête pour qu'elle soit:

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

Et voyez si cela améliore les performances.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi