gpt4 book ai didi

sql - 为什么内部加入过滤表比没有过滤的表慢?

转载 作者:行者123 更新时间:2023-12-04 21:53:30 27 4
gpt4 key购买 nike

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 这样的过滤器时,是否可以让它更快?

最佳答案

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

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

  3. 比 #1 慢,因为有额外的 where 条件 (UserID)。 这是您要使用的查询。
    (您也可以在 join on 之后直接将“where”换成“and”)

您是否设置了外键

同时确保您拥有适当的索引(即:AccID 和 UserID)。

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

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

关于sql - 为什么内部加入过滤表比没有过滤的表慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9492344/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com