我们有一个包含五个子查询和 group by 子句的复杂 sql 查询。如果我将数据库服务器缓存限制为 16m(使用选项“-ch 16m”),我们会从同一个 sql 查询中随机获得不同的结果(这些问题在不同的机器上是可重现的)。我们的客户在他的系统上遇到了同样的问题,但没有使用 -ch 选项减少缓存并使用 8g 可用内存。
这种行为的可能解释是什么?
我们认为收到警告消息或数据库服务器崩溃比结果不一致要好。
- 数据库版本:11.0.1.2744
- 数据库大小:~1g
- 我们还使用最新的 11.0.1.XXXX EBF 版本对其进行了测试。
这里的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”提供不同的结果(参见打印屏幕)。