我有一个大表(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