2011-06-15 159 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