【问题标题】:Oracle: Index organised table with null valuesOracle:具有空值的索引组织表
【发布时间】:2011-11-12 15:55:56
【问题描述】:

我有一个表,它基本上是一个带有列parent_idid 的树结构。

parent_idnull 对于根节点。

还有一个自引用外键,这样每个parent_id都有一个对应的id

此表主要是只读的,并且大多不经常批量更新。

访问此表的应用程序最常见的查询之一是select ... where parent_id = X。我认为如果此表是在parent_id 上组织的索引,这可能会更快。

但是,如果parent_id 可以是null,我不确定如何索引组织此表。我宁愿不要捏造东西,让parent_id=0 是一些特殊的 id,因为我必须向表中添加虚拟值以确保满足外键约束,并且它还会更改应用程序逻辑。

有没有办法通过可能的null 值列来索引组织表?

【问题讨论】:

标签: oracle indexing query-optimization


【解决方案1】:

我会尝试在单列 parent_id 上添加索引。

如果索引中的所有列都不为空,则该行不会出现在索引中。

所以对于你上面引用的parent_id = X,这应该使用索引。但是,如果您正在执行parent_id is null,那么它将不会使用索引,并且您将获得与现在相同的性能。这听起来像是适合您的行为。

我过去曾使用它来提高查询的性能。如果索引中的项目数与数据库中的行数相比很小,它会特别有效。我们在这个特定索引中有大约 3% 的行,而且它飞了 :-)

但是,与往常一样,您需要尝试并衡量性能差异。您的里程可能会有所不同。

【讨论】:

    【解决方案2】:

    提问者的解决方案:

    我发现我可以通过将查询列添加到 parent_id 索引的末尾来从索引组织中获得相同的好处,即,而不是:

    create index foo_idx on foo_tab(parent_id);
    

    我愿意:

    create index foo_idx on foo_tab(parent_id, col1, col2, col3);
    

    其中col1col2col3 等是经常访问的列。

    我只对用于返回多行的索引进行了此操作,这些行受益于索引提供的排序和磁盘局部性,而不必在表中跳来跳去。通常用于返回我留下的单行以引用表的索引,因为无论如何只有一行要读取,所以位置的重要性要小得多。

    就像我提到的,这是一个主要读取的表,而且空间不是一个大问题,所以我不认为这些索引引起的写入开销是一个大问题。

    (我意识到这不会索引nullparent_ids,而是我在decode(parent_id, null, 1, null) 上创建了另一个索引,它索引空值并且仅索引空值)。

    【讨论】:

    • +1 用于索引更多列,但 decode(parent_id, null, 1, null) 上的索引将无法按预期工作。该表达式总是返回 null。
    • @Florin:谢谢,但select decode(null, null, 1, null) from dual; 不返回 1 吗?
    • 哇,你是对的!返回1...我惊呆了。我知道 null 不等于 null。可能解码是一个特例。我很抱歉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2021-04-24
    • 2010-11-16
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多