2015-01-05 59 views
1

我們正在使用C#和.Net 4.5從Oracle數據庫下載數據。從ODBC讀取器讀取Oracle CLOB數據超級慢

values[]是一個對象數組; 閱讀器是ODBC閱讀器,具有與CLOB數據的Oracle數據庫表的開放連接。

下面是相關代碼:

if (reader.Read()) 
{ //Download and save the values 
    for (int x = 0; x < reader.FieldCount; x++) 
    { //Populate all the values 
     values[x] = reader[x]; //this line seems to cause execution to hang 
    } 
    // 
    //blah blah blah 
    // 
} 

的C#代碼似乎掛就行了values[x] = reader[x];

我們將行讀取中的每一列都分配給一個特殊的對象數組,因爲我們以後需要對這些數據做單獨的事情,而不必擔心此刻的數據類型。

問題在於,當一個表使用大(> 28,000)的Oracle CLOB數據列命中時,該行永遠不會完成。

如果我們從odbc閱讀器讀取的內容中刪除CLOB列,那麼所有內容都可以正常工作。

問題:

  1. 爲什麼會變成這樣?不應該陣列分配比較快?
  2. 什麼是一些可能的解決方法,所以我們可以保持CLOB列在下載的數據?我們 需要保持ODBC閱讀器作爲通用的ODBC閱讀器(而不是特定於Oracle)。

該應用程序已編譯並且必須保持32位。

謝謝!

回答

0

除非有真正令人信服的理由來使用ODBC,否則使用ODP.net或託管的ODP.net會好得多。雖然我不能100%確定地說ODBC是你的問題,但我可以告訴你,我已經使用ODP.net無數次地使用.NET與LOB。我還可以告訴你,Oracle的微軟驅動程序(depricated)造成了無數的神祕問題,其中大多數是性能問題。例如,查詢1工作正常,但用綁定變量替換文字會導致執行時間延遲15秒。使用ODP.net,延遲消失。我的猜測是ODBC可能有類似的神祕問題。

ODP.net(或DevArt dotConnect)是我知道的使.NET能夠利用OCI的唯一兩個工具,它具有諸如批量插入和更新等強大功能。 OCI可能有更好的方式處理大型LOB。是否有一個令人信服的理由你必須使用ODBC?

+0

Thanks @Hambone。我們使用ODBC的迫切理由是因爲這個應用程序可以針對衆多數據庫運行,而且我們不希望爲每個數據庫專門編寫代碼。例如,這個應用程序可以查詢SQL Server,Oracle,使用32位ODBC Tibco驅動程序的舊數據庫以及PostGre數據庫。代碼現在可用於除最近的Oracle CLOB數據之外的所有應用程序。鑑於有限的資源,很容易弄清楚爲什麼會發生這種情況。 –

+0

我打算把它作爲現在的答案。不幸的是,我們目前沒有時間/資源來測試這個理論並且專門使用ODP編寫代碼,但是如果我們希望能夠回到並更新它。 :-) –

1

它是CLOB類型的問題! 將它轉換爲varchar和性能是確定:

變化

select clob from table 

2選擇

select DBMS_LOB.SUBSTR(clob,4000,1) from table where length(clob)<= 4000; 
select clob from table where length(clob)> 4000; 

這很容易驗證 - 表現爲小CLOB列,WEEL慢,但鑄造到varchar解決問題!

問題是,每一個CLOB列提取都會從客戶端向服務器發出2個額外的淨往返行程!

通常你有幾行

一個淨往返
0

添加LONGDATACOMPAT = 1;在您的字符串連接上:

string conn = @"DSN=database;UID=user;PWD=password;LONGDATACOMPAT=1;";