【问题标题】:How to create index for dynamic search strings如何为动态搜索字符串创建索引
【发布时间】:2011-01-08 15:00:48
【问题描述】:

我有一个小数据库,仅用于学术目的,我最多有对象表。 我在 Power Designer 中创建了一个实体关系模型 (ERM),该程序默认为每个表的序列 ID 创建索引。

  1. 我想知道如何使用索引 就像在查询中那样。说我会 想通过 id 查找产品, 但使用它的索引。
  2. 是否可以做select value(s) from supplierf where s.name LIKE '%search%' order by s.name 使用索引进行搜索 那?我知道可以创建 名称的索引,但用于搜索 我不知道怎么回事 工作。

让我说,我知道 Oracle 决定何时或是否值得在查询中使用索引,但我可能必须至少尝试在我的 BD 项目中使用索引

【问题讨论】:

    标签: sql oracle plsql indexing


    【解决方案1】:

    1。 通过将列定义为PRIMARY KEY(这可能是您的 id 列),Oracle 隐含地为该列创建索引。当您使用WHERE id=123 进行选择时,它很可能会决定使用该索引)。您可以在查询中提供 hint 以使 Oracle 使用索引(在大多数情况下),但这对您来说不是必需的。

    2。 Oracle 不太可能使用LIKE 的索引(除非您知道您的文本以搜索的字符串开头并且您可以使用'xyz%')。有关何时以及如何使用索引进行全表扫描的更多信息,请参阅 Tony Andrews' post

    关于Oracle LIKE clause searches with text indexes 的文章应提供有关处理全文搜索的方法的信息。

    【讨论】:

    • +1:如果列的索引不存在,Oracle 会自动为主键创建索引。
    • Re (2),可以使用 LIKE '%text%' 创建用于搜索的索引,尽管 Oracle 选择使用该索引的可能性很小。如果您确定它会更好地执行,您可以使用提示让 Oracle 使用该索引。
    • @Tony Andrews:感谢您提供有关索引的其他信息 - 调整了我的帖子并添加了指向您答案的链接。
    【解决方案2】:

    关于您的第 1 点。):我不清楚您的意思:如果您合理地分配索引,您可以使用索引提示来强制使用索引,但让优化器首先完成它的工作,然后,如果您的索引未被使用,请分析 why(可能是特定情况下的索引使用不是最快的方法)。例如,如果您将按 id 进行的搜索与使用通配符匹配的搜索结合起来,优化器可能会决定,如果无论如何都必须进行完整的表扫描(因为您的 '%search%' 术语)没有额外的好处使用 id 列上的索引。

    关于您的第 2 点。):如果您在搜索词的开头使用通配符匹配,则(非常)不太可能使用索引。对于这样的搜索,请在此处查看 Oracle 全文语法:

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

    【讨论】:

      【解决方案3】:

      是否可以从supplierf 中选择值,其中s.name LIKE '%search%' order by 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 中找到每个结果对 T 进行 1 次 ROWID 查找。

      假设 T 有 100,000 行,其中只有 5 行符合您的搜索条件。再假设表 T 占用 5000 个块,索引 T_I 占用 1000(即只有 T 大小的 20%)。

      查询的实际读取成本为:

      1. 5000 次读取(T)
      2. 1000 次读取(T_I),然后是 5 次按 ROWID 读取的 T = 1005 次读取

      显然在这种情况下索引更好。但是,Oracle 倾向于假设 LIKE 查询将返回 5% 的行(即 5000 行),因此其估计成本(以读取为单位)将为:

      1. 5000 次读取(T)
      2. 1000 次读取(T_I),然后是 5000 次按 ROWID 读取的 T = 6000 次读取

      因此在本例中,Oracle 将进行全表扫描,尽管索引搜索会更快。您可以提示查询使用索引:

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

      但是,请注意,只有当您确定查询在大多数情况下返回的行数少于 5% 时,这才会更好。

      【讨论】:

        猜你喜欢
        • 2011-02-04
        • 2011-10-13
        • 1970-01-01
        • 2017-07-23
        • 2011-12-06
        • 1970-01-01
        • 1970-01-01
        • 2020-07-28
        • 1970-01-01
        相关资源
        最近更新 更多