2014-08-29 76 views
0

比方说,如果有一个包含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") 

但上述情况只是说明是否有必要索引列上,如果加入大的小桌子表。

+0

“是否需要”否,它将在没有索引的情况下工作。是否需要良好的性能?尝试两种方式。 – 2014-08-29 16:40:38

回答

1

您可能不需要需要出于性能方面的原因,因为整个TB_SMALL可能适合一个或两个块,并且可以通过完全扫描来访问,就像索引(可能更快)一样快。但是:

  1. 为了保持数据的完整性,每个表应该有一个主键,主键需要一个指标,所以实际上你应该有一个指标呢。 (事实上​​,TB_SMALL将是一个很好的候选人,可以作为index-organized table(IOT))。

  2. 由于表格很小,因此索引不会浪费空间,因此您可以将它编入索引并让优化程序决定是否使用它。

+0

谢谢。如果加入查询中的where条件检查名称值,您是否认为还需要为TB_SMALL.name字段放置索引? – Dreamer 2014-08-29 18:54:14

+0

否(再次,除非这需要是唯一的,在这种情况下应该添加一个唯一的约束,这需要一个索引来支持它)。 – 2014-08-30 09:19:16