相关疑难解决方法(0)

ON 与 WHERE 上的索引性能

我有两张桌子

@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)

我的问题是,这两个查询中哪一个提供了更好的性能,为什么?或者他们是平等的?

index join sql-server t-sql table

26
推荐指数
3
解决办法
3150
查看次数

哪个更有效,where 子句或与百万多行表的连接?

我们运行的网站在一个表中具有 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(...)吗?

join best-practices

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

连接是否在运行时优化为 where 子句?

当我写这样的查询时......

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 语法。我只是好奇会发生什么。

join sql-server optimization t-sql

15
推荐指数
2
解决办法
1928
查看次数

标签 统计

join ×3

sql-server ×2

t-sql ×2

best-practices ×1

index ×1

optimization ×1

table ×1