Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » UltraLite - 数据库管理和参考 » 使用 UltraLite 数据库 » UltraLite 性能与优化

 

使用索引散列调整查询性能

可以通过选择最大散列的特定大小来调整查询的性能。散列键表示索引列的实际值。索引散列键旨在避免进行先查找行、后装载行然后再将行解出才能得出索引值的高开销操作。它通过将足够多的行实际数据与其行 ID 包括在一起来阻止这些操作。

UltraLite 通过行 ID 在数据库文件中定位实际行数据。如果将散列大小设置为 0(即禁用索引散列),则索引条目只包含此行的 ID。如果将散列大小设置为 0 以外的任意值,则仍使用散列键。散列键可以包含该行的所有或部分转换的数据,并与行 ID 一起存储在索引页中。

如何确定散列键包含行数据的多少:

  • 部分由您配置的最大散列大小属性决定。请参见选择最佳的散列大小

  • 部分由列数据类型的实际需求量决定。

一个散列示例

索引散列的值维护索引列实际行数据的顺序。例如,如果对 Employees 表的 LastName 列进行索引,您可以看到四个名字按以下顺序排列:

Anders

Anderseck

Andersen

Anderson

如果散列前六个字母,这些行值的散列键将按以下形式出现:

Anders

Anders

Anders

Anders

虽然这些条目看起来相同,但请注意列表中的第一个 Anders 用来表示 Anders 的实际行值。而列表中的最后一个 Anders 用来表示 Anderson 的实际行值。

现在,请看以下语句:

SELECT * 
FROM Employees
WHERE LastName = 'Andersen';

如果 Employees 表只包含很高比例的类似于 Andersen 的名字,那么散列键可能不会提供足够的唯一性来获得任何性能优势。在这种情况下,UltraLite 无法确定是否有某一散列键实际满足此语句的条件。当复制的索引散列键存在时,UltraLite 仍然需要:

  1. 查找与所述行 ID 匹配的表行。

  2. 装载数据再解开数据,以便计算值。

仅当 UltraLite 可以辨别一定比例的唯一散列,从而直接对索引本身进行查询条件求值时,才能体现出性能优势。例如,如果 Employees 表有数千个名字,则通过六个字母的散列仍能获得足够的益处。但是,如果 Employees 表只包含过多的以 Anders* 开始的名字,则应至少散列七个字母,以便唯一键的程度增大。所以,现在怎样用这些散列键表示此示例开始时的最初的四个名字。

Anders

Anderse

Anderse

Anderso

现在只需解开并计算四个行值中的两个,而不是全部四个。

另请参见