3

WINDOWS 2008 上的 SQL Server 2008

请比较以下sql:

1.

select count(*) 
from Trades t 
inner join UserAccount ua on ua.AccID = t.AccID

2.

select count(*) 
from Trades t 
inner join (
    select * 
    from UserAccount ua 
    where ua.UserID = 1126
) as theua on theua.AccID = t.AccID

3.

select count(*) 
from Trades t 
inner join UserAccount ua on ua.AccID = t.AccID 
where ua.UserID=1126

鉴于 Trades 有数百万行,而 UserAccount 是一个非常小的表。AccID 可以是重复的。

执行结果:

  1. 234734792
  2. 8806144
  3. 8806144

我预计 No.2 至少可以和 No.1 一样快,但实际上它比 No.3 慢得多,甚至慢得多 时间消耗:

  1. 2 秒
  2. 10 秒
  3. 8 秒

有人可以解释原因吗?当我需要像 UserID=1126 这样的过滤器时,是否可以让它更快?

4

1 回答 1

3
  1. 是最快的,因为它的 where 条件最少。
    (缺少的用户 ID)

  2. 是最慢的,因为它有一个必须为每个连接执行的内部选择
    顺便说一句:永远不要这样做

  3. 由于额外的 where 条件(UserID),它比 #1 慢。这是您要使用的查询。
    (您也可以在加入后直接将“where”换成“and”)

你有设置外键吗?

还要确保您有适当的索引(即:AccID 和用户 ID)。

在 SSMS 中,使用执行计划运行查询,它将显示您应该创建的查询/索引中潜在的低效率。

在执行计划中,您应该注意诸如表扫描之类的内容。你想看到的是寻求

于 2012-02-29T01:29:52.163 回答