2015-11-06 118 views
-4

我有一个巨大的表(在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 

所以就没有必要在col1或COL2单个索引..如果COL3由本身查询

(其中,COL3 =“等等”)

我需要一个col3上的索引。

如果COL2和COL3是一起查询

(其中COL2 = '嗒嗒' 和COL3 = 'blahblah')

然后我需要col2上,COL3指数...但如果我有一个查询在哪里col2和col3一起使用比我不需要在任何一个单一的索引。 这一切听起来如何?

+0

“巨​​大的桌子”是一个术语,对不同的人意味着不同的事物。告诉我们您有多少行,多少列,您的操作系统,分配了多少内存,您注意到了哪些性能问题,这是一个新表格或现有表格,生产数据库还是测试? – kevinsky

+0

我有一个200GB的表,其中200GB的索引每秒更新〜170次...上下文就是一切,你应该做你所需要的。 – Ben

+0

该表格的大小为5 GiB,并将增长...它有24列...我意识到事情通常是针对具体情况而定的,但我只是在寻找一些一般的见解。 OS是SuSE,内存为4 GiB。测试数据库所以会有更多的资源来生产... – benjamin

回答

1

你的理解是正确的。如果在where子句中包含索引的前导列,“正常”btree组合索引通常仅用于加快查询速度。

因此,如果您在c1,c2和c3上有一个索引,并发出只在c2上过滤的查询,则索引可能无用。我之所以说可能是因为有些情况下Oracle可以使用该索引。一个是它可以进行跳跃扫描的地方(但是在使用类似的东西的时候,我没有很好的表现)。另一种情况是,如果表中的行数很大会使表变大,但c1,c2和c3列的值很小,那么索引的大小可能会比表的大小小得多,Oracle可以使用索引(通过快速全面扫描)来回答查询。

如果您经常需要用c1或者c2或者c3查询,那么您可能需要3个索引。一如既往,这取决于您的数据和要求,最重要的是什么。