[53400] in SAPr3-news

home help back first fref pref prev next nref lref last post

Re: Performance-Problem

daemon@ATHENA.MIT.EDU (Christian Knappke)
Tue Feb 15 04:10:11 2005

To: sapr3-news@mit.edu
Date: Tue, 15 Feb 2005 09:05:21 +0000 (UTC)
From: Christian Knappke <chknews@gmx.net>
Message-ID: <Xns95FE66A04338Dnnsshiqqcuusnqfigmxn@10.16.7.20>

From the keyboard of Jens Hoetger <Jens.Hoetger@de.bosch.com>:

> On Fri, 11 Feb 2005 10:06:56 +0000 (UTC), Christian Knappke
> <chknews@gmx.net> wrote:
> 
> <snip>
>>
>>Ist das ABAP-Statement ein SELECT ... FOR ALL ENTRIES ...?

> In dem Testprogramm ist ein SELECT ... WHERE <feld> IN
> <tabelle>, was wohl auf das gleiche hinauslaeuft. 

Nein. Das ist nicht das gleiche, da das DBI diese Statements ggfs. 
unterschiedlich umsetzt und unterschiedliche Parameter "ziehen".

> Allerdings ist
> das im "Original"-Programm so nicht drin, dort wird etliche Male
> ein einzelnes Set von Datensaetzen gelesen (ohne
> Selektionstabelle, also statt einem Zugriff viele einzelne
> Zugriffe). Fuer das Testprogramm hatte ich das per
> Selektionstabelle versucht, was letzten Endes aber auch nicht
> den Durchbruch gebracht hat. 

>>Die IN-Liste ist relativ lang (besonders für Orrible 9). Du
>>kannst das für FOR-ALL-ENTRIES-Statements mit dem
>>Profilparameter rsdb/ {min|max}_in_blocking_factor einstellen.
>>Der steht zweckmäßig auf kleinen Werten (5 ... 20). Die
>>aktuellen Werte findest Du im dev_*-Trace eines beliebigen DIA-
>>oder BKG-WPs ziemlich am Anfang,  auch wenn der Profilparameter
>>noch nicht gesetzt ist. RSPARAM zeigt Dir evtl. nur -1, was
>>heißt "Kernel-Default". 

> Da werden die Parameter 2x aufgelistet:
> B Mon Feb 14 01:17:26 2005                                      
>  B  dbtran INFO (init_connection '<DEFAULT>' [ORACLE:46D.00]):  
>   B   max_blocking_factor =   5,  max_in_blocking_factor     
> =1000, B   min_blocking_factor =   5,  min_in_blocking_factor   
>   =  10, 

Ich sehe hier sowohl max_in_blocking_factor als auch 
min_in_blocking_factor nur einmal aufgelistet. Die gehören bei 
ORA9 beide auf 5..10, keinesfalls auf 1000. Das ist mit aktuellen 
Kernel-Patches AFAIK auch schon korrigiert.

>>Leider lässt Du Dich nicht näher über die View-Definition aus, 
>>evtl. spielen weitere Selektionen im View noch eine Rolle. Auch 
>>kann ich momentan nicht nachsehen, wie der Index aussieht 
>>(abgesehen davon, dass das SAP-Release im Dunkel bleibt). 

> Der Join sieht folgendermassen aus:
> Tabelle         Feldname        =Tabelle         Feldname      
> MSEG            MANDT           =MKPF            MANDT         
> MSEG            MBLNR           =MKPF            MBLNR         
> MSEG            MJAHR           =MKPF            MJAHR         
> SAP-Release ist 4.6c (Support Packages bis 47).

Hmm, das ist allerdings nur ein Teil der View-Definition, nämlich 
die Join-Bedingung. Die ist in Ordnung, es wird über die ersten 
drei Felder, bzw. bei MKPF über den Primärschlüssel ge-join-t.

>>Du liest 2236 rows. Dazu ist evtl. eine Menge I/O nötig und das 
>>braucht Zeit. Läuft es beim zweiten Mal deutlich schneller?

> Es laeuft zwar schneller, wg. DB-Puffer, aber die Zeiten sind
> immer noch jenseits von gut und boese. 

>>Wieviel % der rows in MSEG findet die DB mit den 64 MATNRn, die
>>Du im Statement angibst?

> Die Tabelle hat 18,8 Mio Saetze, und die Selektion auf 64
> Materialnummern ergibt eine Treffermenge von 484 Saetzen (0,002
> %). 

IMO ist die IN-Liste zu lang. Teil' Dein Statement mal in kleinere 
Häppchen: sezt die o.g. Parameter richtig und schreib' das ABAP-
Statement um in ein SELECT ... FOR ALL ENTRIES.

>>MSEG ist eine Clustertabelle. Überleg mal, ob Du die gewünschten
>>Daten nicht günstiger über eine der vielen Indextabellen zur
>>MSEG beschaffen kannst. Dazu befrag' mal die MM-Experten.

Hab' jetzt mal nachgesehen. MSEG ist hier transparent. 

> Die Haelfte der benotigten Felder findet sich nicht in einem
> Index. 

Ich meinte keinen Datenbank-Index, sondern Index-Tabellen. Das 
sind Tabellen, die bestimmte Ausschnitte der in solchen 
Monstertabellen wie MSEG enthaltenen Daten redundant bereithalten. 
Aus diesen kann man ggfs. viel eleganter seine gewünschten 
Informationen beziehen. Wie gesagt, frag Deine MM-Experten.

> Es gibt noch einen Ansatzpunkt, und zwar mit dem Oracle event
> 10062, wodurch man erweiterte Trace-Details kriegt. Muessen wir
> mal probieren... mal sehen, was dabei rauskommt.  

HTH

Christian
-- 
#include <std_disclaimer.h> 
/* The opinions stated above are my own and not 
   necessarily those of my employer. */

home help back first fref pref prev next nref lref last post