使用临时表过滤数据而不是使用where子句进行过滤和过滤

时间:2015-09-10 21:54:01

标签: sql sql-server inner-join temp-tables

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

我正在使用此查询

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. 你怎么解释这个? Isn的优化器足够聪明,无法过滤 在加入数据集之前读取数据集时的两个表?

  2. 有没有其他选择而不是使用临时表?

2 个答案:

答案 0 :(得分:0)

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

对于此查询:

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

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

答案 1 :(得分:0)

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

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

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