查看Kalen Delaney 撰写的“SQL Server 2008 Internals” 1,第 13 页,它说明了以下内容:
“生成这样一个计划的第一步是规范化每个查询,这可能会将单个查询分解为多个细粒度的查询。查询优化器在规范化一个查询之后对其进行优化,这意味着它确定了一个计划执行该查询。”
另一位 DBA 向我建议,可以通过将WHERE子句谓词移动到FROM子句中来提高某些查询的性能,例如:
SELECT *
FROM dbo.table1 t1
INNER JOIN dbo.table3 t3 ON t1.ID = t3.ID
LEFT OUTER JOIN dbo.table2 t2 ON t1.ID = t2.ID
WHERE t1.CreateDate >= '2015-07-31 00:00:00';
Run Code Online (Sandbox Code Playgroud)
会成为:
SELECT *
FROM dbo.table1 t1
INNER JOIN dbo.table3 t3 ON t1.ID = t3.ID
AND t1.CreateDate >= '2015-07-31 00:00:00'
LEFT OUTER JOIN dbo.table2 t2 ON t1.ID = t2.ID;
Run Code Online (Sandbox Code Playgroud)
显然,第一个示例的含义是查询优化器将执行第JOIN一个, …
当我写这样的查询时......
select *
from table1 t1
join table2 t2
on t1.id = t2.id
Run Code Online (Sandbox Code Playgroud)
SQL 优化器,不确定这是否是正确的术语,是否将其转换为...
select *
from table1 t1, table2 t2
where t1.id = t2.id
Run Code Online (Sandbox Code Playgroud)
本质上,SQL Server 中的 Join 语句只是一种更简单的编写 sql 的方法吗?或者它实际上是在运行时使用的?
编辑:我几乎总是,而且几乎总是,使用 Join 语法。我只是好奇会发生什么。
第一次来这里。
我对加入表格时的最佳实践有疑问。例如,以下两个查询都返回相同的结果:
SELECT i.id, p.first_name, p.last_name
FROM individuals i, profiles p
WHERE i.id = p.individual_id;
SELECT i.id, p.first_name, p.last_name
FROM individuals i INNER JOIN profiles p ON i.id = p.individual_id;
Run Code Online (Sandbox Code Playgroud)
这两种方法的优缺点是什么?请让我知道你的想法。我对性能差异感兴趣,但也对查询的可读性、从一个 RDMS 到另一个 RDMS 的可移植性感兴趣,等等。
谢谢!