UltraLite 缺省最大散列大小(4 字节)适合于大多数部署。您可以增加大小以包含包括行 ID 在内的更多数据。但是,此更改可能增加索引的大小并将其分段存储在多个页间。结果,这种更改可能增加数据库的大小。增加最大散列大小的影响取决于表中的行数:例如,如果只有几行,大的索引散列键将仍适合索引页。在这种情况下,不会产生索引碎片。
当选择最佳散列大小时,应考虑数据类型、行数据和数据库的大小(尤其是表包含许多行时)。
确定您是否选择了最佳散列大小的唯一方法是在目标设备上针对 UltraLite 客户端应用程序运行基准测试。除了数据库大小自身的更改外,需要观察不同散列大小如何影响应用程序和查询性能。
当建立索引的列的值(如没有公共前缀的字符串)分布较好时,索引散列以增大索引结构为代价来提高插入、更新、删除和搜索的性能。散列索引首先查找行,其方法是使用散列,然后直接比较行来区分散列值相同的各行。如果散列大小足够大,则散列将唯一地标识某一行,而不读取和比较该行。但是,如果散列大小过大而页面大小较小,则索引可能需要较多的数据库页。
要散列列中的全部值,请注意下表中各数据类型所需的大小。UltraLite 仅在需要时才使用最大散列大小,并且从不超过指定的最大散列大小。如果列类型不使用全字节限制,UltraLite 会使用较小的散列大小。
数据类型 | 用于散列整个值的字节 |
---|---|
LONG VARCHAR、DOUBLE、FLOAT、REAL、LONG BINARY、ST_GEOMETRY |
不散列。 |
BIT、TINYINT |
1 |
SMALLINT |
2 |
INTEGER、DATE |
4 |
BIGINT、DATETIME、TIME、TIMESTAMP、TIMESTAMP WITH TIMEZONE |
8 |
DECIMAL、NUMERIC |
大致为除以二的精度。 |
CHAR、VARCHAR |
若要散列整个字符串,最大散列大小(以字节为单位)必须与声明的列大小相匹配。在 UTF-8 编码的数据库中,始终将声明的大小乘以因子 2,但不超过允许的最大 32 字节。 例如,如果在非 UTF-8 编码的数据库中声明一个列为 VARCHAR(10),则所需大小为 10 字节。但是,如果在 UTF-8 编码的数据库中声明同样的列,则用于散列整个字符串的大小为 20 字节。 在 UltraLite Java 版数据库中,使用长度可能为 1-3 个字符的 UTF-8 表示形式来散列各 VARCHAR 字符。UltraLite Java 版本使用 (3 * n) 字节散列 VARCHAR(n) 列。但是,当 VARCHAR(n) 列仅包含 ASCII7 字符时,可以指定 n 个字节的散列大小来散列所有值。 |
BINARY、VARBINARY |
最大散列大小(以字节为单位)必须与声明的列大小相匹配。 例如,如果声明一个列为 BINARY(30),则所需大小为 30 字节。 |
UNIQUEIDENTIFIER |
16 |
例如,如果为分别声明为 INTEGER 和 BINARY (20) 的两列复合索引设置 6 字节的最大散列大小,则基于数据类型大小需求,将发生以下变化:
散列 INTEGER 列中行的整个值并将其存储在索引中,因为散列整型数据只需要 4 字节。
只散列 BINARY 列的前 2 个字节并将其存储在索引中,因为 INTEGER 列使用了前 4 个字节。如果剩余的 2 字节不能散列 BINARY 列的适当数据量,则增加最大散列大小。
存储在数据库中的数据的行值也会影响散列索引的有效性。
例如,如果有一个在给定的列条目之间共享的公共前缀,则选择只能散列前缀的大小可能会使散列无效。在这种情况下,请选择一个可确保不仅只能散列公共前缀的大小。如果公共前缀很长,应考虑完全不散列值。
如果非唯一索引存储许多重复值,并且 UltraLite 无法散列整个值,则散列可能无法提高性能。
每个索引页都具有一些固定的开销,但实际的索引条目使用了大部分的页空间。较大的散列大小表明每个索引条目较大,这意味着一页上能够容纳的条目较少。对于大表,具有大散列的索引比具有小散列或无散列的索引使用更多的页。需要更多页会增大数据库的大小,并降低性能。因为高速缓存只能保存固定数量的页面从而导致 UltraLite 交换页面,所以通常导致性能降低。
下表给出了散列的大小如何影响存储索引中数据所需的页数的近似值。
表 | 页面大小 | 散列大小 | 条目数 | 所需页数 |
---|---|---|---|---|
表 A | 4 KB | 0 | 1200 | 3 页 |
表 B | 4 KB | 32 个字节 | 116 | 3 页 |
表 C | 4 KB | 32 个字节 | 1200 个条目 | 11 页 |
可通过两种方法设置最大散列大小:
要存储数据库的最大散列大小的缺省值,请在创建数据库时设置 max_hash_size 创建参数。如果不想以缺省的大小散列索引,将此值设置为 0。否则,可以将它更改为不超过 32 个字节的任何值,或保持 4 字节的 UltraLite 缺省值。
通过在创建新索引时设置特定散列大小来替换缺省值。可使用以下方法之一:
在 Sybase Central 中,创建新索引时设置 [最大散列大小] 属性。
若使用 SQL,则在 CREATE TABLE 或 CREATE INDEX 语句中使用 WITH MAX HASH SIZE 子句。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |