[英]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
你怎么解釋呢? 在連接表之前讀取數據集時,優化器是否不夠聰明,無法過濾兩個表?
除了使用臨時表,還有其他選擇嗎?
臨時表上的查詢運行速度可能更快,因為該表上的統計信息是准確的。 這有助於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.