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