【问题标题】:Query performance when searching non-indexed columns搜索非索引列时的查询性能
【发布时间】:2015-03-25 08:57:45
【问题描述】:

我有一个表格,我在下面的两个未索引的列中搜索文本

select * from Items where items.item_label = 'Mac address' and items.item_value = '023424234324'

item_labelitem_value 都没有一起索引。这里 item_label 是完全可选的,我添加它是为了让数据库可以更快地按标签找到项目(假设如果我缩小我正在寻找的内容会更好)

哪个查询更好,上一个还是下一个?

select * from Items where items.item_value = '023424234324'

【问题讨论】:

  • 如果这些列中的任何一个都没有索引并且这些值的行数相同,那么两者很可能会执行相同的操作
  • 如果没有任何相关索引来帮助它,数据库需要扫描整个表以查找匹配项,无论您的WHERE 子句中是否有一个或两个条件。如果表的大小很大,那么用于该表的 I/O 将淹没查询处理方面的所有其他考虑因素。如果两个查询返回的行数相同,则无需考虑其他相关方面。
  • @JohnBollinger 感谢您的回答。
  • @Lamak 感谢您的回答。

标签: sql performance oracle10g


【解决方案1】:

我同意 Lamak 和 John 的观点,即两个查询的执行方式相同。读取数据的 I/O 时间远大于执行比较的 CPU 时间。

但是,一旦您开始将这些查询与其他数据结合起来,第二个更简单的查询可能会执行得更好。


item_labelitem_value 之间存在隐式数据关联。 知道item_label 谓词返回10 行,而item_value 谓词返回相同的10 行。优化器知道这一点。相反,它将进行如下计算:(low cardinality predicate) AND (low cardinality predicate) = very low cardinality results。当将其他表添加到查询中时,这些错误的估计可能会导致错误的执行计划。

Oracle 有办法处理这个问题。如 11g 中的extended statistics,以及 12c 中的自动 SQL 指令。但如果可能的话,最好完全避免这个问题。删除多余的谓词是一件好事。不要添加逻辑上不必要的谓词,除非它专门添加了性能特性,例如分区修剪或索引访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多