簡體   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