【问题标题】:Table scan matching one of a number of fields - OR vs multiple statements匹配多个字段之一的表扫描 - OR vs 多个语句
【发布时间】: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 运行它,我可能最终会将所有相关字段拉到一个临时表中,因为我应该能够在此基础上建立一个索引,总体上应该更快。但我现在只是对表扫描问题感到好奇。

【问题讨论】:

    标签: sql db2 query-performance db2-zos


    【解决方案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 planexplain plan;使用OR 和使用UNION 子句。

      【讨论】:

        猜你喜欢
        • 2012-01-06
        • 2017-10-28
        • 1970-01-01
        • 2019-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-19
        • 1970-01-01
        相关资源
        最近更新 更多