.net 左连接和Where子句
质疑- 这里我做的是左外连接,并在连接中使用“and”。 (首先我使用了join和partin,但结果不正确).net 左连接和Where子句,.net,sql,sql-server,sql-server-2005,tsql,.net,Sql,Sql Server,Sql Server 2005,Tsql,质疑- 这里我做的是左外连接,并在连接中使用“and”。 (首先我使用了join和partin,但结果不正确) 我的查询与此非常相似,运行了很长时间;运行至少需要10秒。有没有办法优化这些类型的查询?您可以在比较值的列上添加索引。您可以在比较值的列上添加索引。创建以下索引: Select * FROM tbl1 LEFT OUTER JOIN tbl2 ON tbl1.id = tbl2.id AND tbl2.col2 = 'zyx'
我的查询与此非常相似,运行了很长时间;运行至少需要10秒。有没有办法优化这些类型的查询?您可以在比较值的列上添加索引。您可以在比较值的列上添加索引。创建以下索引:
Select * FROM tbl1
LEFT OUTER JOIN tbl2 ON tbl1.id = tbl2.id
AND tbl2.col2 = 'zyx'
AND tbl2.col3 = 'abc'
WHERE tbl1.col1 = 'pqr'
如果id
是相应表中的聚集主键
,则可以从索引中省略它,因为它将隐式包含在那里:
CREATE INDEX ix_tbl1_1_id ON tbl1 (col1, id)
CREATE INDEX ix_tbl2_2_3_id ON tbl2 (col2, col3, id)
创建以下索引:
Select * FROM tbl1
LEFT OUTER JOIN tbl2 ON tbl1.id = tbl2.id
AND tbl2.col2 = 'zyx'
AND tbl2.col3 = 'abc'
WHERE tbl1.col1 = 'pqr'
如果id
是相应表中的聚集主键
,则可以从索引中省略它,因为它将隐式包含在那里:
CREATE INDEX ix_tbl1_1_id ON tbl1 (col1, id)
CREATE INDEX ix_tbl2_2_3_id ON tbl2 (col2, col3, id)
也许吧
从tbl1、tbl2中选择*
其中tbl1.id=tbl2.id
tbl1.col1='pqr'
tbl2.col2='zyx'
tb2.col3='abc'
也许吧
从tbl1、tbl2中选择*
其中tbl1.id=tbl2.id
tbl1.col1='pqr'
tbl2.col2='zyx'
tb2.col3='abc'
一开始,你似乎应该 Select * FROM tbl1, tbl2 WHERE tbl1.id = tbl2.id AND tbl1.col1 = 'pqr' AND tbl2.col2 = 'zyx' AND tb2.col3 = 'abc' 但是,这将与外部联接冲突。WHERE限制了结果,因此添加有效地使其成为内部联接。写这篇文章的两种不同方式可能是: 将空值添加到where
AND tbl2.col2 = 'zyx' and tbl2.col3 = 'abc'
或者使用子查询
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))
我可能会选择子查询方法,因为它更清楚您的意图。就性能而言,WHERE中的任何列通常都应该包含在索引中。除此之外,无论您以何种方式编写查询,优化器都应该能够找到最佳方法 一开始,你似乎应该 Select * FROM tbl1, tbl2 WHERE tbl1.id = tbl2.id AND tbl1.col1 = 'pqr' AND tbl2.col2 = 'zyx' AND tb2.col3 = 'abc' 但是,这将与外部联接冲突。WHERE限制了结果,因此添加有效地使其成为内部联接。写这篇文章的两种不同方式可能是: 将空值添加到where
AND tbl2.col2 = 'zyx' and tbl2.col3 = 'abc'
或者使用子查询
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))
我可能会选择子查询方法,因为它更清楚您的意图。就性能而言,WHERE中的任何列通常都应该包含在索引中。除此之外,无论您以何种方式编写查询,优化器都应该能够找到最佳方法 为什么??和创建索引,将是非常快没有非关联连接请,这使得选择和何处序列依赖。因为它不会返回所有记录为什么?和创建索引,将非常快请不要关联联接,这使选择和WHERE序列依赖。因为它不会返回所有记录两个索引使其快3秒两个索引使其快3秒一些选项,需要启动并查找每个查询计划以查找不好的内容:)一些选项,是时候为每一个寻找坏东西的人启动并查看查询计划了:)