匹配多个字段之一的表扫描 - OR vs 多个语句
Posted
技术标签:
【中文标题】匹配多个字段之一的表扫描 - OR vs 多个语句【英文标题】:Table scan matching one of a number of fields - OR vs multiple statements 【发布时间】:2017-02-14 13:33:41 【问题描述】:我不得不编写一些查询,这些查询将涉及对一些相当大的表(几百万条记录)进行表扫描。
(我知道这是一个糟糕的想法,我正在推动一种不涉及这个的替代方法,但现在这是我坚持的方法。在相关字段上创建索引可能不会是批准的选项。)
对于某些表,有多个字段可能与目标值匹配。 我想,但我只是想确认一下,使用 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。
鉴于我可能需要为多个 target 运行它,我可能最终会将所有相关字段拉到一个临时表中,因为我应该能够在此基础上建立一个索引,总体上应该更快。但我现在只是对表扫描问题感到好奇。
【问题讨论】:
【参考方案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;
【讨论】:
【参考方案2】:数据库根据没有参数值的查询构建执行计划。无论提供什么实际值,每次运行查询时都会使用此查询。
我认为,最好的办法是查看这两种查询的execution plan
或explain plan
;使用OR
和使用UNION
子句。
【讨论】:
以上是关于匹配多个字段之一的表扫描 - OR vs 多个语句的主要内容,如果未能解决你的问题,请参考以下文章
sql语句中条件查询里in、like、及=三个的效率怎么样?
从多个表中提取时 PHP while 循环和 if 语句问题