使用 temp table 过滤数据,而不是使用 where 子句连接和过滤

Filter data using temp table instead of join and filter with where clause

使用 SQL Server 2012 我有 2 tables(t1 和 t2)。 table 中都有数百万条记录。两者都有一个日期字段。

我正在使用这个查询

insert into dumpTable
select * from t1 inner join t2 on t1.datefield = t2.datetield
where t1.datefield = '2015-01-01'

查询需要一小时运行

我也试过了

insert into dumpTable
select * from t1 inner join t2 on t1.datefield = t2.datetield 
    and t1.datefield = '2015-01-01' and t2.datefield = '2015-01-01'

我将其更改为以下以在 5 分钟后 运行 加入之前过滤记录

select * into #t1 from t1 where datefield = '2015-01-01'
select * into #t2 from t2 where datefield = '2015-01-01'

insert into dumpTable
select * from #t1 inner join #t2 on #t1.datefield = #t2.datetield
  1. 你怎么解释这个?优化器不够聪明,无法过滤 两个 tables 在加入它们之前读取数据集时?

  2. 有没有替代方法而不是使用临时 table?

临时 table 上的查询可能 运行 更快,因为 table 上的统计信息是准确的。这有助于 SQL 服务器选择正确的执行计划。

对于这个查询:

insert into dumpTable
    select *
    from t1 inner join
         t2
         on t1.datefield = t2.datetield
    where t1.datefield = '2015-01-01';

您可以创建两个索引:t1(datefield)t2(datefield)。这些应该可以加快查询速度。

正如 Zoff 所说,这可能是查询优化器选择了嵌套循环连接类型而不是散列连接类型。向我们提供查询的估计执行计划会对您有所帮助,但如果失败,请尝试在下面的查询中强制使用散列连接类型,看看它是否运行得更快。

insert into dumpTable
select * from t1 inner hash join t2 on t1.datefield = t2.datetield
where t1.datefield = '2015-01-01'

对于此查询,继续使用此类提示可能是可以接受的,但最终可能需要调整索引并更新统计信息以形成更好的长期解决方案。