这真的取决于列中的内容。如果有很多大的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