我面临着必须编写一些查询,这些查询将涉及对一些相当大的表(几百万条记录)进行表扫描。
(我知道这是一个可怕的想法,我正在推动一种不会涉及到这种方法的替代方法,但现在它正是我所坚持的。在相关领域创建索引可能不会是一个批准的选项。)
对于某些表,有多个字段可能与目标值匹配。 我想,但我只是想确认,使用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。
鉴于我可能需要为多个目标运行此操作,我可能最终将所有相关字段拉出到临时表中,因为我应该能够建立一个索引,总体而言应该更快。但我现在对表扫描问题感到好奇。
答案 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
子句。