.net 左连接和Where子句

.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'

质疑-

这里我做的是左外连接,并在连接中使用“and”。 (首先我使用了join和partin,但结果不正确)


我的查询与此非常相似,运行了很长时间;运行至少需要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秒一些选项,需要启动并查找每个查询计划以查找不好的内容:)一些选项,是时候为每一个寻找坏东西的人启动并查看查询计划了:)