這真的取決於列中的內容。如果有很多大的VARCHAR列 - 並且它們經常被充滿到接近容量 - 那麼你可能會遇到一些問題。如果它是全部整數數據,那麼你應該沒問題。
453 * 4 = 1812 # columns are 4 byte integers, row size is ~1.8k
453 * 255 = 115,515 # columns are VARCHAR(255), theoretical row size is ~112k
經驗法則是,行大小不應超過磁盤塊大小,其通常爲8K。正如你所看到的,如果你的大表完全由4字節整數組成,但如果它由255個字符的VARCHAR列組成,那麼你可能會超出極限。這個8k限制曾經是SQL Server中的一個硬限制,但我認爲現在這只是一個軟限制和性能指南。
請注意,VARCHAR列不一定會消耗與您爲其指定的大小相稱的內存。這是最大尺寸,但他們只消耗盡可能多的。如果VARCHAR列中的實際數據總是3-4個字符,那麼無論您是將它們創建爲VARCHAR(4)還是VARCHAR(255),大小將與整數列的大小類似。
一般規則是,您希望行大小很小,以便每個磁盤塊有許多行,這樣可以減少掃描表所需的磁盤讀取次數。一旦你達到8K以上,你就有兩行讀取。
Oracle有另一個潛在的問題,即ANSI連接對連接中所有表中的列總數有嚴格的限制。您可以通過避免Oracle ANSI連接語法來避免這種情況。 (有些東西沒有受到這個錯誤的影響。)我不記得這個限制是什麼或者它適用於哪個版本(我認爲它還沒有被修復)。
你說的行數應該沒問題,假設你有足夠的硬件。
爲什麼地球上有一張453列的桌子?你的表是否正常化?他們可以進一步正常化嗎? – 2009-11-26 15:38:26
@Dominic - 因爲Jeffrey的數據庫使用的Sybase IQ是「面向列的數據庫」。面向列的數據庫的重點在於它們拒絕了「正常化」的整個概念。至少,正如關係數據庫中所理解的那樣。 – APC 2009-11-26 16:14:00
只是要清楚 - 您是否希望將現有模式移植到新數據庫?如果是這樣,爲什麼?如果您在使用OLTP時遇到問題,很可能是表設計問題,而不是DBMS產品問題。如果您給我們更多背景,我們可以更好地爲您提供建議。具體來說,你遇到了什麼問題?您希望從Oracle或MSSQL遷移中獲得什麼優勢? – APC 2009-11-26 16:20:03