表扫描匹配多个字段中的一个-OR与多个语句



我面临着必须编写大量查询的问题,这些查询将涉及对一些相当大的表(数百万条记录)进行表扫描。

(我知道这是一个糟糕的想法,我正在推动一种不涉及这一点的替代方法,但现在这正是我所坚持的。在相关字段上创建索引可能也不是一个批准的选择。)

对于某些表,存在多个可能与目标值匹配的字段。我想,但我只想确认一下,带OR的单个查询会比多个查询更快。即:

SELECT keyinfo FROM TABLE1 WHERE field1 = target OR field2 = target OR field3 = target;

会比更好

SELECT whatever FROM TABLE1 WHERE field1 = target; 
SELECT whatever FROM TABLE1 WHERE field2 = target; 
SELECT whatever FROM TABLE1 WHERE field3 = target; 

从直觉上看,这似乎是正确的,因为它只需要扫描一次表格。但它确实需要测试多个领域,所以不确定你在这方面损失了多少收益。快速测试证明了这一点,但我不确定是否有任何临时索引正在后台构建,从而影响结果。

进一步信息:我预计在大多数情况下都不会找到匹配项,但我确实需要所有匹配项(如果存在的话),所以我不能只限于获取前1行。此外,它是z/OS DB2。

考虑到我可能需要为多个目标运行此操作,我可能最终会将所有相关字段提取到一个临时表中,因为我应该能够在此基础上构建索引,总体而言,这应该会快得多。但我现在只是对表格扫描问题感到好奇。

or并不一定更好。对于多个字段的or条件,数据库可能很难使用索引。DB2可能足够好,可以针对这种情况进行优化。但是,您可以将性能(和执行计划)与进行比较

SELECT whatever FROM TABLE1 WHERE field1 = target
UNION ALL
SELECT whatever FROM TABLE1 WHERE field2 = target AND field1 <> target
UNION ALL
SELECT whatever FROM TABLE1 WHERE field3 = target AND field1 <> targe AND field2 <> target; 

数据库基于不包含参数值的查询构建执行计划。无论提供了什么实际值,每次运行查询时都会使用此查询。

我认为,您最好的选择是查看这两种查询的execution planexplain plan;使用CCD_ 5和CCD_。

相关内容

  • 没有找到相关文章

最新更新