Mar*_*tus -5 postgresql sql-server sybase-ase
PostgeSQL 有一些非常丰富的字段和行大小限制(分别为 1GB 和 1.6TB)。
另一方面,Sybase ASE 的行大小限制在 4 或 8KB 左右。
例如,在 Sybase ASE 15.7 上我看到:
sqldev.mydatabase.1> create table foo2(a VARCHAR(7000));
Warning: Row size (7034 bytes) could exceed row size limit, which is 1962 bytes
Run Code Online (Sandbox Code Playgroud)
这不仅仅是关于性能的警告,因为当我尝试插入大于 1962 字节的内容时,它实际上是强制执行的:
Attempt to update or insert row failed because resultant row of size 4462 bytes is larger than the maximum size (1962 bytes) allowed for this table.
Command has been aborted.
Run Code Online (Sandbox Code Playgroud)
我猜由于共同的传统,类似的限制适用于 SQL Server,谷歌似乎同意(但我没有在 SQL Server 上尝试过)。
我假设这种巨大的差异一定是一些截然不同的架构决策或一些基本权衡的结果,这些权衡是由每个 RDBMS 以不同方式决定的。如果这是正确的,那将是什么权衡或架构决策?
就SQL Server而言:
我不知道你的意思-你可以存储大量的LOB数据的varchar(max)
/ nvarchar(max)
/varbinary(max)
列(最大支持2GB)。
您似乎被困在页面大小上 - 是的,单个页面限制为 8kb,是的,非 LOB数据限制为 8060 字节,但不,您可以将更多的内容放入表中 - 它就是不能所有这些都保存在一个页面上。这是一个一列一行的表,数据大小为136kb(216kb保留):
CREATE TABLE #x(a varchar(max));
INSERT #x SELECT REPLICATE(CONVERT(varchar(max), 'a'), 100000);
SELECT DATALENGTH(a) FROM #x; -- 100,000
EXEC tempdb.sys.sp_spaceused @objname = N'#x';
-- 1 row, 216kb reserved, 136kb data size
DROP TABLE #x;
Run Code Online (Sandbox Code Playgroud)
你当然可以做得更大:
REPLICATE
命令更改为 10,000,000,您将获得相同的 1 行,其中包含 10,016kb 的数据(10,088kb 保留)。从网上书籍:
SQL Server 支持行溢出存储,它允许将可变长度列推离行。对于从行中推出的可变长度列,主记录中只存储一个 24 字节的根;因此,有效行限制高于以前版本的 SQL Server。有关详细信息,请参阅SQL Server 联机丛书中的“超过 8 KB 的行溢出数据”主题。
列存储(使用不同的存储)和内存中 OLTP(仍然有限制,但如果您正在(或可能正在)使用内存优化表中的表和行大小可能会很好地阅读-内存OLTP)。
我对 PostgreSQL 的了解不够,无法评论该平台,但由于这是 SQL Server 中的一个限制,我觉得有必要捍卫它(即使我不能类似地捍卫 Sybase - 它与 SQL Server 没有什么不同) ,但我承认我不知道具体情况)。
归档时间: |
|
查看次数: |
481 次 |
最近记录: |