2010-01-23 51 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