Oracle CONNECT BY查询的索引和时间复杂度?

时间:2015-10-19 13:43:17

标签: sql oracle indexing time-complexity connect-by

我有多个分层菜单存储在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个项目的小型数据集,因为我还没有完整的数据集。出于空间原因,我排除了一些列。如果您需要输出中的任何其他内容,请告诉我。

1 个答案:

答案 0 :(得分:1)

入口点为parent IS NULL,默认情况下永远不会使用任何索引,因此您可以获得全表扫描。此表达式的基于函数的索引可能对大数据量有用。然后递归使用父级和菜单访问表,因此父级和菜单上的组合索引可能是合理的。虽然正确的索引可能会显着减少它们的影响,但是说执行时间应该是你提到的所有标准的函数。