【问题标题】:Is it necessary to index columns just for searching in Oracle views?是否需要索引列仅用于在 Oracle 视图中搜索?
【发布时间】:2014-08-29 16:27:06
【问题描述】:

假设有一个名为TB_SMALL 的小表包含50 行且结构简单:

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")

但上面的例子只是为了说明如果与大表连接,是否需要在小表上索引列。

【问题讨论】:

  • "是否有必要" 不,它可以在没有索引的情况下工作。是否需要良好的性能?尝试两种方式。

标签: sql database oracle indexing


【解决方案1】:

出于性能原因,您可能不需要需要,因为整个 TB_SMALL 可能适合单个或两个块,并且可以通过完全扫描与通过索引一样快地访问(也许更快)。然而:

  1. 为了保持数据完整性,每个表都应该有一个主键,而主键需要一个索引,所以事实上无论如何你都应该有一个索引。 (事实上​​,TB_SMALL 很适合成为index-organized table (IOT))。

  2. 由于表很小,有索引不会浪费空间,所以你不妨索引它,让优化​​器决定是否使用它。

【讨论】:

  • 谢谢。你认为如果连接查询中的 where 条件检查 name 值,是否还需要为 TB_SMALL.name 字段放置索引?
  • 否(同样,除非这需要是唯一的,在这种情况下应该添加唯一约束并且需要索引来支持它)。
猜你喜欢
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2010-11-21
  • 2012-11-13
  • 1970-01-01
相关资源
最近更新 更多