我们有一个带有五个subquerys和group by子句的复杂sql查询。如果我将数据库服务器缓存限制为16m(使用选项“-ch 16m”),我们会从同一个sql查询中获得随机化的不同结果(这些问题可以在不同的计算机上重现)。我们的客户在他的系统上遇到同样的问题,而没有使用-ch选项和8g可用内存减少缓存。
对这种行为有什么可能的解释?
我们认为获得警告消息或数据库服务器崩溃比不一致的结果更好。
这里是sql:
SELECT (select year(beginnt) * 100 + month ( beginnt ) FROM geschaeftsjahr WHERE beginnt <= '2012-06-30' and
endet >= '2012-06-30' and
mandant_nr = i1_mandant_nr) geschaeftsjahresbeginn_vorjahr_yyyymm,
(select beginnt from geschaeftsjahr where beginnt <= '2012-06-30' and
endet >= '2012-06-30' and
mandant_nr = i1_mandant_nr) geschaeftsjahresbeginn_vorjahr_datum,
(select year(beginnt) * 100 + month ( beginnt ) from geschaeftsjahr where beginnt <= '2013-06-30' and
endet >= '2013-06-30' and
mandant_nr = i1_mandant_nr) geschaeftsjahresbeginn_yyyymm,
(select beginnt from geschaeftsjahr where beginnt <= '2013-06-30' and
endet >= '2013-06-30' and
mandant_nr = i1_mandant_nr) geschaeftsjahresbeginn_datum,
"v_kostenstellenplan"."ks1_kstnummer",
"v_kostenstellenplan"."ks1_bezeichnung",
isnull(sum ( if ksb1_jahr*100+ksb1_monat >= year('2013-06-01')*100+month('2013-06-01') then if not isnull("bereich",'') = 'C' then "ksb1_betrag" else 0 endif else 0 endif * get_vorzeichen_kore(ksb1_mandant_nr,
ksb1_kontonummer)) ,0) "betrag_kosten",
isnull(sum ( if ksb1_jahr*100+ksb1_monat >= year('2013-06-01')*100+month('2013-06-01') then if isnull("bereich",'') = 'C' then "ksb1_betrag" else 0 endif else 0 endif * get_vorzeichen_kore(ksb1_mandant_nr,
ksb1_kontonummer)) ,0) "betrag_ertrag",
betrag_kosten + betrag_ertrag "betrag",
isnull(sum ( if ksb1_jahr*100+ksb1_monat >= year('2013-06-01')*100+01 then if not isnull("bereich",'') = 'C' then "ksb1_betrag" else 0 endif else 0 endif * get_vorzeichen_kore(ksb1_mandant_nr,
ksb1_kontonummer)) ,0) "betrag_kosten_jahresbeginn",
isnull(sum ( if ksb1_jahr*100+ksb1_monat >= year('2013-06-01')*100+01 then if isnull("bereich",'') = 'C' then "ksb1_betrag" else 0 endif else 0 endif * get_vorzeichen_kore(ksb1_mandant_nr,
ksb1_kontonummer)) ,0) "betrag_ertrag_jahresbeginn",
betrag_kosten_jahresbeginn + betrag_ertrag_jahresbeginn "betrag_jahresbeginn",
isnull(sum ( if not isnull("bereich",'') = 'C' then if isnull("ks1_kumulation",'g') = 'a' then /*seit auftragsbeginn*/ "ksb1_betrag" else /*seit Jahresbeginn*/ if ksb1_jahr*100+ksb1_monat >= year('2013-06-01')*100+01 then "ksb1_betrag" else 0 endif endif else 0 endif * get_vorzeichen_kore(ksb1_mandant_nr,
ksb1_kontonummer)) ,0) "betrag_kosten_baubeginn",
isnull(sum ( if isnull("bereich",'') = 'C' then if isnull("ks1_kumulation",'g') = 'a' then /*seit auftragsbeginn*/ "ksb1_betrag" else /*nur Vorjahreszahlen*/ if ksb1_jahr*100+ksb1_monat >= year('2013-06-01')*100+01 then "ksb1_betrag" else 0 endif endif else 0 endif * get_vorzeichen_kore(ksb1_mandant_nr,
ksb1_kontonummer)) ,0) "betrag_ertrag_baubeginn",
betrag_kosten_baubeginn + betrag_ertrag_baubeginn "betrag_baubeginn",
isnull(sum ( "ksb1_betrag" ),0) "betrag_vorjahr",
count() count,
"i_daten"."i1_name",
"i_daten"."i1_mandant_nr",
"i_daten"."i1f1_zahlenformat_auswertung",
isnull(v_kostenstellenplan.ks1_inaktiv,
'n' ) kst_inaktiv,
"v_kostenstellenplan"."kl_nr1",
"v_kostenstellenplan"."kl_bez1",
"v_kostenstellenplan"."kl_bez_ergebnis1",
"v_kostenstellenplan"."kl_nr2",
"v_kostenstellenplan"."kl_bez2",
"v_kostenstellenplan"."kl_bez_ergebnis2",
"v_kostenstellenplan"."kl_nr3",
"v_kostenstellenplan"."kl_bez3",
"v_kostenstellenplan"."kl_bez_ergebnis3",
"v_kostenstellenplan"."kl_nr4",
"v_kostenstellenplan"."kl_bez4",
"v_kostenstellenplan"."kl_bez_ergebnis4",
"v_kostenstellenplan"."kl_nrn",
"v_kostenstellenplan"."ks1_typ",
"v_kostenstellenplan"."ks1_kumulation",
isnull((select k.ks1_verantwortlicher from kostenstelle k where k.ks1_kstnummer = "v_kostenstellenplan"."ks1_kstnummer" and
k.ks1_mandant_nr = "v_kostenstellenplan"."ks1_mandant_nr"),'') kst_verantwortlicher FROM "v_kostenstellenplan" join "konto_kst_statistik_budget" on "v_kostenstellenplan"."ks1_mandant_nr" = "konto_kst_statistik_budget"."ksb1_mandant_nr" and
"v_kostenstellenplan"."ks1_kstnummer" = "konto_kst_statistik_budget"."ksb1_kostenstelle" and
"v_kostenstellenplan"."kl1_typ" = 'ks2' join "konto" on "konto"."kontonummer" = "konto_kst_statistik_budget"."ksb1_kontonummer" and
"konto"."mandant_nr" = "konto_kst_statistik_budget"."ksb1_mandant_nr" join "i_daten" on "konto"."mandant_nr" = "i_daten"."i1_mandant_nr" where not ksb1_quelle = string(char(70),
char(51)) and
not "left"(ksb1_quelle,1) = CHAR(66) and
string('D1;D2;D3;F1;F2;F4;F5;F50;F51;F52;K1;K2;L1;N1;N2;N3;N4;N5;O1;O2;P1;',
'F20;F21;F23;') like string(char(37),ksb1_quelle,
char(59) ,
char(37)) and
/*Seit Baubeginn oder Geschäftsjahresbeginn*/ ksb1_jahr*100+ksb1_monat >= if isnull("v_kostenstellenplan"."ks1_kumulation",'g') = 'a' then 0 else year('2012-06-01')*100+month('2012-06-01') end if and
ksb1_jahr*100+ksb1_monat <= year('2013-06-30')*100+month('2013-06-30') and
"kontonummer" not in (907010,997010,907011,997011 ) and
ks1_kstnummer in (select kk.kk1_kostenstelle from kostenstelle_Klassierung kk join klassierung_typ on kk1_typ = kt1_typ join klassierung on kl1_id = kk1_klassierung_id where kk1_mandant_nr = isnull(i1_kostenstellen_vererben_von_mandant_nr,
i1_mandant_nr) and
kk1_typ = 'kst' and
kl1_nummer >= '7150' and
kl1_nummer <= '7150' ) and
i1_mandant_nr in (13) GROUP BY "v_kostenstellenplan"."ks1_kstnummer",
"v_kostenstellenplan"."ks1_bezeichnung",
"i_daten"."i1_name",
"i_daten"."i1_mandant_nr",
"i_daten"."i1f1_zahlenformat_auswertung",
"v_kostenstellenplan"."ks1_inaktiv",
"v_kostenstellenplan"."kl_nr1",
"v_kostenstellenplan"."kl_bez1",
"v_kostenstellenplan"."kl_bez_ergebnis1",
"v_kostenstellenplan"."kl_nr2",
"v_kostenstellenplan"."kl_bez2",
"v_kostenstellenplan"."kl_bez_ergebnis2",
"v_kostenstellenplan"."kl_nr3",
"v_kostenstellenplan"."kl_bez3",
"v_kostenstellenplan"."kl_bez_ergebnis3",
"v_kostenstellenplan"."kl_nr4",
"v_kostenstellenplan"."kl_bez4",
"v_kostenstellenplan"."kl_bez_ergebnis4",
"v_kostenstellenplan"."kl_nrn",
"v_kostenstellenplan"."ks1_typ",
"v_kostenstellenplan"."ks1_kumulation",
ks1_mandant_nr HAVING ( "betrag_kosten" <> 0 OR "betrag_ertrag" <> 0 OR "betrag" <> 0 OR "betrag_kosten_jahresbeginn" <> 0 OR "betrag_ertrag_jahresbeginn" <> 0 OR "betrag_jahresbeginn" <> 0 OR "betrag_kosten_baubeginn" <> 0 OR "betrag_ertrag_baubeginn" <> 0 ) ORDER BY i_daten.i1_mandant_nr,
"v_kostenstellenplan"."kl_nr1",
"v_kostenstellenplan"."kl_nr2",
"v_kostenstellenplan"."kl_nr3",
"v_kostenstellenplan"."kl_nr4",
"ks1_kstnummer"
例如,“betrag_kosten”列提供了不同的结果(请参阅版画屏幕)。