在哪里或者加入在SQL Server中首先评估哪一个?

时间:2014-10-13 07:42:26

标签: sql sql-server sql-execution-plan

查询

select * from TableA a join TableB b
on a.col1=b.col1
where b.col2 = 'SomeValue'

我期待服务器,首先从TableB过滤col2,然后进行连接。这样会更有效率。

  1. sql server是先评估where子句然后再加入Join?
  2. 知道sql处理查询的顺序的任何链接?
  3. 提前致谢

3 个答案:

答案 0 :(得分:1)

已经回答了...读了两个答案......

https://dba.stackexchange.com/questions/5038/sql-server-join-where-processing-order

总结:它取决于服务器实现及其执行计划......因此您需要在服务器上阅读以优化查询。

但我确信每个服务器都能尽可能地优化简单连接。

如果您不确定在大型数据集上测量执行时间。

答案 1 :(得分:1)

我们将使用此代码:

IF OBJECT_ID(N'tempdb..#TableA',N'U') IS NOT NULL DROP TABLE #TableA;
IF OBJECT_ID(N'tempdb..#TableB',N'U') IS NOT NULL DROP TABLE #TableB;

CREATE TABLE #TableA (col1 INT NOT NULL,Col2 NVARCHAR(255) NOT NULL)
CREATE TABLE #TableB (col1 INT NOT NULL,Col2 NVARCHAR(255) NOT NULL)

INSERT INTO #TableA VALUES (1,'SomeValue'),(2,'SomeValue2'),(3,'SomeValue3')
INSERT INTO #TableB VALUES (1,'SomeValue'),(2,'SomeValue2'),(3,'SomeValue3')

select * from #TableA a join #TableB b
on a.col1=b.col1
where b.col2 = 'SomeValue'

让我们在MSSQL Management Studio中分析查询计划。标记完整的SELECT语句并右键单击 - > Diplay估计执行计划。如下图所示 query plan

首先它为WHERE子句执行表扫描,然后是JOIN。

1.是sql server先评估where子句然后再加入?
首先是where子句然后JOIN

2.链接以了解sql将以哪个顺序处理查询?
我想你会在这里找到有用的信息:

  1. Execution Plan Basics
  2. Graphical Execution Plans for Simple SQL Queries

答案 2 :(得分:1)

由sql server查询optmiser引擎决定哪个执行计划的成本较低。

如果您认为filter子句对查询性能有益,您可以通过使用所需的值对其进行过滤来获取表的子集,并为其创建CTE。

然后将cte表达式与您的其他表连接。

您可以在SSMS中检查哪种查询在您的情况下表现更好,并使用它:)