Sql 什么时候进行过滤?
如果我有这样的疑问:Sql 什么时候进行过滤?,sql,sql-server,Sql,Sql Server,如果我有这样的疑问: SELECT A.ID, A.Name, A.Type, B.FirstName, B.LastName, B.DateOfBirth, C.OfficeName FROM A INNER JOIN B ON A.ContactID = B.ID INNER JOIN C ON B.OfficeID = C.ID WHERE A.Type = 1 何时应用A.Type=1过滤器?是在联接之后,
SELECT
A.ID,
A.Name,
A.Type,
B.FirstName,
B.LastName,
B.DateOfBirth,
C.OfficeName
FROM A
INNER JOIN B ON A.ContactID = B.ID
INNER JOIN C ON B.OfficeID = C.ID
WHERE
A.Type = 1
何时应用A.Type=1过滤器?是在联接之后,还是查询查找“A”,确定它是否通过了过滤器,然后仅联接到B和C(如果通过了过滤器)
希望这是有意义的。谢谢。逻辑上-在
加入之后,物理上-这取决于优化器。要回答这个问题,您确实需要查看执行计划。在您提到的情况下,如果where子句中有一个可搜索参数(SARG),那么在连接之前,过滤器很可能会与您的访问方法一起应用,即索引、表扫描等
使用
查询菜单->包含实际执行计划
或
查询菜单->显示预计执行计划
看一看。每。
检查SELECT语句的逻辑处理顺序部分
从
在
加入
在哪里
分组
使用多维数据集还是使用汇总
拥有
挑选
明显的
订购人
顶
本清单前一段末尾有一个重要注释
请注意,语句的实际物理执行由查询处理器决定,并且顺序可能与此列表不同
首先,以下是SQL操作顺序:
- FROM子句
- WHERE子句
- 分组依据子句
- 有从句
- SELECT子句
- 按条款订货
在一个简单的查询中,过滤发生在FROM
子句之后(在该部分中可以找到联接)。上面的query主要是将表与其定义关系的链接列连接起来。在设置记录(连接的结果)后,WHERE
子句将过滤掉Type
WHERE is等于1
下面是另一个使用左连接的示例
第一个问题:
SELECT A.ID,
A.Name,
A.Type,
B.FirstName,
B.LastName,
B.DateOfBirth
FROM A
LEFT JOIN B
ON A.ContactID = B.ID AND
B.LastName = 'Michaels'
vs第二个查询:
SELECT A.ID,
A.Name,
A.Type,
B.FirstName,
B.LastName,
B.DateOfBirth
FROM A
LEFT JOIN B ON A.ContactID = B.ID
WHERE B.LastName = 'Michaels'
第一个查询返回表A
中的所有记录。B.LastName='Michaels'
所做的是在表B
将与表A
联接之前,它过滤掉LastName
等于Michaels
的所有记录。因此,表A
中的记录如果与表B
中的过滤记录不匹配,则表B
中的列将具有空值
第二个查询将不会产生与第一个查询相同的结果,并对内部联接执行完全相同的操作
,因为在联接记录之后,将对结果执行另一个筛选,并仅获取LastName
等于Michaels的记录。where子句将在联接之前应用,即它将根据联接条件返回A的所有行以及B和C的对应行,对于type=1,是否可以包括查询执行计划?这很可能会回答你的问题。我一直认为,查询优化者会找到答案,并将其应用到最理想(或接近最佳)的地方。在SSMS中启用“包含实际查询计划”选项的情况下运行查询,以查看发生了什么。它是否会更改任何内容?当然,只要结果是正确的。SQL Server将使其更高效。@mellamokbtheWise-这只是我好奇的事情。我只是想知道SQL是否遵循任何可靠的规则。通常情况下,答案似乎是‘视情况而定’:)数据库系统教科书将涵盖这一点。通常,其中
条件应尽早处理,因为它们减少了要进一步处理的行集的大小。