記得四年前微軟就正式宣告建議大家不要再用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
    {
        static void 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!


Comments

Be the first to post a comment

Post a comment