左连接和Where子句

时间:2010-02-18 17:33:46

标签: .net sql sql-server sql-server-2005 tsql

查询 -

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

这里我正在做左外连接并使用'和'以及连接。 (首先我使用连接'和'参与'在哪里',但我的结果不正确)

我的查询与此非常相似,运行了很长时间;它至少需要10秒才能运行。有没有办法优化这些类型的查询?

4 个答案:

答案 0 :(得分:2)

创建以下索引:

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)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

起初,好像你应该把

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

进入WHERE子句,但是会与OUTER JOIN冲突。 WHERE限制结果,因此添加有效使其成为内连接。写这个的几种不同方式可能是:

将空值添加到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'         

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

答案 3 :(得分:-1)

也许

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