2011-07-19 45 views
5

我們正在將我們的數據庫從Sybase轉換爲Oracle,並且遇到了性能問題。在Sybase中,我們有一個TEXT字段,並用Oracle中的CLOB替換它。Sybase TEXT與Oracle CLOB性能

這就是我們如何在Java代碼中訪問的數據:

while(rs.next()) { 
    String clobValue = rs.getString(1); // This takes 176ms in Oracle! 
    . 
    . 
} 

數據庫是遍佈全國各地,但儘管如此,我們沒有與Sybase任何性能問題和它的文本數據的檢索。

有什麼我們可以做的,以提高這種表現?

回答

3

其他一些選項:

是LOB列存儲在行(數據行)或超出線(在一個單獨的地方)?如果LOB列趨於較小(小於4k),則可以使用ENABLE STORAGE IN ROW子句告訴Oracle在可能的情況下將數據在線存儲。

如果您的LOB較大且經常使用,它們是否存儲在緩衝區緩存中? 10g中的默認值是LOBs爲NOCACHE,這意味着針對它們的每個I/O操作都涉及到直接讀取數據庫的同步磁盤事件,該事件可能很慢。數據庫跟蹤將顯示direct path read/direct path write事件的重大等待。 「Oracle應用開發者指南 - 大型對象」的

This chapter將是有價值的閱讀。

+0

將此標記爲答案,因爲它最接近提供可能導致回答的信息:) – wsaxton

4

默認情況下,LOB不會隨表數據一起提取,並且需要額外往返數據庫才能在getString中獲取它們。

如果您使用的是Oracle的.NET提供程序,您可以在數據讀取器設置中將InitialLOBFetchSize設置爲足夠大的值,以便在內存中容納大型對象,以便可以將它們與其他數據一起取出。

+0

不幸的是,我們沒有使用這個框架。我們在Solaris上使用JDBC。 – wsaxton

0

我們決定採取一種不同的方法,讓我們忽略clob的表現。

我們目前的代碼(我沒有寫它!)查詢數據庫中的一個表,並檢索表中的所有信息,包括clobs,儘管並不是必須全部檢索它們時間。相反,我們使用varchar中的前4k個字符創建了另一個字段,並對其進行查詢。然後,當我們需要完整的clob時,我們會根據個人情況進行查詢,而不是所有記錄的所有clob。