performance issue
Posted in 2003
Topics: Performance & Tuning, SQL Development & Query Writing
Hi,
We're stuck with a periodical performance problem, and need some advice on
the reason.
As can be seen from the attached sql-explain files, the problem seems to
relate to the optimizer, which shifts between different strategies - one
better than the other. This occurs irregularly, making it a difficult
problem to trace.
Update statistics is run on a regular basis on all involved databases.
The setup is as follows:
Data is stored in an ANSI-mode database (running informix 9.30.uc2), from
where it is replicated to another server (unix_repldb running informix
9.30.uc2), in UNBUFFERED mode. From here data is accessed by a webserver
using a remote connection. The webserver is running informix 9.30.TC2
When the problem occurs, it usually lasts a few minutes and then suddenly
disappears. When the problem is occuring, there's no sign of other
bottlenecks on the involved serves (ie. disk performance or memory).
It has not been possible to recreate the problem locally on the replicated
database.
--------------------------------
sqlexplain ---------------------------------------------
----------------------------------------------------------------------------
-----------------
THE SLOW QUERY - compare to the same query below
----------------------------------------------------------------------------
-----------------
QUERY:
------
select --
adresse.adr_fornavn_va40 fornavn, --
adresse.adr_efternavn_va40 eftnavn, --
adresse.adr_vejnavn_va40 vejnavn, --
adresse.post_postnummer_va4 postnr_dk, --
adresse.adr_titel_va40 titel, --
brugerdeftyper.bdt_navn uddan, --
date(stamkort.stam_indmeldelses_dato_dt) inddato, --
date(stamkort.stam_udmeldelses_dato_dt) uddato, --
adresse.adr_telefon_va20 tlfnr1, --
adresse.adr_tlf2 tlfnr2, --
adresse.adr_telefon_mobil_va20 mobilnr1, --
adresse.adr_mobil2 mobilnr2, --
adresse.adr_fax_va20 faxnr1, --
adresse.adr_fax2 faxnr2, --
adresse.adr_e_mailadresse_va40 email1, --
'', -- tidl. email2 nu ikke brugt l'ngere --
dk_postnummer.post_by_va40 postdist, --
--mr3_getcpr(date(stamkort.stam_foedelsdato_dt),stamkort.stam_person_lbnr),
--18 cprnr
adresse.adr_attention_va40 att, --
adresse.adr_postbox_va20 postbox, --
stamkort.foreningsnummer_i forening_nummer, --
forening.fore_navn_va40, --
adresse.landekodeva3 landekode, --
adresse.adr_postnr_udland_va40 postnr_udl, --
date(brugerdef.bdf_gyldig_til) --
from --
repl_mr3@unix_repldb:stamkort stamkort, --
repl_mr3@unix_repldb:adresse adresse, --
outer repl_mr3@unix_repldb:dk_postnummer dk_postnummer, --
repl_mr3@unix_repldb:brugerdef brugerdef, --
repl_mr3@unix_repldb:forening forening, --
repl_mr3@unix_repldb:brugerdeftyper brugerdeftyper --
where --
stamkort.stam_medlemsnummer_i = '10649448' --
and stamkort.adr_nummer_n06 = adresse.adr_nummer_n06 --
and adresse.post_postnummer_va4 = dk_postnummer.post_postnummer_va4 --
and stamkort.stam_medlemsnummer_i = brugerdef.stam_medlemsnummer_i --
and stamkort.foreningsnummer_i = forening.foreningsnummer_i --
and brugerdef.bdt_id=brugerdeftyper.bdt_id --
and brugerdeftyper.bdt_gruppe = 'Uddannelse' --
and (stamkort.stty_korttype = 'Medlem' OR stamkort.stty_korttype = 'Ej
Medlem')
Estimated Cost: 3488162
Estimated # of Rows Returned: 2147483647
1) informix.stamkort, informix.brugerdef, informix.forening: REMOTE PATH
Remote SQL Request:
select x0.stam_indmeldelses_dato_dt ,x0.stam_udmeldelses_dato_dt
,x0.foreningsnummer_i ,x0.stam_medlemsnummer_i ,x0.adr_nummer_n
06 ,x0.stty_korttype ,x1.bdf_gyldig_til ,x1.stam_medlemsnummer_i
,x1.bdt_id ,x2.fore_navn_va40 ,x2.foreningsnummer_i from repl_m
r3:"informix".stamkort x0 ,repl_mr3:"informix".brugerdef x1 ,rep
l_mr3:"informix".forening x2 where ((x0.stam_medlemsnummer_i = '
10649448' ) AND ((x0.stty_korttype = 'Medlem' ) OR (x0.stty_kort
type = 'Ej Medlem' ) ) ) AND (x0.stam_medlemsnummer_i = x1.stam_
medlemsnummer_i ) AND (x0.foreningsnummer_i = x2.foreningsnummer
_i )
2) informix.adresse: REMOTE PATH
Remote SQL Request:
select x3.adr_fornavn_va40 ,x3.adr_efternavn_va40 ,x3.adr_vejnav
n_va40 ,x3.post_postnummer_va4 ,x3.adr_titel_va40 ,x3.adr_telefo
n_va20 ,x3.adr_tlf2 ,x3.adr_telefon_mobil_va20 ,x3.adr_mobil2 ,x
3.adr_fax_va20 ,x3.adr_fax2 ,x3.adr_e_mailadresse_va40 ,x3.adr_a
ttention_va40 ,x3.adr_postbox_va20 ,x3.landekodeva3 ,x3.adr_post
nr_udland_va40 ,x3.adr_nummer_n06 from repl_mr3:"informix".adres
se x3
(1) Index Keys: adr_nummer_n06
Lower Index Filter: informix.stamkort.adr_nummer_n06 =
informix.adresse.adr_nummer_n06
NESTED LOOP JOIN
3) informix.brugerdeftyper: REMOTE PATH
Remote SQL Request:
select x4.bdt_navn ,x4.bdt_id ,x4.bdt_gruppe from repl_mr3:"info
rmix".brugerdeftyper x4 where (x4.bdt_gruppe = 'Uddannelse' )
DYNAMIC HASH JOIN
Dynamic Hash Filters: informix.brugerdef.bdt_id =
informix.brugerdeftyper.bdt_id
4) informix.dk_postnummer: REMOTE PATH
Remote SQL Request:
select x5.post_by_va40 ,x5.post_postnummer_va4 from repl_mr3:"in
formix".dk_postnummer x5
DYNAMIC HASH JOIN
Dynamic Hash Filters: informix.adresse.post_postnummer_va4 =
informix.dk_postnummer.post_postnummer_va4
----------------------------------------------------------------------------
------------------
THE QUICK QUERY
----------------------------------------------------------------------------
------------------
QUERY:
------
select --
adresse.adr_fornavn_va40 fornavn, --
adresse.adr_efternavn_va40 eftnavn, --
adresse.adr_vejnavn_va40 vejnavn, --
adresse.post_postnummer_va4 postnr_dk, --
adresse.adr_titel_va40 titel, --
brugerdeftyper.bdt_navn uddan, --
date(stamkort.stam_indmeldelses_dato_dt) inddato, --
date(stamkort.stam_udmeldelses_dato_dt) uddato, --
adresse.adr_telefon_va20 tlfnr1, --
adresse.adr_tlf2 tlfnr2, --
adresse.adr_telefon_mobil_va20 mobilnr1, --
adresse.adr_mobil2 mobilnr2, --
adresse.adr_fax_va20 faxnr1, --
adresse.adr_fax2 faxnr2, --
adresse.adr_e_mailadresse_va40 email1, --
'', -- tidl. email2 nu ikke brugt l'ngere --
dk_postnummer.post_by_va40 postdist, --
--mr3_getcpr(date(stamkort.stam_foedelsdato_dt),stamkort.stam_person_lbnr),
--18 cprnr
adresse.adr_attention_va40 att, --
adresse.adr_postbox_va20 postbox, --
stamkort.foreningsnummer_i forening_nummer, --
forening.fore_navn_va40, --
adresse.landekodeva3 landekode, --
adresse.adr_postnr_udland_va40 postnr_udl, --
date(brugerdef.bdf_gyldig_til) --
from --
repl_mr3@unix_repldb:stamkort stamkort, --
repl_mr3@unix_repldb:adresse adresse, --
outer repl_mr3@unix_repldb:dk_postnummer dk_postnummer, --
repl_mr3@unix_repldb:brugerdef brugerdef, --
repl_mr3@unix_repldb:forening forening, --
repl_mr3@unix_repldb:brugerdeftyper brugerdeftyper --
where --
stamkort.stam_medlemsnummer_i = '10649448' --
and stamkort.adr_nummer_n06 = adresse.adr_nummer_n06 --
and adresse.post_postnummer_va4 = dk_postnummer.post_postnummer_va4 --
and stamkort.stam_medlemsnummer_i = brugerde