2011-11-24 47 views
1

我有一個名爲「preference」的表,其中包含超過100列的oracle,我寫了一點點複雜的SQL,需要使用關鍵字UNION/INTERSECT/MINUS來執行查詢。 舉一個簡單的例子:問題發生在Oracle的clob上union minus

select a.* from preference a where a.id = ? union 
select a.* from preference a where a.id = ? 

業務護理已被更改,由於需求無限長度的字符串存儲。一列需要重新定義爲Clob類型。 Oracle不允許clob類型的聯合,所以理想情況下a。*不能在這裏使用。

我改變SQL下面喜歡:

select a.a,a.b,a.c... from preference a where a.id = ? union 
select a.a,a.b,a.c... from preference a where a.id = ? 

它列出的所有列,除了CLOB,然後我必須做的另一個選擇的CLOB值附加在一起。這是一個好主意嗎?

上述情況帶來的另一個問題是:正如我所提到的,這個表有大列,列出了sql中的所有列,使得SQL變得更長。有沒有表達我可以選擇所有列,但擺脫具體的一個?

回答

1

Oracle在使用日誌進行延遲時不允許使用union/minus,但允許使用union all,也可以使用union all重寫您的查詢並使用select 。在select子句中,您可以發出select a。或列出每一列。

在閱讀你的問題後,我主要關心的是Java上的內存使用情況,你使用orm來加載數據嗎?或者你在使用jdbc api嗎?

如果您將所有clobs加載到某些字符串中,您可能會以OutOfMemoryError結束。我的建議是僅將clob加載到需要向用戶顯示的行(或者需要處理clob提交的行)。

您能否提供關於您的應用程序(它必須處理的數字行)和您的數據(特別是clob大小)的更多信息?

+0

感謝您的回覆,我正在使用JDBC與Oracle交談,clob並沒有那麼大(一般小於10000字節),對於系統性能方面的擔憂,我們正在將常用數據加載到內存中。該示例不是真實的情況,所以我必須在此SQL條件中使用UNION/INTERSECT/MINUS。 –

+0

我現在關心的SQL很長,因爲它列出了每一列,這會影響oracle的執行性能嗎?是否有任何SQL語言可以選擇希望解釋的所有列 –