2014-08-29 105 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