Sql 仅仅为了在Oracle视图中搜索,是否需要为列编制索引?

Sql 仅仅为了在Oracle视图中搜索,是否需要为列编制索引?,sql,database,oracle,indexing,Sql,Database,Oracle,Indexing,假设有一个名为TB_small的小表,其中包含50行,结构简单: TB_SMALL --------------- ID | NAME --------------- ...... ...... 还有另一个包含大量数据的表,称为TB_-hug,包含一百万行: TB_HUGE ------------------------------------------------------------------------ ID | FIELD 1 | TB_SMAL

假设有一个名为
TB_small
的小表,其中包含50行,结构简单:

TB_SMALL
---------------
ID     |  NAME
---------------
......
......
还有另一个包含大量数据的表,称为
TB_-hug
,包含一百万行:

    TB_HUGE
------------------------------------------------------------------------
ID     |  FIELD 1  |  TB_SMALL_ID  |  FIELD 1  |  ......  |  FIELD n  |
------------------------------------------------------------------------
......
......
因此,
TB\u-SMALL
有一个外键索引到
TB\u-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\u SMALL.NAME

*可能这不是一个好例子,因为查询可以更改为

WHERE TB_HUGE.TB_SMALL_ID EXIST (SELECT ID FROM TB_SMALL WHERE NAME="somename")

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

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

  • 为了保持数据完整性,每个表都应该有一个主键,而主键需要一个索引,所以实际上您应该有一个索引。(事实上,TB_SMALL将是成为(IOT)的一个很好的候选者)

  • 由于表很小,所以使用索引不会浪费很大的空间,因此您也可以对其进行索引,并让优化器决定是否使用它


  • “是否有必要”不,它将在没有索引的情况下工作。是否需要良好的性能?两方面都试试。谢谢。如果连接查询中的where条件检查名称值,您认为是否也有必要为TB_SMALL.name字段放置索引?否(同样,除非这需要是唯一的,在这种情况下,应添加唯一约束,并且需要索引来支持它)。