2011-03-22 87 views
1

奇怪的問題表現表的一個奇怪的情況我很英寸29分Oracle的VARCHAR2列

有選擇具有29 VARCHAR(255)列的表的所有列在任何noticable性能差異?

如果改爲varchar(50),性能是否會提高?

如果有問題,列中的大部分數據實際上少於30個字符。

回答

5

這取決於。

如果您只是在沒有網絡流量的PL/SQL塊中查詢數據,假設兩種情況下的數據實際上都是相同的大小,這應該沒有關係。如果您將數據提取到PL/SQL變量中,您可能會使用略微更多的PGA內存,但它不太可能會在性能上產生顯着差異。

但是,如果您要通過網絡獲取數據,它可能會有所作爲。許多驅動程序最終會根據結果集的潛在大小(即255個字節或255個字符(取決於字符集,NLS_LENGTH_SEMANTICS和其他全球化樂趣)分配空間,這可能意味着您將分配5次以上客戶端機器上的RAM超過必要(這裏的「客戶端機器」可能指的是三層應用程序的中間層)。這反過來最終會影響業績。

根據您的用戶名,我傾向於懷疑您使用的是Java和JDBC。如果您使用的是Type 4 JDBC驅動程序,我傾向於打賭,您只會根據數據的實際大小來分配空間。另一方面,如果您使用的是JDBC-ODBC橋,我傾向於認爲ODBC驅動程序正在根據列的最大大小分配空間。這顯然取決於你使用的驅動程序 - 這是我個人受過教育的猜測,不是基於實際分析各種驅動程序的內存使用情況。

+0

謝謝。今天我瞭解了JDBC驅動程序類型。禍是我。 :〜(看看我的jdbc jar,我推斷它是4型的!jar名爲ojdbc14-10.1.3.3.jar。我也得到了@ awrrpt.sql工作,它像磚塊一樣擊中了我 - 很有用但我是我不知道它的大部分意思是什麼!爲什麼!!! – JavaRocky 2011-03-23 01:01:39

+0

是的,我使用類型4從我的jdbc url,它已經很薄。 – JavaRocky 2011-03-23 01:05:48

1

29列30個字符每行少於1kB。在很多情況下,您可能會在數據庫中產生1kB行,並且不會遇到性能問題。

由於性能上存儲在varchar列,而不是最大大小的列的,性能不會通過縮短柱提高的數據量基(除非你而這樣做截斷數據) 。

+0

如果它們是varchar(50),性能是否會提高?我已經更新了這個問題。 – JavaRocky 2011-03-23 00:01:08

+1

@JavaRocky:我編輯了我的回答,表明表現不會改變。 – Gabe 2011-03-23 00:12:36