0

我们有一个包含五个子查询和 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”提供不同的结果(参见打印屏幕)。

在此处输入图像描述

4

0 回答 0