2017-08-05 91 views
0

我有一個大表(large_table,6M +行)與索引列Sybase ASE的:優化與多個子查詢

  • ID主鍵
  • small_ref_id(整數)一個查詢引用小表的主鍵(small_table,2K +行)
  • mid_ref_id(整數)引用介質表的主鍵(mid_table,200K +行)

  • 的small_table的數據由數據組被命名爲劃分在索引列group_name(varchar)中。

  • mid_table的數據除以在索引列類型(varchar)中命名的數據類型。

  • 大表有2個索引時間戳(date_time1,date_time2)。

  • 中表具有1個索引時間戳(date_time3)。

我的查詢是這樣的:

select * from large_table, mid_table, small_table 
where large_table.small_ref_id=small_table.id 
and large_table.mid_ref_id=mid_table.id 
and small_table.group_name='MyGroup' 
and 
    (large_table.id in (select large_table.id from large_table, mid_table 
where mid_table.id=large_table.mid_ref_id 
and large_table.date_time1 between '2010-01-01' and '2017-01-01' 
and mid_table.type='Type1') 
or large_table.id in (select large_table.id from large_table, mid_table 
where mid_table.id=large_table.mid_ref_id 
and large_table.date_time2 between '2010-06-01' and '2017-01-01' 
and mid_table.type='Type2') 
or large_table.id in (select large_table.id from large_table, mid_table 
where mid_table.id=large_table.mid_ref_id 
and mid_table.date_time3 between '2010-08-01' and '2017-01-01' 
and mid_table.type='Type3')) 

它可能需要幾分鐘時間(< 5分鐘),以獲取結果。

我的嘗試:

  • 劈裂查詢通過small_ref_id到儘可能多的查詢,內部「MyGroup的」 IDS,並行運行(使用應用程序中的線程池,有固定數量的工人):這導致沒有改進,加上100%的數據庫CPU。
  • 更換與「在從large_table(選擇ID large_table.id」「存在(來自large_table噸選擇1其中t.id = large_table.id」:這也造成成無改善

任何想法?

+1

*從不*在'FROM'子句中使用逗號。 *總是*使用正確的,明確的'JOIN'語法。 –

+0

你可以分享查詢計劃嗎? – Meherzad

回答

0

在我看來,你不需要子查詢你可以只適用於三種條件,你已經從主查詢有large_tablemid_table數據:

select  * 
from  large_table 
inner join mid_table 
     on large_table.mid_ref_id = mid_table.id 
inner join small_table 
     on large_table.small_ref_id = small_table.id 
     and small_table.group_name = 'MyGroup' 
where  (
       (large_table.date_time1 between '2010-01-01' and '2017-01-01' 
       and mid_table.type = 'Type1') 
      or 
       (large_table.date_time2 between '2010-06-01' and '2017-01-01' 
       and mid_table.type = 'Type2') 
      or 
       (mid_table.date_time3 between '2010-08-01' and '2017-01-01' 
       and mid_table.type = 'Type3') 
      ) 

作爲一個邊注:使用inner join syntax

注意:你確定最後的條件?它在mid_table.date_time3進行測試,而其他兩個條件的日期從large_table ...

+0

不使用內部連接語法的效果是什麼? – Sybuser

+0

查詢的效率應該沒有差別。這只是一個語法選擇。但是,在「where」條款中加入條件是如此......八十年代呢?這是關於它的[博客](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx)。 – trincot