首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SQL的执行时间非常长

SQL的执行时间非常长
EN

Stack Overflow用户
提问于 2021-08-24 06:02:52
回答 3查看 91关注 0票数 0

这条SQL语句向左连接了两个表,每个表的值都约为x。10.000行(table1 = 20列,table2 = 50+列),执行需要60+秒。有没有办法让它更快?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
    t.*, k.*
FROM 
    table1 AS t 
LEFT JOIN 
    table2 AS k ON t.key_Table1 = k.Key_Table2
WHERE 
    ((t.Time) = (SELECT MAX(t2.Time) FROM table1 AS t2 
                 WHERE t2.key2_Table1 = t.key2_Table1))
ORDER BY 
    t.Time;

理想的执行时间应小于5秒,因为Excel查询只需8秒即可完成,而且Excel查询的执行速度比SQL Server Express查询快得多,这非常令人惊讶。

执行计划:

EN

回答 3

Stack Overflow用户

发布于 2021-08-24 06:16:36

你也可以更好地重写你的查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select *
from table2 as k
join (
    select *, row_number() over (partition by Key_Table2 order by time desc) rn 
    from table1
  ) t 
on t.rn = 1 
and t.key_Table1 = k.Key_Table2

但是,如果您还没有Key_Table2、time和key_Table1列,则需要对其进行索引。另外,另一个改进是只选择您想要的列,而不是select *

票数 1
EN

Stack Overflow用户

发布于 2021-08-24 06:58:12

优化器确定合并连接是最好的,但是如果两个表都有10,000行,并且它们没有连接索引列,那么强制优化器退出并告诉它散列连接可能会提高性能

语法是将LEFT JOIN更改为LEFT HASH JOIN

https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008/ms191426(v=sql.100)

https://docs.microsoft.com/en-us/sql/relational-databases/performance/joins?view=sql-server-ver15

https://docs.microsoft.com/en-us/sql/t-sql/queries/hints-transact-sql-join?view=sql-server-ver15

票数 1
EN

Stack Overflow用户

发布于 2021-08-24 07:19:36

我建议使用outer apply重写查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT t.*, k.*
FROM table1 t OUTER APPLY
     (SELECT TOP (1) k.*
      FROM table2 k 
      WHERE t.key_Table1 = k.Key_Table2
      ORDER BY Time DESC
     ) k
ORDER BY t.Time;

对于这个查询,您需要一个table2(Key_Table2, time desc)上的索引。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68908828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文