繁体   English   中英

使用临时表而不是联接来过滤数据,并使用where子句进行过滤

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

使用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. 你怎么解释呢? 在连接表之前读取数据集时,优化器是否不够聪明,无法过滤两个表?

  2. 除了使用临时表,还有其他选择吗?

临时表上的查询运行速度可能更快,因为该表上的统计信息是准确的。 这有助于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) 这些可以加快查询速度。

正如Zoff所说,这可能是查询优化器选择了嵌套循环联接类型而不是哈希联接类型。 为我们提供查询的估计执行计划会对您有所帮助,但是如果执行失败,请尝试按以下查询中的方式强制执行哈希联接类型,并查看其运行速度是否更快。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM