相关疑难解决方法(0)

SQL Server Join/where 处理顺序

在阅读了慢 SQL 查询后,不确定如何优化,这让我想到了查询的总体性能。当然,我们需要第一个表的结果(当其他表被连接时)在连接之前尽可能小(这个问题的内部连接),以使我们的查询更快一点。

例如,应该这样:

SELECT *
FROM   ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
Run Code Online (Sandbox Code Playgroud)

比以下更好/更快:

SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
Run Code Online (Sandbox Code Playgroud)

我的理论如下(这可能不是正确的实现,我试图从我读过的 SQL Server 2008 内部书籍(MSFT Press)中记住):

  1. 查询处理器首先获取左表(table1)
  2. 连接第二个表 (table2) 并在过滤掉必要的行之前形成笛卡尔积(如果适用)
  3. 然后使用 SEELCT 语句最后执行 WHERE、ORDER BY、GROUP BY、HAVING 子句。

因此,如果在上面的语句 #1 中,表较小,则 SQL 引擎在形成笛卡尔积时要做的工作较少。然后,当您到达 where 语句时,您将拥有一个简化的结果集,可从中过滤内存。

我可能离目标太远了,这是不真实的。就像我说的,这是一个理论。

你的意见?

注意:我刚刚想到这个问题,还没有机会自己进行任何测试。

注2:标记为SQL Server的,因为我不知道任何关于MySQL等的实施,请随时接听/评论反正

performance join sql-server

22
推荐指数
2
解决办法
4万
查看次数

标签 统计

join ×1

performance ×1

sql-server ×1