在阅读了慢速SQL查询之后,不确定如何优化,这让我开始思考查询的一般性能。当然,我们需要将第一个表(在连接其他表时)的结果尽可能小,然后再进行连接(此问题的内部连接),以使我们的查询快一点。
示例,应该这样:
SELECT *
FROM ( SELECT * FROM table1 WHERE col = @val ) t
INNER JOIN table2 ON col = col2
比以下更好/更快:
SELECT *
FROM table1
INNER JOIN table2 ON col = col2
WHERE table1.col = @val
我的理论如下(这可能不是正确的实现,我试图从我读过的一本SQL Server 2008内部书籍(MSFT Press)中记住):
- 查询处理器首先获取左表(表1)
- 在过滤掉必要的行之前,连接第二个表(表2)并形成笛卡尔积(如果适用)
- 然后使用SEELCT语句最后执行WHERE,ORDER BY,GROUP BY,HAVING子句。
因此,如果在上面的语句1中表较小,则在形成笛卡尔积时SQL引擎要做的工作较少。然后,当您到达where语句时,您将得到减少的结果集,可以从中筛选出结果集。
我可能还差得远,这是不真实的。就像我说的,这是一种理论。
你的想法?
注意:我只是想到了这个问题,还没有机会自己进行任何测试。
注2:标记为SQL Server的,因为我不知道任何关于MySQL等的实施,请随时接听/评论反正