Wie beschleunigt eine Abfrage mit der Funktion und Indizierung auf Informix up

stimmen
0

Unter Informix DBMS muss ich diese Abfrage beschleunigen:

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;

Die obige Abfrage war schneller als ich als Filter verwenden nur

(cm_code = '2065498')

anstatt

((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' ) ))

aber jetzt ein Ich brauche diese neue Bedingung hinzuzufügen.

Bei der Suche nach einer Optimierung, und ich glaube, dass die Langsamkeit der substr gebührt ich diese Funktion erstellt haben:

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;

und die diese Indizes:

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));

aber ich habe nicht die Geschwindigkeit genug verbessert, auch das Merkwürdige ist , dass die Abfrage scheint schneller , wenn ich in der Filterbedingung, substr zB. (SUBSTR(NVL(ad_coor_r, ' '), 1, 2) = 'MU') statt substr2_ad_coor_r zB.substr2_ad_coor_r(ad_coor_r) = 'MU'

Veröffentlicht am 19/09/2018 um 13:32
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Ich beschleunigte die Abfrage, indem sie in 2 mit der Union Aufteilung:

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;
Beantwortet am 01/10/2018 um 08:34
quelle vom benutzer

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