2010-01-23 94 views
4

我有一個小數據庫,僅用於學術目的,而且我最多有對象表。 我在Power Designer中創建了一個實體關係模型(ERM),該程序默認爲每個表的序列標識創建索引。如何爲動態搜索字符串創建索引

  1. 我想知道我怎麼使用這樣的一個指數 上query.Say我會 希望通過其ID, 但使用它的索引來查找產品。
  2. 是否有可能使用索引做這樣 ,搜索做select value(s) from supplierf where s.name LIKE '%search%' order by s.name ?我知道有可能爲名稱創建 索引,但對於搜索 就像我不知道 是如何工作的。

讓我說,我知道,甲骨文決定何時或是否在查詢中使用索引的價值,但我可能不得不放棄,至少,嘗試在我的BD項目採用指數法

回答

3

關於你點1):我不清楚你的意思:如果指定索引理智,你可以使用索引提示強制索引的使用,但它是一個更好的主意,讓optimzer做的工作第一,那麼,如果不使用索引,分析爲什麼(也可能是在特定情況下該指數的使用不是最快的方式)。例如,如果您將id搜索與使用通配符匹配的搜索相結合,則優化程序可能會決定,如果它必須是完整的表掃描(因爲您的術語爲'%search%'),那麼使用索引在你的id列上。

關於你提到的第2點):它是(非常)不太可能的索引可以,如果你正在使用的通配符匹配的搜索詞的開頭使用。對於這樣的搜索,看看甲骨文全文語法在這裏:

http://www.oracle.com/technology/products/text/index.html

6

1. 通過定義列PRIMARY KEY(這就是你的id列最有可能的是),甲骨文隱含創建索引本專欄。當您選擇WHERE id=123時,它很可能會決定使用該索引)。您可以在查詢中提供hint以使Oracle使用索引(在大多數情況下),但這不應該是您必需的。

2. Oracle不太可能使用LIKE的索引(除非您知道文本以搜索字符串開頭,並且可以使用'xyz%')。有關何時以及如何在全表掃描中使用索引的更多信息,請參閱Tony Andrews' post

有關Oracle LIKE clause searches with text indexes的文章應該提供有關處理全文搜索的方法的信息。

+0

+1:如果列的索引尚不存在,Oracle會自動爲主鍵創建索引。 – 2010-01-23 20:25:43

+1

Re(2),儘管Oracle選擇使用索引的可能性很小,但它**有可能創建一個用LIKE'%text%'搜索的索引。如果您確信它會更好地運行,您可以使用提示讓Oracle使用索引。 – 2010-01-24 11:21:16

+0

@Tony Andrews:感謝您提供有關索引的更多信息 - 調整了我的文章並添加了鏈接到您的答案。 – 2010-01-25 07:20:26

3

是否有可能從supplierf中進行選擇,其中s.name LIKE'%search%'按照s.name的順序使用索引來執行這樣的搜索?我知道可以爲這個名字創建索引,但對於這樣的搜索我不知道事情是如何工作的。

是的,但Oracle可能會選擇不使用基於統計的索引。您可以告訴Oracle通過提示使用索引,但是索引是否真正起作用取決於您的數據。假設你有這樣的表和索引:

create table t (id integer primary key, text varchar2(50), other_cols...); 
create index t_i on t (text); 

你再這樣做選擇:

select * from t where text like '%something%'; 

有兩個明顯的方式這個查詢可以回答:

  1. 對T全表掃描
  2. 在T_I上進行全索引掃描,然後在T_I中找到每個結果的TOWID查找。

假設T有100,000行,並且只有5個符合您的搜索條件。假設表格T佔據了5000個塊,並且索引T_I佔據了1000(即只有T的20%)。

查詢的讀入的術語的實際的成本則是:

  1. 5000讀取(的T)
  2. 1000讀取(T_I的),接着加入5通過ROWID的T讀取= 1005讀取

顯然在這種情況下,指數更好。但是,Oracle傾向於假定LIKE查詢將返回行(即5000行)的5%,因此其費用估計(在讀)將是:

  1. 5000讀取(的T)
  2. 1000通過ROWID = 6000讀取T(T_I)5000個讀取的T讀取

因此,在本例中,雖然索引搜索會更快,但Oracle將進行全表掃描。你可以提示查詢使用索引:

select /*+ index(t t_i) */ from t where text like '%something%'; 

但是,請注意,這只是更好,如果你確信查詢將返回大部分時間行的不到5%。

+0

+1:謝謝,調整了我的文章並添加了鏈接到您的答案。 – 2010-01-25 07:21:01

+0

謝謝,我現在已經解決了。 – 2010-01-25 12:20:11