给出Oracle数据库的以下索引:
CREATE INDEX subject_x1 ON subject (code);
CREATE INDEX subject_x2 ON subject (code, status);
第一个索引是多余的,可以删除。我们需要做到这一点,因为这是一个相对较大的桌子,将不断受到重创。
任何解释或确认这一点的oracle文档都会非常有用。
答案 0 :(得分:12)
与大多数数据库问题一样,它取决于: - )
实际上,不应该在所有情况下删除它。如果您的查询在code
子句中单独使用where
,那么subject_x1
的使用可能仅仅因为索引较少而仍然优于subject_x2
需要读入数据。
一个极端的例子,假设code
是char(2)
而status
是char(4094)`。如果您有查询:
select code from tbl where code > 'dd' and code < 'gg';
这最有可能导致仅索引扫描,因为绝对没有理由去表。如果您使用subject_x1
并从索引中读取4K块,则每次读取时都会引入几千个代码。
通过使用subject_x2
,每个只读给你一个代码(可能是浪费状态)。这是性能上的巨大差异。
然而,我不能强调这一点,衡量,不要猜测!
使用两个索引来描述您的查询(和更新)以查看哪个表现更好,并使用代表性数据进行。如果您发现subject_x1
为某些查询提供了更好的性能,请将其保留。它会影响更新/插入速度和存储要求,但您会发现这通常不重要,因为: