View Full Version : SQL Problem
Da läßt du mal den Optimizer ein paar Meldungen ausgeben:
STRDBG
STRSQL
select * from MyView
where ...
Im Joblog findest du diverse Hinweise zum Anlegen von Indizes.
Es werden viel zu viele (unnötige!!!) SELECT-Statements ausgeführt.
Prüfe mal, ob das folgende Statement das gleiche Ergebnis bringt und wenn ja, wie sich die Performance verhält.
Select A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL,
Coalesce(Min(Case When R3_User = '1' or (r3_user = ' ' and flgdefault = 'X')
Then Tel_Number End), '') as Tel1,
Coalesce(Min(Case When R3_User = ' ' and flgdefault = ' '
Then Tel_Number End), '') as Tel2,
Coalesce(Min(Case When R3_User = '3' or (r3_user = '2' and flgdefault = 'X')
Then Tel_Number End), '') as Tel3,
Coalesce(Min(Case When R3_User = '2' and flgdefault = ' '
Then Tel_Number End), '') as Tel4,
Coalesce(Min(Case When FLGDEFAULT = 'X'
Then SMTP_ADDR End), '') as EMail1,
Coalesce(Min(Case When FLGDEFAULT = ' '
Then STMT_ADDR End), '') as EMail2
From R3P02Data.KNA1 left outer join R3P02Data.ADR2 b on b.ADDRNUMBER = ADRNR
left outer join R3P02Data.ADR6 c on c.ADDRNUMBER = ADRNR
Where A.KUNNR < '0000999999' AND A.MANDT = '101' AND A.KUNNR <> '0000062871'
Group By A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL
Für eine akzeptable Performance sind auf alle Fälle Zugriffswege (Indices oder logische Dateien) für die jeweiligen Dateien über die Felder ADDRNUMBER, MANDT, KUNNR, ADRNR, R3_User, FLGDEFAULT erforderlich.
Birgitta
Wo ist denn da die Spalte CONSNUMBER ?
Wo ist denn da die Spalte CONSNUMBER ?
Die hab' ich unterschlagen, weil war auch in dem Statement, das gestern oder so gepostet wurde nicht drin.
Birgitta
bettina_martin
17-06-10, 09:28
Es werden viel zu viele (unnötige!!!) SELECT-Statements ausgeführt.
Prüfe mal, ob das folgende Statement das gleiche Ergebnis bringt und wenn ja, wie sich die Performance verhält.
Select A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL,
Coalesce(Min(Case When R3_User = '1' or (r3_user = ' ' and flgdefault = 'X')
Then Tel_Number End), '') as Tel1,
Coalesce(Min(Case When R3_User = ' ' and flgdefault = ' '
Then Tel_Number End), '') as Tel2,
Coalesce(Min(Case When R3_User = '3' or (r3_user = '2' and flgdefault = 'X')
Then Tel_Number End), '') as Tel3,
Coalesce(Min(Case When R3_User = '2' and flgdefault = ' '
Then Tel_Number End), '') as Tel4,
Coalesce(Min(Case When FLGDEFAULT = 'X'
Then SMTP_ADDR End), '') as EMail1,
Coalesce(Min(Case When FLGDEFAULT = ' '
Then STMT_ADDR End), '') as EMail2
From R3P02Data.KNA1 left outer join R3P02Data.ADR2 b on b.ADDRNUMBER = ADRNR
left outer join R3P02Data.ADR6 c on c.ADDRNUMBER = ADRNR
Where A.KUNNR < '0000999999' AND A.MANDT = '101' AND A.KUNNR <> '0000062871'
Group By A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL
Für eine akzeptable Performance sind auf alle Fälle Zugriffswege (Indices oder logische Dateien) für die jeweiligen Dateien über die Felder ADDRNUMBER, MANDT, KUNNR, ADRNR, R3_User, FLGDEFAULT erforderlich.
Birgitta
Vielen Dank für den Code. Aber das ist ja jetzt ein Select auf die einzelnen Datein und keine View-Erstellung. Es muss auf diesen View zugegriffen werden, da ein direkter Zugriff auf die Datein in der Lib R3P02DATA nicht erlaubt ist von aussen, da es sich hier um ein SAP-System handelt mit strikten Regeln für den Zugriff :(
D.h. ich MUSS einen View erstellen in einer eigenen Lib auf den dann zugegriffen wird von einer anderen AS/400.
CREATE VIEW ViewName AS ( SELECT ... )
bettina_martin
17-06-10, 09:39
CREATE VIEW ViewName AS ( SELECT ... )
stimmt, auch wieder logisch. man sieht hier die schwächen eines sap-programmieres was SQL anbelangt :D
bettina_martin
17-06-10, 10:41
Die hab' ich unterschlagen, weil war auch in dem Statement, das gestern oder so gepostet wurde nicht drin.
Birgitta
hmmm, wie bring ich das mit der consnumber jetzt noch rein ins sql ?
habe folgenden fall:
consnumber tel_number flgdefault
1 0662/640 617 X
2 0662/650 440
3 0662/640 552
Der View bringt in Spalte TEL1 jetzt die Nummer mit consnumber 1, das ist richtig.
Aber in TEL2 steht jetzt die TElefonnummer mit consnumber 3 drinnen, das ist falsch. Hier möchte ich die Consnumber 2 haben, also die niedrigste Nummer.
bettina_martin
18-06-10, 12:11
so, habe jetzt das ganze fertig, die Performance passt jetzt halbwegs. Habe 2 Subselects drinnen, die sich meiner Meinung nach nicht vermeiden lassen, ABER:
Jetzt habe ich ein neues Problem: wenn ich den View in ein SAVF packe, und den View auf einer anderen AS/400(wo die SAP-Daten liegen) wieder 'auspacke' funktioniert der Zugriff ordnungsgemäss AUSSER die 2 Felder tel2 und mobil2. Dort bekomm ich immer blank im Ergebnis.
Was kann das sein ?
Auf der anderen Maschine funktiokniert der Zugriff, dort liegen Kopien der 3 Datein KNA1,ADR2 und ADR6.
create view cmsms1/zkna4_view AS
(Select A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01,
A.PSTLZ, A.LAND1, A.SORTL,
Coalesce(Min(Case When B.R3_User = '1' or (B.r3_user = ' ' and
B.flgdefault = 'X')
Then Tel_Number End), '') as Tel1,
Coalesce(Min(Case When B.R3_User = ' ' and B.flgdefault = ' '
and B.consnumber = (Select Min(Consnumber) from
R3P02DATA/adr2 where addrnumer = A.adrnr and
R3_User = ' ' and flgdefault = ' ')
Then Tel_Number End), '') as Tel2,
Coalesce(Min(Case When B.R3_User = '3' or (B.r3_user = '2' and
B.flgdefault = 'X')
Then Tel_Number End), '') as Mobil1,
Coalesce(Min(Case When B.R3_User = '2' and B.flgdefault = ' '
and B.consnumber = (Select Min(Consnumber) from
R3P02DATA/adr2 where addrnumer = A.adrnr and
R3_User = '2' and flgdefault = ' ')
Then Tel_Number End), '') as Mobil2,
Coalesce(Min(Case When C.FLGDEFAULT = 'X'
Then SMTP_ADDR End), '') as EMail1,
Coalesce(Min(Case When C.FLGDEFAULT = ' '
and C.consnumber = (Select Min(Consnumber) from
R3P02DATA/adr6 where addrnumer = A.adrnr and
flgdefault = ' ')
Then SMTP_ADDR End), '') as EMail2, A.STCEG
From R3P02Data/KNA1 a
left outer join R3P02Data/ADR2 b on b.ADDRNUMBER = ADRNR
left outer join R3P02Data/ADR6 c on c.ADDRNUMBER = ADRNR
Where A.KUNNR < '0000999999' AND A.MANDT = '101'
AND A.BEGRU <> 'LOES'
Group By A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS,
A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, A.STCEG)
Dann würde ich die Datenbasis prüfen, ob die Bedingungen auch dort so stimmen um die Werte zu ermitteln.