2017-02-04 29 views
0

У меня есть задача получить данные из таблицы для некоторых сотрудников за определенные годы, но запрос занимает ок. 50 минут, чтобы получить 50 000 записей emp.Запрос Db2 занимает слишком много времени

Стол имеет ок. 6 млрд рублей (6 * 10^9) данные

Запрос:

select a, b 
from t1 
where t1.year in (2012,2013) and 
     t1.name in (select name from name_tab fetch first 50000 rows only) 

Partitioned table: t1 
partitioned col: t1.year 

Index col: t1.name 

Я проверил план доступа и с удивлением видит, что ни один раздел, ни индекс привыкает.

+1

Уход за публикацией плана (из 'db2exfmt') и фактической таблицы и индекса DDL? – mustaccio

ответ

0

Во-первых, попробуйте этот запрос:

select a, b 
from t1 
where t1.year = 2012 and 
     t1.name in (select name from name_tab fetch first 50000 rows only) 

ли распознать раздел? Если это произойдет, попробуйте написать запрос как:

select a, b 
from t1 
where t1.year = 2012 and 
     t1.name in (select name from name_tab fetch first 50000 rows only) 
union all 
select a, b 
from t1 
where t1.year = 2013 and 
     t1.name in (select name from name_tab fetch first 50000 rows only) 

Вы можете поместить в подзапроса в order by, поэтому имена гарантированно будут одинаковыми.

Затем введите индекс на name_tab(name).

+0

Я попытался использовать 't1.year = 2012', но он все еще не использует раздел – PuneetGupta

+0

@PuneetGupta. , , Что-то связано с разделением. Может ли год быть сохранен в виде строки. Использование неправильных типов может смутить оптимизатор. –

+0

не может использовать тип данных года, так как таблица уже имеет ~ 600 кроров записей – PuneetGupta