0

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

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

对于某些表,有多个字段可能与目标值匹配。我想,但我只是想确认一下,使用 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 ONLY。此外,它是 z/OS DB2。

鉴于我可能需要为多个目标运行它,我可能最终会将所有相关字段拉到一个临时表中,因为我应该能够在其上建立一个索引,总的来说应该快得多。但我现在只是对表扫描问题感到好奇。

4

2 回答 2

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; 
于 2017-02-14T13:39:28.270 回答
0

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

我认为,您最好的选择是查看两种查询的execution planexplain plan两种查询;使用OR和使用UNION子句。

于 2017-02-14T15:51:25.240 回答