記得四年前微軟就正式宣告建議大家不要再用System.Data.OracleClient,改用ODP.NET。當時Oracle對LINQ支援還不太好,想用LINQ或EF得尋求3rd Party解決方案,從ODAC 11.2起,Entity Framework已是ODP.NET標準配備,System.Data.OracleClient的存在就更只剩下向前相容。
今天幫忙射掉茶包一枚: 使用SQLPlus執行SELECT * FROM BIGTABLE查詢約3萬6千筆資料耗時50秒,執行以下.NET程式卻耗時1分23秒,幾乎是一倍半的時間:
using System;
using System.Diagnostics;
using System.Data.OracleClient;
namespace ConsoleApplication1
{
class Program
{
staticvoid Main(string[] args)
{
string cnStr = "Data Source=Boo;User Id=User;Password=Password;";
OracleConnection cn = new OracleConnection(cnStr);
cn.Open();
Stopwatch sw = new Stopwatch();
sw.Start();
var cmd = cn.CreateCommand();
cmd.CommandText = "SELECT * FROM BIGTABLE";
OracleDataReader dr = cmd.ExecuteReader();
while (dr.Read()) { }
sw.Stop();
Debug.WriteLine("Duration: {0:n0}", sw.ElapsedMilliseconds);
Console.Read();
}
}
}
取得苦主提供的OracleCommand程式片段放進.NET 4 Console Application測試,我得到的結果卻大不相同! 在我機器上測試花不到50秒就跑完(跟用SQLPlus跑指令的時間相近),相同程式碼在兩台機器執行效果迥異令人費解? 仔細比對後發現: 苦主用了System.Data.OracleClient,而我想都沒想就拿出ODP.NET,換句話說,程式碼"幾乎"完全相同況,只有最上方using System.Data.OracleClient或是using Oracle.DataAccess.Client的差別,決定了不同命運,而且速度差異幅度高達50%!! 本以為System.Data.OracleClient只是官方不建議使用,萬萬沒想到續用會被懲罰,讓人意外,特發文補刀!
結論: 大家就比照IE6/7/8,讓System.Data.OracleClient早日回火星吧~ Let it go!