搜索非索引列时的查询性能

时间:2015-01-26 21:03:19

标签: sql performance oracle10g

我有一张表,我在两个未编制索引的列中搜索文本,如下所示

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

item_labelitem_value都未编入索引。这里item_label是完全可选的,我添加它以便DB可以更快地找到标签上的项目(假设如果我缩小我正在寻找的东西它会表现得更好)

哪个查询更好,上面的那个或下面的那个?

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

1 个答案:

答案 0 :(得分: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指令。但如果可能的话,最好完全避免这个问题。删除冗余谓词是一件好事。不要添加逻辑上不必要的谓词,除非它专门添加了性能功能,例如分区修剪或索引访问。