1

我有多个分层菜单存储在 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

(一个菜单中可能有多个根,所以我不能只使用没有连接依据的普通连接。)

我需要创建哪些索引来优化此查询?我已经有一个组合索引idmenu确保唯一性,但我还需要更多吗?

此外,考虑到我创建了正确的索引,这个查询的时间复杂度是多少?是否与项目总数、每个菜单的数量、菜单的深度有关?

编辑:这是输出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 个项目的小数据集上,因为我还没有完整的数据集。由于篇幅原因,我排除了一些列。如果您需要输出中的其他内容,请告诉我。

4

1 回答 1

1

入口点parent IS NULL默认情况下从不使用任何索引,因此您将获得全表扫描。基于此表达式的基于函数的索引可能对大数据量有帮助。然后递归使用父级和菜单访问表,因此父级和菜单上的组合索引可能是合理的。话虽如此,执行时间应该是您提到的所有标准的函数,尽管适当的索引可能会显着降低它们的影响。

于 2015-10-28T11:07:10.670 回答