我面临着必须编写大量查询的问题,这些查询将涉及对一些相当大的表(数百万条记录)进行表扫描。
(我知道这是一个糟糕的想法,我正在推动一种不涉及这一点的替代方法,但现在这正是我所坚持的。在相关字段上创建索引可能也不是一个批准的选择。)
对于某些表,存在多个可能与目标值匹配的字段。我想,但我只想确认一下,带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 plan
或explain plan
;使用CCD_ 5和CCD_。