是否有可能从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%';
有两个明显的方式这个查询可以回答:
- 对T全表扫描
- 在T_I上进行全索引扫描,然后在T_I中找到每个结果的TOWID查找。
假设T有100,000行,并且只有5个符合您的搜索条件。假设表格T占据了5000个块,并且索引T_I占据了1000(即只有T的20%)。
查询的读入的术语的实际的成本则是:
- 5000读取(的T)
- 1000读取(T_I的),接着加入5通过ROWID的T读取= 1005读取
显然在这种情况下,指数更好。但是,Oracle倾向于假定LIKE查询将返回行(即5000行)的5%,因此其费用估计(在读)将是:
- 5000读取(的T)
- 1000通过ROWID = 6000读取T(T_I)5000个读取的T读取
因此,在本例中,虽然索引搜索会更快,但Oracle将进行全表扫描。你可以提示查询使用索引:
select /*+ index(t t_i) */ from t where text like '%something%';
但是,请注意,这只是更好,如果你确信查询将返回大部分时间行的不到5%。
+1:如果列的索引尚不存在,Oracle会自动为主键创建索引。 – 2010-01-23 20:25:43
Re(2),尽管Oracle选择使用索引的可能性很小,但它**有可能创建一个用LIKE'%text%'搜索的索引。如果您确信它会更好地运行,您可以使用提示让Oracle使用索引。 – 2010-01-24 11:21:16
@Tony Andrews:感谢您提供有关索引的更多信息 - 调整了我的文章并添加了链接到您的答案。 – 2010-01-25 07:20:26