可以通过选择最大散列的特定大小来调整查询的性能。散列键表示索引列的实际值。索引散列键旨在避免进行先查找行、后装载行然后再将行解出才能得出索引值的高开销操作。它通过将足够多的行实际数据与其行 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 仍然需要:
查找与所述行 ID 匹配的表行。
装载数据再解开数据,以便计算值。
仅当 UltraLite 可以辨别一定比例的唯一散列,从而直接对索引本身进行查询条件求值时,才能体现出性能优势。例如,如果 Employees 表有数千个名字,则通过六个字母的散列仍能获得足够的益处。但是,如果 Employees 表只包含过多的以 Anders* 开始的名字,则应至少散列七个字母,以便唯一键的程度增大。所以,现在怎样用这些散列键表示此示例开始时的最初的四个名字。
Anders
Anderse
Anderse
Anderso
现在只需解开并计算四个行值中的两个,而不是全部四个。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |