Important
此功能在 Beta 版中。 工作区管理员可以从 预览 页控制对此功能的访问。 请参阅 Manage Azure Databricks 预览版。
二级索引可加速对托管 Delta Lake 或 Iceberg 表中某一列进行选择性查找。 当Azure Databricks查询引擎确定辅助索引可以提供帮助时,它会自动使用索引跳过不能包含匹配数据的文件和行。 索引可能会显著减少扫描大型表的数据量。
辅助索引补充 Liquid 聚类分析,后者组织数据的物理布局。 辅助索引允许进行其他查询优化,而无需更改表的物理布局。 当工作负荷需要对不属于聚类分析键的列进行选择性查找时,这非常有用。
Important
在 Beta 期间创建的索引与更高版本中创建的索引不兼容。 当该功能达到公共预览版时,必须删除现有索引并创建新的索引。
要求
辅助索引具有计算、基表和架构权限以及基表配置的要求。
计算
辅助索引仅在 Azure Databricks Runtime 18.2 及更高版本中可用,必须在工作区设置中启用此 Beta 功能。 请参阅 Manage Azure Databricks 预览版。
Permissions
创建辅助索引:
- 您必须具有对索引中引用的表的
MODIFY权限。 - 您必须在父架构上具有
CREATE TABLE权限。 具有MANAGE权限的架构所有者或用户可以授予你CREATE TABLE对架构的权限。
表配置
在创建辅助索引之前,基表必须满足以下所有条件:
- 必须在与基表相同的目录和架构中创建索引。
- 该表是托管的 Delta Lake 表或 Iceberg 表。
- 行跟踪已启用 (
delta.enableRowTracking = true)。 请参阅 Databricks 中的行跟踪。 - 要编制索引的列必须是受支持的数据类型:数值类型、、
STRINGCHAR(n)或VARCHAR(n)TIMESTAMP。 - 该表未使用限制条件列表中的任何功能,包括:Delta Sharing、浅克隆、基于属性的访问控制、行级安全策略和列掩码。 请参阅限制。
有关适用于 Delta Lake 和 Iceberg 表的表协议要求的信息,请参阅 Delta Lake 功能兼容性和协议。
创建辅助索引
可以在单个表上创建最多四个索引,每个索引位于不同的列上。 四索引限制由辅助索引和全文搜索索引共享。 请参阅 Unity 目录托管表上的全文搜索索引。
用于CREATE INDEX在单个列上创建辅助索引,例如,对user_id现有表的列创建辅助索引: events
CREATE INDEX user_id_idx
ON events (user_id);
完整语法为:
CREATE INDEX [IF NOT EXISTS] index_name
ON table_name ( column_name )
index_name 在父架构中必须是唯一的,并且不能与现有表名匹配。
Warning
如果 CREATE INDEX 或 REFRESH INDEX 在执行过程中失败,请运行 REFRESH INDEX 以从部分失败中恢复。
使用辅助索引查询数据
表上存在辅助索引时,Azure Databricks查询引擎会自动使用它来加速索引列上具有选择性谓词的查询。
支持的谓词类型包括:
- 平等:
= - 设置成员身份:
IN
例如,如果您在列user_id上有一个user_id_idx二级索引,该索引会加速执行针对特定用户查找操作的查询:
SELECT * FROM events
WHERE user_id = '019982fe-002a-7621-8c20-b332eeb71f44';
管理索引
Important
如果基表发生更改,辅助索引不会自动更新。 请参阅 “刷新索引”。
无论索引新鲜度如何,Azure Databricks都保持查询正确性。 当表包含非索引数据时,查询使用现有索引来加速对索引记录的访问,并使用对非索引记录的表扫描。
使用以下操作来管理辅助索引:
描述或查看索引
若要查看有关索引的信息:
DESCRIBE INDEX user_id_idx;
刷新索引
基表更改时,辅助索引不会自动更新。
若要更新索引,请为新行添加条目:
REFRESH INDEX user_id_idx;
REFRESH INDEX 是一种增量式、仅追加的操作。 它为新数据编制索引,但不会删除已删除行的条目。
若要更新索引,请同时为新行添加条目和删除已删除行的条目,请使用 REFRESH INDEX ... FULL:
REFRESH INDEX user_id_idx FULL;
完全刷新需要比增量刷新更多的计算资源。 随着时间的推移,增量刷新会累积过时的条目,从而增加索引的大小,并对性能产生负面影响。
删除索引
若要删除索引,请运行以下命令:
DROP INDEX user_id_idx;
若要避免缺少索引的错误,请使用:
DROP INDEX IF EXISTS user_id_idx;
注释
如果删除基表,该命令也会删除辅助索引。
局限性
辅助索引具有以下限制:
- 不能重命名基表上的索引列或更改其数据类型。 相反,必须删除索引、更改列,然后重新创建索引。
- 不支持启用了 Delta Sharing 的表。 如果在创建索引后将基表添加为 Delta Sharing 源或目标,Azure Databricks 会忽略二级索引。
- 不支持浅克隆表。 如果在创建索引后将基表添加为浅表克隆源,Azure Databricks将忽略辅助索引。