表扫描匹配多个字段之一 - 或多个语句

时间:2017-02-14 13:33:41

标签: sql db2 query-performance db2-zos

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

(我知道这是一个可怕的想法,我正在推动一种不会涉及到这种方法的替代方法,但现在它正是我所坚持的。在相关领域创建索引可能不会是一个批准的选项。)

对于某些表,有多个字段可能与目标值匹配。 我想,但我只是想确认,使用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; 

直观地说这似乎是正确的,因为它只需扫描一次表。但它确实需要测试多个字段,所以不确定你会失去多少收益。快速测试证实了这一点,但我不确定是否在后台构建了影响结果的临时索引。

更多信息: 我希望在大多数情况下都不会找到匹配,但我确实需要所有匹配(如果存在),所以我不能仅限于FETCH FIRST 1 ROWS。 此外,它是z / OS DB2。

鉴于我可能需要为多个目标运行此操作,我可能最终将所有相关字段拉出到临时表中,因为我应该能够建立一个索引,总体而言应该更快。但我现在对表扫描问题感到好奇。

2 个答案:

答案 0 :(得分:1)

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; 

答案 1 :(得分:0)

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

我认为,您最好的选择是查看这两种查询的do.call(rbind, myList) FAM PESS BEN I_BPC_FAM2 A.1 A 1 1 1 A.2 A 2 0 0 A.3 A 3 0 0 A.4 A 4 1 0 A.1.1 A 1 1 0 A.2.1 A 2 0 0 A.3.1 A 3 0 0 A.4.1 A 4 1 1 B.5 B 1 0 0 B.6 B 2 0 0 B.7 B 3 1 1 execution plan;使用explain plan并使用OR子句。