select * from TableA a join TableB b
on a.col1=b.col1
where b.col2 = 'SomeValue'
我期待服务器,首先从TableB过滤col2,然后进行连接。这样会更有效率。
提前致谢
答案 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估计执行计划。如下图所示
首先它为WHERE子句执行表扫描,然后是JOIN。
1.是sql server先评估where子句然后再加入?
首先是where子句然后JOIN
2.链接以了解sql将以哪个顺序处理查询?
我想你会在这里找到有用的信息:
答案 2 :(得分:1)
由sql server查询optmiser引擎决定哪个执行计划的成本较低。
如果您认为filter子句对查询性能有益,您可以通过使用所需的值对其进行过滤来获取表的子集,并为其创建CTE。
然后将cte表达式与您的其他表连接。
您可以在SSMS中检查哪种查询在您的情况下表现更好,并使用它:)