我有两张桌子
@T1 TABLE
(
Id INT,
Date DATETIME
)
@T2 TABLE
(
Id INT,
Date DATETIME
)
Run Code Online (Sandbox Code Playgroud)
这些表在 (Id, Date) 上有一个非聚集索引
我加入这些表
SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON
t1.Id = t2.Id
WHERE
t1.Date <= GETDATE()
AND
t2.Date <= GETDATE()
Run Code Online (Sandbox Code Playgroud)
这也可以写成
SELECT *
FROM T1 AS t1
INNER JOIN T2 AS t2
ON
t1.Id = t2.Id
AND
t1.Date <= GETDATE()
AND
t2.Date <= GETDATE()
Run Code Online (Sandbox Code Playgroud)
我的问题是,这两个查询中哪一个提供了更好的性能,为什么?或者他们是平等的?
我们运行的网站在一个表中具有 250 MM 的行,而在另一个表中,我们将其连接到大多数查询中的行不到 15 MM。
示例结构:
MasterTable (Id, UserId, Created, Updated...) -- 15MM Rows
DetailsTable (Id, MasterId, SomeColumn...) -- 250MM Rows
UserTable (Id, Role, Created, UserName...) -- 12K Rows
Run Code Online (Sandbox Code Playgroud)
我们必须定期对所有这些表进行一些查询。一种是抓取免费用户(~10k 免费用户)的统计数据。
Select Count(1) from DetailsTable dt
join MasterTable mt on mt.Id = dt.MasterId
join UserTable ut on ut.Id = mt.UserId
where ut.Role is null and mt.created between @date1 and @date2
Run Code Online (Sandbox Code Playgroud)
问题是这个查询有时会运行很长时间,因为连接发生在 where 之前很久。
在这种情况下,使用 wheres 而不是 joins 或可能更明智where column in(...)
吗?
当我写这样的查询时......
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 语法。我只是好奇会发生什么。