Hoe het versnellen van een query met behulp van de functie en indexering op Informix

stemmen
0

Onder Informix DBMS moet ik versnellen deze query:

set isolation to dirty read;
SELECT NVL(hr_dati1, '---'), NVL(cm_t_stoc, -1) as type,
LPAD(cm_mod,3, 0)||LPAD(cm_col,3, 0) as coord,
NVL(cm_segmento, 0) as seg, NVL(cm_lres, 0) 
FROM informix.artind, informix.coordman
LEFT OUTER JOIN informix.hmdescr ON cm_t_stoc = hr_key_soc AND 
hr_key_pref = 'MGZ' AND hr_key_suff = 'STOCC'
WHERE cm_magaz = '5' AND ad_code = '2065498' AND 
((cm_code = '2065498') OR
((cm_code = ad_coor_r) AND ( SUBSTR(NVL(ad_coor_r, ' '), 1, 2) = 'MU' )
AND
( SUBSTR(NVL(cm_code, ' '), 1, 2) = 'MU' ) ))
ORDER BY type, seg, coord;

De bovenstaande vraag was sneller toen ik als filter alleen gebruikt

(cm_code = '2065498')

in plaats van

((cm_code = '2065498') OR
((cm_code = ad_coor_r) AND ( SUBSTR(NVL(ad_coor_r, ' '), 1, 2) = 'MU')      
AND
( SUBSTR(NVL(cm_code, ' '), 1, 2) = 'MU' ) ))

maar nu moet ik deze nieuwe voorwaarde toe te voegen.

In de zoektocht naar een optimalisatie, en ik geloof dat de traagheid te wijten is aan de substr Ik heb deze functie gemaakt:

create function informix.substr2_ad_coor_r(coor_r char(8))
  returning char(8) with (NOT VARIANT);
  return substr(coor_r, 1, 2);
end function;

en de volgende indices:

create index informix.artind_idx_sub_coor_r on informix.artind
 ( informix.substr2_ad_coor_r(ad_coor_r));

create index informix.coordman_idx_sub_codifa on informix.coordman
 ( informix.substr2_ad_coor_r(cm_codifa));

maar ik heb niet de snelheid genoeg verbeterd, ook het vreemde is dat de query lijkt sneller als ik, in het filter staat, substr bv. (SUBSTR(NVL(ad_coor_r, ' '), 1, 2) = 'MU') in plaats van substr2_ad_coor_r bv.substr2_ad_coor_r(ad_coor_r) = 'MU'

De vraag is gesteld op 19/09/2018 om 13:32
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Ik versneld de query door te splitsen in 2 met behulp van de vereniging:

set isolation to dirty read;
SELECT NVL(hr_dati1, '---'), NVL(cm_t_stoc, -1) as type,
LPAD(cm_mod,3, 0)||LPAD(cm_col,3, 0) as coord,
NVL(cm_segmento, 0) as seg, NVL(cm_lres, 0)
FROM informix.artind, informix.coordman
LEFT OUTER JOIN informix.hmdescr ON cm_t_stoc = hr_key_soc AND
hr_key_pref = 'MGZ' AND hr_key_suff = 'STOCC'
WHERE cm_magaz = '5' AND ad_code = '2065498' AND
(cm_code = '2065498')
UNION
SELECT NVL(hr_dati1, '---'), NVL(cm_t_stoc, -1) as type,
LPAD(cm_mod,3, 0)||LPAD(cm_col,3, 0) as coord,
NVL(cm_segmento, 0) as seg, NVL(cm_lres, 0)
FROM informix.artind, informix.coordman
LEFT OUTER JOIN informix.hmdescr ON cm_t_stoc = hr_key_soc AND
hr_key_pref = 'MGZ' AND hr_key_suff = 'STOCC'
WHERE cm_magaz = '5' AND ad_code = '2065498' AND
((cm_code = ad_coor_r) AND ( SUBSTR(NVL(ad_coor_r, ' '), 1, 2) = 'MU' )
AND
( SUBSTR(NVL(cm_code, ' '), 1, 2) = 'MU' ) )
ORDER BY 1, 3, 2;
antwoordde op 01/10/2018 om 08:34
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more