-
Zitat von Pikachu
Paßt doch. Du brauchst natürlich ein MIN() in jedem Sub-SELECT. Wenn zum Beispiel im ersten Sub-SELECT zwei oder mehr Telefonnummern gefunden werden, treffen ja alle zu und du willst dann irgendeine von diesen. Dann nimm doch einfach die kleinste. Die erhältst du dann mit MIN() in diesem Sub-SELECT.
sorry, dann hab ich mich falsch ausgedrückt bzw. ist der source-code vom sql veraltet:
ich will aus der datei ADR2 die tel_number mit der KLEINSTEN consnumber, wo noch andere abfragen im WHERE drinnen sind.
sorry, war wie gesagt ne alte source.
-
Zitat von B.Hauser
Warum versuchst Du nicht das SQL-Statements umzuschreiben und joins zu verwenden, wie ich es bereits vorhin vorgeschlagen habe.
Falls ich heute Abend Zeit habe werde ich das Statement umschreiben.
Birgitta
weil ich SAP-Mensch bin und nicht unbedingt der große SQL-Guru ;-)))
-
Wie ist denn die aktuelle Quelle?
-
Zitat von Pikachu
Wie ist denn die aktuelle Quelle?
Code:
CREATE VIEW ZKNA2_VIEW AS ( SELECT A.MANDT, A.KUNNR, A.NAME1, A.NAME
2, A.STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, VALUE(TEL1, '') AS T
EL1, VALUE(TEL2, '') AS TEL2, VALUE(MOBIL1, '') AS MOBIL1, VALUE(MOB
IL2, '') AS MOBIL2, VALUE(EMAIL1,'') AS EMAIL1, VALUE(EMAIL2,'') AS
EMAIL2, A.STCEG FROM ( SELECT A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.
STRAS, A.ORT01, A.PSTLZ, A.LAND1, A.SORTL, (SELECT TEL_NUMBER FROM R
3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1' ) AS TEL1,
(SELECT TEL_NUMBER FROM R3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND
R3_USER = ' ' ) AS TEL2, (SELECT TEL_NUMBER FROM R3P02DATA.ADR2 WHER
E ADDRNUMBER=A.ADRNR AND R3_USER = '3' ) AS MOBIL1, (SELECT TEL_NUMB
ER FROM R3P02DATA.ADR2 WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '2' )
AS MOBIL2, (SELECT SMTP_ADDR FROM R3P02DATA.ADR6 WHERE ADDRNUMBER=A.
ADRNR AND FLGDEFAULT = 'X' ) AS EMAIL1, (SELECT SMTP_ADDR FROM R3P02
DATA.ADR6 WHERE ADDRNUMBER=A.ADRNR AND FLGDEFAULT = ' ' ) AS EMAIL2,
A.STCEG FROM R3P02DATA.KNA1 A ) AS A WHERE A.KUNNR < '0000999999' A
ND A.MANDT = '101' AND A.KUNNR <> '0000062871' )
sry, hab die quelle nur mehr in dieser unstrukturierten form
die subselects bringen hin und wieder mehr als einen satz (aber selten). das möchte ich verhindern indem ich in den jeweiligen abfragen das MIN von der CONSNUMBER nehme.
-
Das erste Sub-SELECT könnte dann vielleicht so aussehen:
SELECT MIN(TEL_NUMBER) FROM R3P02DATA.ADR2
WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1' AND CONSNUMBER =
(
SELECT MIN(CONSNUMBER) FROM R3P02DATA.ADR2
WHERE ADDRNUMBER=A.ADRNR AND R3_USER = '1'
)
-
so, ich habe das ganze jetzt geschafft, funktioniert sehr gut, NUR: die Performance ist absolut mies. Mein Programmierer, der auf diesen View zugreift killt mich fast dafür.
Wie kann ich das performancemässig verbessern ?
anbei der code
Code:
CREATE VIEW cmsms1/zkna3_view AS (
select A.MANDT, A.KUNNR, A.NAME1, A.NAME2, A.STRAS, A.ORT01,
A.PSTLZ, A.LAND1, A.SORTL, VALUE(TEL1, '') AS TEL1,
VALUE(TEL2, '') AS TEL2, VALUE(MOBIL1, '') AS MOBIL1,
VALUE(MOBIL2, '') AS MOBIL2, VALUE(EMAIL1, '') AS EMAIL1,
VALUE(EMAIL2, '') AS EMAIL2, A.STCEG FROM
(SELECT A.MANDT, A.kunnr, A.NAME1, A.NAME2, STRAS, A.ORT01, A.PSTLZ,
A.LAND1, A.SORTL, A.BEGRU,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr
and (r3_user = '1' or (r3_user = ' ' and flgdefault = 'X'))
and consnumber = (select min(consnumber)
from r3p02data/adr2 where addrnumber=A.adrnr
and (r3_user = '1' or (r3_user = ' ' and flgdefault = 'X'))))
as tel1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr
and r3_user = ' ' and flgdefault = ' '
and consnumber = (select min(consnumber)
from r3p02data/adr2 where addrnumber=A.adrnr and r3_user = ' '
and flgdefault = ' ')) as tel2,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr
and (r3_user = '3' or (r3_user = '2' and flgdefault = 'X'))
and consnumber = (select min(consnumber)
from r3p02data/adr2 where addrnumber=A.adrnr
and (r3_user = '3' or (r3_user = '2' and flgdefault = 'X'))))
as mobil1,
(SELECT tel_number FROM r3p02data/adr2
WHERE addrnumber=A.adrnr
and r3_user = '2' and flgdefault = ' '
and consnumber = (select min(consnumber)
from r3p02data/adr2 where addrnumber=A.adrnr
and r3_user = '2' and flgdefault = ' '))
as mobil2,
(SELECT smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr
and flgdefault = 'X' and consnumber = (select min(consnumber)
from r3p02data/adr6 where addrnumber=A.adrnr and flgdefault = 'X'))
as email1,
(SELECT smtp_addr FROM r3p02data/adr6
WHERE addrnumber=A.adrnr
and flgdefault = ' ' and consnumber = (select min(consnumber)
from r3p02data/adr6 where addrnumber=A.adrnr and flgdefault = ' '))
as email2,
A.STCEG FROM R3P02DATA/KNA1 A ) AS A WHERE A.KUNNR < '0000999999'
AND A.MANDT = '101' AND A.BEGRU <> 'LOES')
-
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.
Code:
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
-
Zitat von B.Hauser
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.
Code:
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 ... )
Similar Threads
-
By Stefan_Sk in forum NEWSboard Programmierung
Antworten: 8
Letzter Beitrag: 26-05-06, 16:37
-
By Lucky4712 in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 24-05-06, 15:57
-
By cbe in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 08-06-05, 16:21
-
By itec01 in forum IBM i Hauptforum
Antworten: 9
Letzter Beitrag: 16-09-04, 18:38
-
By rebe in forum IBM i Hauptforum
Antworten: 1
Letzter Beitrag: 07-09-01, 13:55
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks