2011-06-15 151 views
1

我試圖優化的Oracle查詢,看起來像這樣:優化字符串搜索Oracle查詢

select * from upcTable where upc like '%567%' 

查詢速度快像567小型搜索詞,但它可以得到,只要15位其中可能需要約1.5秒。無論如何加快這一點?

我試着做這樣

select * from 
(select * from rldb.productmaster where upc like '%567%') 
where upc like '%380%' 

select * from rldb.productmaster where upc like '%567380%' 

東西在這種情況下,項數,如果差不多的,但第一個例子是有點快。但是,對於15位數字使用相同的技術時,速度會更快,但速度太慢。

+1

沒有理由爲什麼'%567%'會比'%567380%'更快地返回所有行(因爲它必須掃描相同的源數據量)。它可能看起來更快,因爲匹配的字符串越短,查找匹配的機會就越多,因此它將返回前面的第一個匹配項。如果您正在通過電話簿尋找名字中帶有「J」字符的人,那麼您的名單將比搜索名稱中帶有「JU」字符的名單更快。 – 2011-06-16 00:27:22

回答

1

您將不會使用任何執行'%123%'(前導%)的索引。如果您可以使用'123%'進行搜索,那麼您可以利用索引。

+0

這是事實,但我必須使用這兩個%。用戶不會完全知道UPC,所以這個功能是爲了添加一個「自動完成」的項目UPC可能55000,但在數據庫中它存儲爲00055000 – Overload119 2011-06-15 13:24:04

+0

沒有任何其他限制,你基本上讓用戶搜索對於字段中任何長度的任何字符串,因此數據庫將需要執行全面掃描以確定匹配。 – tbone 2011-06-15 13:38:11

+0

不一定是真的... – 2011-06-15 13:38:21

5

如果索引這樣的柱:

create index upcIndex on upcTable (upc, pk); 

(其中pk是表中的主鍵)

然後該查詢可以在該索引執行索引快速全SCAN:

select pk from upcTable where upc like '%567380%'; 

如果你真的需要所有的列(SELECT *),那麼你可以試試這個:

select * from upcTable where pk in 
(select pk from upcTable where upc like '%567380%'); 
+0

+1,很好的解決方案! – tbone 2011-06-15 14:13:51