【发布时间】:2023-03-09 14:45:01
【问题描述】:
我最近在阅读有关 Oracle 索引组织表 (IOT) 的文章,但不确定我是否完全了解何时使用它们。所以我有一张小桌子:
create table categories
(
id VARCHAR2(36),
group VARCHAR2(100),
category VARCHAR2(100
)
create unique index (group, category, id) COMPRESS 2;
id 列是来自另一个表 entries 的外键,我的常见查询是:
select e.id, e.time, e.title from entries e, categories c where e.id=c.id AND e.group=? AND c.category=? ORDER by e.time
条目表已正确编入索引。
这两个表都有数百万行(目前为 1600 万行),目前这个查询真的很糟糕(注意:我也将它包装在分页查询中,所以我只取回前 20 行,但为简单起见,我省略了)。
既然我基本上是在索引整个表,那么将这个表创建为 IOT 是否有意义?
编辑应大众需求:
create table entries
(
id VARCHAR2(36),
time TIMESTAMP,
group VARCHAR2(100),
title VARCHAR2(500),
....
)
create index (group, time) compress 1;
我认为我真正的问题并不取决于此。基本上,如果您有一个包含少量列的表(本例中为 3 列)并且您计划在所有三行上放置一个复合索引,是否有任何理由不使用 IOT?
【问题讨论】:
-
可以显示条目表+索引吗?
-
两张表之间的基数是多少?我对您声明“两个表都有 16M 行”这一事实感到有些困惑。 - 类别表的主键是什么......你提到的唯一索引? - 组和类别听起来和我很相似.. 有什么区别? (基本上,我正在寻找有关如何提高查询性能的方法,无论类别是否为 IOT,都不应受到影响。)
-
所以条目是分组存储的,一个条目可以有多个类别。所以实际上如果条目有 1600 万行,那么理论上类别可以有更多。组和类别彼此无关。