我有一张表,我在两个未编制索引的列中搜索文本,如下所示
select * from Items where items.item_label = 'Mac address' and items.item_value = '023424234324'
item_label
和item_value
都未编入索引。这里item_label是完全可选的,我添加它以便DB可以更快地找到标签上的项目(假设如果我缩小我正在寻找的东西它会表现得更好)
哪个查询更好,上面的那个或下面的那个?
select * from Items where items.item_value = '023424234324'
答案 0 :(得分:1)
我同意Lamak和John的观点,即两个查询都会执行相同的操作。读取数据的I / O时间远远大于执行比较的CPU时间。
但是,一旦您开始将这些查询与其他数据组合在一起,第二个更简单的查询可能会表现得更好。
item_label
和item_value
之间存在隐含的数据关联。 您知道item_label
谓词返回10行,item_value
谓词返回相同的10行。优化器不知道这一点。相反,它将进行如下计算:(low cardinality predicate) AND (low cardinality predicate) = very low cardinality results
。当其他表添加到查询中时,这些错误的估计可能导致错误的执行计划。
Oracle有办法解决这个问题。例如11g中的extended statistics和12c中的自动SQL指令。但如果可能的话,最好完全避免这个问题。删除冗余谓词是一件好事。不要添加逻辑上不必要的谓词,除非它专门添加了性能功能,例如分区修剪或索引访问。