代码之家  ›  专栏  ›  技术社区  ›  Mongus Pong

优化器是否使用外部where子句筛选子查询

  •  2
  • Mongus Pong  · 技术社区  · 14 年前

    接受以下查询:

    select * from
    (
      select a, b
      from c
        UNION
      select a, b
      from d
    )
    where a = 'mung'
    order by b
    

    优化器是否会发现我正在对值“mung”过滤a,从而对子查询中的每个查询过滤mung。

    它是否会运行子查询联合中的每个查询,并将结果返回到外部查询进行筛选(查询可能会建议这样做)

    在这种情况下,以下查询将执行得更好:

    select * from
    (
      select a, b
      from c
      where a = 'mung'
        UNION
      select a, b
      from d
      where a = 'mung'
    )
    order by b
    

    显然,查询1最适合维护,但它是否为此牺牲了很多性能?

    哪个最好?

    编辑 抱歉,我忘了加上 按顺序 子句中的查询,以指示为什么它首先都需要是子查询!

    编辑 好吧,我以为这会是一个简单的答案,但我忘了我在这里说的是数据库!通过分析器运行它表明没有进行优化,但这当然可能是因为我的表中只有4行。我希望有一个更简单的“是”或“否”。必须建立一些更复杂的测试。

    我现在在mysql上,但是我想得到一个一般的答案…

    1 回复  |  直到 14 年前
        1
  •  2
  •   OMG Ponies    14 年前

    用途:

    SELECT x.a, 
           x.b
      FROM TABLE_X x
     WHERE x.a = 'mung'
    UNION
    SELECT y.a, 
           y.b
      FROM TABLE_Y y
     WHERE y.a = 'mung'
    
    • 子查询在给定上下文中是不必要的
    • 如果列“a”上有索引,上面的查询将使用索引;使用子查询方法,没有索引可利用
    • 使用 UNION ALL 如果你不必担心重复的话-它会比 UNION