2010-02-18 142 views
0

查询 -左连接和Where子句

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秒钟才能运行。有没有办法来优化这些类型的查询?

+2

@Rahuls:什么是'tb3.col3'? – Quassnoi 2010-02-18 17:36:16

+0

tb3从哪里来? – froadie 2010-02-18 17:36:39

+0

输入错误,修好对不起 – 2010-02-18 17:40:57

回答

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) 
+0

tbl1.col1呢? – 2010-02-18 17:39:47

+0

@leson:对,'col1'上的索引也不会受到影响。 – Quassnoi 2010-02-18 17:49:36

+0

没有它没有改善,但时间增加了2秒 – 2010-02-18 17:52:18

1

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

-1

也许

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

你一定看到我的老问题,检查更新一个 – 2010-02-18 17:44:49

+0

这将无法正常工作。 – 2010-02-18 17:48:37

+0

为什么?并创建索引,将非常快 – swamprunner7 2010-02-18 17:52:02

1

起初,好像你应该把

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

进入WHERE子句,但是这会与OUTER JOIN冲突。 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中的任何列通常应该由索引覆盖。除此之外,无论您编写查询的方式如何,优化程序都应该能够找到最佳方法。

+0

有些选项,时间来启动并查看每个寻找坏东西的查询计划:) – 2010-02-18 18:12:39