2009-12-10 57 views
20

在Oracle中,當值不超過10字節時,如何定義列爲VARCHAR2(1000)而不是VARCHAR2(10)的影響是什麼?定義具有較大長度的VARCHAR2列的影響

該列是否僅佔用真正需要存儲值的空間,否則會對錶空間/索引的大小/性能產生負面影響?

回答

17

答案取決於您是在討論數據庫表中的列還是PL/SQL程序中的變量。

數據庫列

存儲的使用量是成比例的存儲的數據的大小。

PL/SQL可變

如果變量聲明的尺寸爲1〜3999(11克+)/ 1999(10克或更早),存儲器將被分配給最大長度(即VARCHAR2(100)將需要至少100個字節的內存)。

如果聲明變量的大小爲4000(11g +)/ 2000(10g或更早)或更大,則會根據存儲的數據大小分配內存。 (一個有趣的問題是,如果變量的值發生變化時,如何內存大小 - 它重新分配另一個緩衝區新的大小?)的10G

參考:PL/SQL Datatypes

小VARCHAR2變量針對性能進行了優化,較大的針對高效內存使用進行了優化。截止點是2000字節。對於2000字節或更長的VARCHAR2,PL/SQL動態地分配足夠的內存來保存實際值。對於小於2000字節的VARCHAR2變量,PL/SQL預先分配變量的完整聲明長度。例如,如果將相同的500字節值賦給VARCHAR2(2000 BYTE)變量和VARCHAR2(1999 BYTE)變量,則前者佔用500個字節,後者佔用1999個字節。

+0

我在談論表列,但PL/SQL引用也很有趣,謝謝! (+1) – 2009-12-11 08:35:28

+0

沒錯 - 請注意,當您開始編寫與表數據交互的PL/SQL代碼時,它變得更相關 - 即您可能傾向於使用與數據庫列相同的大小聲明VARCHAR2變量。 當然,這個內存使用率因素是IMO在列和變量大小方面最不重要的考慮因素。 – 2009-12-11 09:19:50

+4

在PL/SQL問題上,PL/SQL動態分配內存的臨界點已經從一個版本變爲另一個版本。例如,在10g中,它從增加到2000,但在11.1中增加到4000。請參閱http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/tuning.htm#BCGEGEEG – 2009-12-11 14:33:04

13

在數據庫中,沒有區別。 VARCHAR2以可變長度存儲,聲明的長度只是一個限制。

然而,一些客戶端應用程序會保留每列而不是101000字節,如果他們看到的列被定義爲VARCHAR2(1000)

0

定義列大小爲你準備應對的最大長度。 對於臨時表,我正在將文件加載到數據庫中,我可以使用VARCHAR2(4000)。然後,一旦所有的數據都在數據庫中,我可以做任何我需要的驗證(數據類型,數據長度,最小/最大值,可接受的字符......),並將有效值傳遞到具有適當定義/限制。

我可以利用DML error logging,以便不符合定義/約束條件的數據在沒有任何棘手的逐行編碼的情況下被抽取到拒絕表。

如果你有一個VARCHAR2(1000),那麼在某些時候你會得到比你期望的數據更長的數據(例如,你可能會得到10個字符的字符串,但有14個字節,因爲有些字符是多 - 字節字符集值)。