在 Oracle 中搜索哪个更快
Posted
技术标签:
【中文标题】在 Oracle 中搜索哪个更快【英文标题】:Which is quicker for searches in Oracle 【发布时间】:2012-05-16 16:58:59 【问题描述】:我正在尝试加速数据库应用程序,我目前正在寻找对应用程序影响较小的简单方法。
我想知道什么是搜索字符串是否满足条件的最有效方法。使用第一个选项是否有任何正当理由。
假设有一个字段调用状态,它只会将值存储为 Discontinued。
status NOT LIKE 'Disc%' status != '停产' 状态“停产”【问题讨论】:
尝试这个有什么难的? status 还可以包含哪些其他值? 【参考方案1】:没有理由使用NOT LIKE
。是否使用不等式运算符的!=
或<>
形式完全取决于个人喜好。
【讨论】:
【参考方案2】:出于讨论的目的,我假设 STATUS 字段可以为空,因此将包含两个值,“Discontinued”或 NULL。如果是这种情况,您上面的任何查询都不会产生预期的结果。当 NULL 与任何东西进行比较时,它返回 NULL 而不是 TRUE 或 FALSE,因此当谓词为 STATUS <> 'Discontinued'
或其他时,不会返回 STATUS 为 NULL 的行。要获得结果,我认为您必须说 STATUS IS NULL
。
分享和享受。
【讨论】:
【参考方案3】:我会投票给第二个。第一个将强制执行 TABLE SCAN。
写两个,解释计划,然后看看。
【讨论】:
LIKE
或NOT LIKE
不一定排除在status
上使用索引(假设任何谓词都具有足够的选择性,因此使用索引是合适的)。然而,使用带有通配符的LIKE
或NOT LIKE
确实倾向于使优化器的基数估计更可能不正确,因此它增加了不使用有用索引的机会。【参考方案4】:
包含单个值或空值的列不太可能对您对该表运行的任何查询的性能产生任何影响,尤其是当您正在搜索不的行时> 等于那个值。
因此,无论该列是否已编入索引,这些选项中的任何一个都将表现同样出色。但是,作为一种意图的表达——无论是对你的开发人员和数据库优化器——最好将其编码为:
status is null
【讨论】:
以上是关于在 Oracle 中搜索哪个更快的主要内容,如果未能解决你的问题,请参考以下文章
Oracle里countcount(*)和count(主键)哪个更快
为了对存储在 Oracle db 中的数据运行搜索查询,在 PL/SQL 中使用 REGEXP 是不是比在 Java 正则表达式中获取所有数据并过滤它更快?