我有一個大表(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」:這也造成成無改善
任何想法?
*從不*在'FROM'子句中使用逗號。 *總是*使用正確的,明確的'JOIN'語法。 –
你可以分享查詢計劃嗎? – Meherzad