2017-02-04 3 views
0

J'ai une tâche pour extraire les données de la table pour certains employés pour des années spécifiques, mais la requête prend env. 50 minutes pour aller chercher 50 000 disques emp.La requête Db2 prend trop de temps

La table a env. 6 milliards (6 * 10^9) Données

Requête:

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 

J'ai vérifié le plan d'accès et surpris de voir que ni partition, ni index devient utilisé.

+1

Prendre soin de publier le plan (à partir de 'db2exfmt') et la table réelle et l'index DDL? – mustaccio

Répondre

0

d'abord, essayez cette requête:

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

reconnaît-elle la partition? Dans le cas contraire, essayez d'écrire la requête comme:

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) 

Vous voudrez peut-être mettre un order by dans la sous-requête, de sorte que les noms sont garantis d'être le même.

Ensuite, mettez un index sur name_tab(name).

+0

J'ai essayé d'utiliser le 't1.year = 2012' mais il n'utilise toujours pas la partition – PuneetGupta

+0

@PuneetGupta. . . Quelque chose ne va pas avec le partitionnement. Est-ce que 'year' pourrait être stocké sous forme de chaîne. L'utilisation de mauvais types peut perturber l'optimiseur. –

+0

ne peut pas chnge le type de données de l'année car la table a déjà ~ 600 crores records – PuneetGupta