【问题标题】:Which is quicker for searches in Oracle在 Oracle 中搜索哪个更快
【发布时间】:2012-05-16 16:58:59
【问题描述】:

我正在尝试加速数据库应用程序,我目前正在寻找对应用程序影响较小的简单方法。

我想知道什么是搜索字符串是否满足条件的最有效方法。使用第一个选项是否有任何正当理由。

假设有一个字段调用状态,它只会将值存储为 Discontinued。

  • status NOT LIKE 'Disc%'
  • status != '停产'
  • 状态“停产”

【问题讨论】:

  • 尝试这个有什么难的?
  • status 还可以包含哪些其他值?

标签: sql performance oracle query-optimization


【解决方案1】:

没有理由使用NOT LIKE。是否使用不等式运算符的!=<> 形式完全取决于个人喜好。

【讨论】:

    【解决方案2】:

    出于讨论的目的,我假设 STATUS 字段可以为空,因此将包含两个值,“Discontinued”或 NULL。如果是这种情况,您上面的任何查询都不会产生预期的结果。当 NULL 与任何东西进行比较时,它返回 NULL 而不是 TRUE 或 FALSE,因此当谓词为 STATUS <> 'Discontinued' 或其他时,不会返回 STATUS 为 NULL 的行。要获得结果,我认为您必须说 STATUS IS NULL

    分享和享受。

    【讨论】:

      【解决方案3】:

      我会投票给第二个。第一个将强制执行 TABLE SCAN。

      写两个,解释计划,然后看看。

      【讨论】:

      • LIKENOT LIKE 不一定排除在status 上使用索引(假设任何谓词都具有足够的选择性,因此使用索引是合适的)。然而,使用带有通配符的LIKENOT LIKE 确实倾向于使优化器的基数估计更可能不正确,因此它增加了不使用有用索引的机会。
      【解决方案4】:

      包含单个值或空值的列不太可能对您对该表运行的任何查询的性能产生任何影响,尤其是当您正在搜索的行时> 等于那个值。

      因此,无论该列是否已编入索引,这些选项中的任何一个都将表现同样出色。但是,作为一种意图的表达——无论是对你的开发人员和数据库优化器——最好将其编码为:

      status is null   
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 2011-09-24
        • 2018-08-13
        • 1970-01-01
        相关资源
        最近更新 更多