我有多个分层菜单存储在 Oracle 11g 表(称为items
)中,结构如下:
menu
: 项目所属菜单的 ID。id
: 菜单项的 ID。在菜单中是唯一的,但不是在表中。name
:菜单项的名称。parent
:id
菜单项的父级(总是在同一个菜单中)。
该表包含大约 100.000 行。我使用以下查询生成所有菜单项及其相应根项的列表:
SELECT
name,
CONNECT_BY_ROOT name AS root
FROM
items
CONNECT BY
PRIOR id = parent AND
PRIOR menu = menu
START WITH
parent IS NULL
(一个菜单中可能有多个根,所以我不能只使用没有连接依据的普通连接。)
我需要创建哪些索引来优化此查询?我已经有一个组合索引id
并menu
确保唯一性,但我还需要更多吗?
此外,考虑到我创建了正确的索引,这个查询的时间复杂度是多少?是否与项目总数、每个菜单的数量、菜单的深度有关?
编辑:这是输出EXPLAIN PLAN
:
ID | PARENT_ID | OPERATION | OPTIONS | OPTIMIZER
---+-----------+------------------+------------------------------+------------------
0 | | SELECT STATEMENT | | SELECT STATEMENT
1 | 0 | CONNECT BY | NO FILTERING WITH START-WITH | CONNECT BY
2 | 1 | TABLE ACCESS | FULL | TABLE ACCESS
但是,这只是在 100 个项目的小数据集上,因为我还没有完整的数据集。由于篇幅原因,我排除了一些列。如果您需要输出中的其他内容,请告诉我。