Oracle CONNECT BY 查询的索引和时间复杂度?
Indexes and time complexity for Oracle CONNECT BY query?
我在 Oracle 11g table(称为 items
)中存储了多个分层菜单,结构如下:
menu
:项目所属菜单的 ID。
id
:菜单项的 ID。在菜单中是唯一的,但在 table. 中不是
name
: 菜单项的名称。
parent
: 父菜单项的 id
(总是在同一个菜单中)。
table 包含大约 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 个项目的小数据集,因为我还没有完整的数据集。出于 space 原因,我排除了一些列。如果您需要输出中的任何其他内容,请告诉我。
入口点是 parent IS NULL
,默认情况下从不使用任何索引,因此您可以进行完整的 table 扫描。基于此表达式的基于函数的索引可能对大数据量有帮助。然后递归使用父级和菜单访问 table,因此父级和菜单的组合索引可能是合理的。话虽如此,执行时间应该是您提到的所有标准的函数,但适当的索引可能会显着降低它们的影响。
我在 Oracle 11g table(称为 items
)中存储了多个分层菜单,结构如下:
menu
:项目所属菜单的 ID。id
:菜单项的 ID。在菜单中是唯一的,但在 table. 中不是
name
: 菜单项的名称。parent
: 父菜单项的id
(总是在同一个菜单中)。
table 包含大约 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 个项目的小数据集,因为我还没有完整的数据集。出于 space 原因,我排除了一些列。如果您需要输出中的任何其他内容,请告诉我。
入口点是 parent IS NULL
,默认情况下从不使用任何索引,因此您可以进行完整的 table 扫描。基于此表达式的基于函数的索引可能对大数据量有帮助。然后递归使用父级和菜单访问 table,因此父级和菜单的组合索引可能是合理的。话虽如此,执行时间应该是您提到的所有标准的函数,但适当的索引可能会显着降低它们的影响。