代码之家  ›  专栏  ›  技术社区  ›  rs.

左联接和Where子句

  •  0
  • rs.  · 技术社区  · 16 年前

    查询-

    Select * FROM tbl1 
    LEFT OUTER JOIN tbl2 ON  tbl1.id   = tbl2.id 
                         AND tbl2.col2 = 'zyx' 
                         AND tbl2.col3  = 'abc' 
    WHERE tbl1.col1 = 'pqr'
    

    在这里,我执行左外部联接,并使用“and”和“with join”。 (首先,我使用join和part-in-where,但结果不正确)

    我的查询与此非常相似,运行时间很长;至少需要10秒。有没有一种方法可以优化这些类型的查询?

    4 回复  |  直到 16 年前
        1
  •  2
  •   Quassnoi    16 年前

    创建以下索引:

    CREATE INDEX ix_tbl1_1_id ON tbl1 (col1, id)
    CREATE INDEX ix_tbl2_2_3_id ON tbl2 (col2, col3, id)
    

    如果 id 是一个 CLUSTERED PRIMARY KEY 在相应的表中,您可以从索引中省略它,因为它将隐式地包含在索引中:

    CREATE INDEX ix_tbl1_1 ON tbl1 (col1)
    CREATE INDEX ix_tbl2_2_3 ON tbl2 (col2, col3)
    
        2
  •  1
  •   Gustaf Carleson    16 年前

    您可以在比较值的列上添加索引。

        3
  •  1
  •   John    16 年前

    一开始,你应该

    AND tbl2.col2 = 'zyx' and tbl2.col3 = 'abc'  
    

    但这将与外部联接冲突。其中限制了结果,因此添加可以有效地使其成为内部联接。写这篇文章的几种不同方法可能是:

    向Where添加空值

    Select * FROM tbl1      
    LEFT OUTER JOIN tbl2 ON tbl1.id = tbl2.id      
    WHERE tbl1.col1 = 'pqr' 
      AND ((tbl2.col2 = 'zyx' AND tbl2.col3 = 'abc') 
        OR (tbl2.col2 = NULL AND tbl2.col3 = NULL))
    

    或使用子查询

    SELECT * FROM tbl1          
    LEFT OUTER JOIN 
    (
      SELECT *
      FROM tbl2
      WHERE tbl2.col2 = 'zyx' and tbl2.col3 = 'abc'
    ) AS temp2 ON tbl1.id = temp2.id          
    WHERE tbl1.col1 = 'pqr'         
    

    我可能会选择子查询方法,因为它更清楚您的意图是什么。就性能而言,中的任何列通常都应该由索引覆盖。除此之外,无论您以何种方式编写查询,优化器都应该能够找到最佳方法。

        4
  •  -1
  •   swamprunner7    16 年前

    也许吧

    Select * FROM tbl1, tbl2
    WHERE tbl1.id = tbl2.id 
    AND tbl1.col1 = 'pqr' 
    AND tbl2.col2 = 'zyx' 
    AND tb2.col3 = 'abc'