我有一个带有类型列的 SE11 表,STRING
我想知道它是如何存储在底层数据库系统(本例中为 SAP Hana)上的。
我读到只有对 LOB 的引用实际上保存在键入为的列中,STRING
而字符串本身保存在表之外。这是真的吗?它在 Hana 上也一样吗?我尝试使用 RTFM,但找不到该信息。
通常是否建议尽可能使用CHAR
特定长度?
我有一个带有类型列的 SE11 表,STRING
我想知道它是如何存储在底层数据库系统(本例中为 SAP Hana)上的。
我读到只有对 LOB 的引用实际上保存在键入为的列中,STRING
而字符串本身保存在表之外。这是真的吗?它在 Hana 上也一样吗?我尝试使用 RTFM,但找不到该信息。
通常是否建议尽可能使用CHAR
特定长度?
免责声明。虽然我为 SAP SE 工作,但我与 SAP HANA 的团队或代码无关。以下信息是在 SAP HANA 2 SP02 (2.00.024.00.1519806017) 中通过反复试验收集的。它既不可靠,也不具有法律约束力,并且可能会在未来更改,恕不另行通知。
好的,现在已经不碍事了,让我们来看看一些事情:
SAP HANA 有一个列存储(= 花哨的新事物)和一个行存储(= 从其他关系数据库中得知)。两者非常不同。因此,在优化结构时,您应该知道您正在处理的是哪个商店。
ABAP DDIC 将STRING
透明表中的列转换为NCLOB
列,并CHAR
转换为NVARCHAR
.
ABAP DDIC 对字符串非常特殊:它们不能用作键,因为它们超过了 255 个字符的最大键长度。它们还可以防止应用程序服务器缓冲表,从而增加重复查询的响应时间。仅此一项通常是避免STRING
使用的理由CHAR
。STRING
总之,可以说在透明表中添加多于一列是没有意义的。
SAP HANA 确实将 LOB 存储在表之外,而表只包含一个引用。内容被视为类似于文件。它们CONTAINER_ID
可以从系统视图"SYS"."M_TABLE_LOB_FILES"
中收集。相关的系统视图"SYS"."M_TABLE_LOB_STATISTICS"
为您提供了有关已用空间的更多详细信息。
(相当)最近关于混合 LOB 的博客揭示了另一个有趣的事实:“因为 SAP HANA 不会压缩 LOB 列,无论它是驻留在磁盘还是内存中 [...]”。这意味着该列将消耗与您放入的内容一样多的磁盘空间。这与 SAP HANA 的其他列存储内容完全不同,后者被大量压缩以优化存储和访问。得出的结论也很有趣:“[...] 任何可能的压缩算法逻辑(例如 gzip)都必须在应用程序层应用于从数据库写入/读取”。
一般来说——我知道的所有数据库管理系统都是这样——最好选择可变字符类型,因为它们让系统可以自由地优化它实际保留的空间。由于SAP 的指南不鼓励将VARCHAR
(= non-Unicode) 用于纯 ASCII 以外的任何内容,因此 SAP HANA 的合理默认值应该是NVARCHAR
(= Unicode-capable)'。