Let It Go吧! System.Data.OracleClient

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

歡迎推文分享:
Published 20 June 2014 09:25 PM 由 Jeffrey
Filed under:
Views: 5,794



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<June 2014>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication