为了在Oracle视图中搜索,是否需要索引列?
比方说,如果有一个包含50行结构简单称为TB_SMALL
一张小桌子:为了在Oracle视图中搜索,是否需要索引列?
TB_SMALL
---------------
ID | NAME
---------------
......
......
还有另一个表持有大量所谓TB_HUGE
数据,包含一百万行:
TB_HUGE
------------------------------------------------------------------------
ID | FIELD 1 | TB_SMALL_ID | FIELD 1 | ...... | FIELD n |
------------------------------------------------------------------------
......
......
因此,TB_HUGE
有一个索引为TB_SMALL
的外键。然而,如果有需要加入这两个表只是由特定TB_SMALL.name
搜索,我认为它是一种常见的情况下,像这样
SELECT TB_HUGE.*
FROM TB_HUGE JOIN TB_SMALL ON TB_HUGE.TB_SMALL_ID=TB_SMALL.id
WHERE TB_SMALL.name = "somename";
是有必要的索引TB_SMALL.NAME
列?
*可能是它不是一个很好的例子,因为查询可以换到
WHERE TB_HUGE.TB_SMALL_ID EXIST (SELECT ID FROM TB_SMALL WHERE NAME="somename")
但上述情况只是说明是否有必要索引列上,如果加入大的小桌子表。
您可能不需要需要出于性能方面的原因,因为整个TB_SMALL可能适合一个或两个块,并且可以通过完全扫描来访问,就像索引(可能更快)一样快。但是:
为了保持数据的完整性,每个表应该有一个主键,主键需要一个指标,所以实际上你应该有一个指标呢。 (事实上,TB_SMALL将是一个很好的候选人,可以作为index-organized table(IOT))。
由于表格很小,因此索引不会浪费空间,因此您可以将它编入索引并让优化程序决定是否使用它。
谢谢。如果加入查询中的where条件检查名称值,您是否认为还需要为TB_SMALL.name字段放置索引? – Dreamer 2014-08-29 18:54:14
否(再次,除非这需要是唯一的,在这种情况下应该添加一个唯一的约束,这需要一个索引来支持它)。 – 2014-08-30 09:19:16
“是否需要”否,它将在没有索引的情况下工作。是否需要良好的性能?尝试两种方式。 – 2014-08-29 16:40:38