我有一个庞大的表(在Oracle 12c中),当然需要索引。 这个表也经常更新,所以如果我学到的东西是正确的那么我在这个表上的索引越少,在所述表上进行DML操作时性能就越好。
当然,我想拥有正确数量的索引,以便对它的查询不会受到影响。
我把这个小例子放在一起作为一种创建索引的指南。这看起来准确吗?
CREATE INDEX FOO ON FOO.BAR ("COL1", "COL2", "COL3"); -- COL1 should be the column which is most frequently queried
SELECT * FROM FOO WHERE COL1 = 'FOO'; -- uses index FOO
SELECT * FROM FOO WHERE COL1 = 'FOO' AND COL2 = 'BAR'; -- uses index FOO
SELECT * FROM FOO WHERE COL1 = 'FOO' AND COL2 = 'BAR' AND COL3 = 'BAZ' -- uses index FOO
因此,如果col3被自己查询,就不需要在col1或col2上使用单个索引
(其中col3 =' blah')
我需要col3的索引。
如果同时查询col2和col3
(其中col2 =' blah' col3 =' blahblah')
然后我需要一个关于col2,col3的索引...但是如果我有一个查询,其中col2和col3一起使用,而不是我不需要col上的单个索引。 这听起来怎么样?
答案 0 :(得分:1)
您的理解是正确的。 A'正常'如果在where子句中包含索引的前导列,btree复合索引通常仅对加速查询有用。
因此,如果您在c1,c2和c3上有索引并且发出仅在c2上过滤的查询,则该索引可能没用。我说可能是因为有些情况下Oracle可以使用该索引。一个是它可以进行跳过扫描的地方(但是在使用类似的东西时,我没有太多的运气表现)。另一种情况是,如果表中有非常宽的行使表大,但列c1,c2和c3是小值,则索引的大小可能远小于表的大小,Oracle可以使用索引(通过快速全扫描)来回答查询。
如果您经常需要仅使用c1或c2或c3进行查询,则可能需要3个索引。一如既往,这取决于您的数据和要求最有意义。