【问题标题】:INNER JOIN query performance very slowINNER JOIN 查询性能很慢
【发布时间】:2019-06-18 14:38:20
【问题描述】:

我有一个如下所示的 SQL 查询:

SELECT * 
FROM tableB ta
INNER JOIN tableB tb ON tb.someColumn = ta.someOtherColumn

someColumnsomeOtherColumn不是它们表的主键。两者都是数据类型int

TableA 有大约 500.000 条记录,tableB 有大约 250.000 条记录。查询大约需要 2 分钟才能完成,我认为这太长了。

查询执行计划如下:

我已经尝试 (a) 使用 OPTION (RECOMPILE) 和 (b) 在相应的表上创建 INDEX。无济于事。

我的问题是:如何提高这个查询的性能?

【问题讨论】:

  • 正在生产多少行?您创建了哪些索引?
  • 您要返回多少列?如果您尝试返回太多列,则 SELECT * 会很慢
  • " (b) 在各个表上创建一个索引。"您创建了哪些索引?
  • 将其转储到临时表需要多长时间?在管理工作室中选择所有这些行可能会出现问题。
  • 发布您的表的 DDL 和所述表的相应索引。该查询计划显示两个表都是通过扫描读取的,因此您拥有的任何索引都不会用于查找;因此这是缓慢的一个原因。

标签: sql sql-server inner-join query-performance


【解决方案1】:

在 tb.SomeColumn 上创建一个索引,并在 ta.SomeOtherColumn 上创建另一个索引。

那么当你运行这个查询时,Hash Match 应该被替换为一个 Inner Loop,并且会快很多。

【讨论】:

  • 查看不提供 DDL 时会发生什么。我们浪费时间猜测:(
  • @beta 你可能实现了一些不正确的东西。除非您提供重现问题的脚本,否则我无法进一步帮助您。
猜你喜欢
  • 2015-11-27
  • 2016-12-04
  • 2013-03-17
  • 1970-01-01
  • 2014-03-15
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多