[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jun 2001
    Beiträge
    2.044

    SQL + Performance

    Hi
    ich habe folgenes select im interaktiven SQL abgesetzt, es ist rasend schnell
    Code:
    select 'K1',susunr, susun2, case                           
    when length(replace(replace(sukto1, '-', ''), ' ', ''))=9 
    then '0' concat replace(replace(sukto1, '-', ''), ' ', '')        
    when length(replace(replace(sukto1, '-', ''), ' ', ''))=8         
    then '00' concat replace(replace(sukto1, '-', ''), ' ', '')       
    when length(replace(replace(sukto1, '-', ''), ' ', ''))=7         
    then '000' concat replace(replace(sukto1, '-', ''), ' ', '')      
    when length(replace(replace(sukto1, '-', ''), ' ', ''))=6        
    then '0000' concat replace(replace(sukto1, '-', ''), ' ', '')    
    when length(replace(replace(sukto1, '-', ''), ' ', ''))=5        
    then '00000' concat replace(replace(sukto1, '-', ''), ' ', '')   
    when length(replace(replace(sukto1, '-', ''), ' ', ''))=4        
    then '000000' concat replace(replace(sukto1, '-', ''), ' ', '')  
    when length(replace(replace(sukto1, '-', ''), ' ', ''))=3        
    then '0000000' concat replace(replace(sukto1, '-', ''), ' ', '') 
    else replace(replace(sukto1, '-', ''), ' ', '')                  
    end as kto,                                                        
           replace(replace(sublz1, '-', ''), ' ', '') as blz           
                          from schulp where sukto1 <> ' '
     union all                                                         
     select 'K2',susunr, susun2, case                                  
    when length(replace(replace(sukto2, '-', ''), ' ', ''))=9        
    then '0' concat replace(replace(sukto2, '-', ''), ' ', '')       
    when length(replace(replace(sukto2, '-', ''), ' ', ''))=8        
    then '00' concat replace(replace(sukto2, '-', ''), ' ', '')      
    when length(replace(replace(sukto2, '-', ''), ' ', ''))=7        
    then '000' concat replace(replace(sukto2, '-', ''), ' ', '')     
    when length(replace(replace(sukto2, '-', ''), ' ', ''))=6       
    then '0000' concat replace(replace(sukto2, '-', ''), ' ', '')   
    when length(replace(replace(sukto2, '-', ''), ' ', ''))=5       
    then '00000' concat replace(replace(sukto2, '-', ''), ' ', '')  
    when length(replace(replace(sukto2, '-', ''), ' ', ''))=4       
    then '000000' concat replace(replace(sukto2, '-', ''), ' ', '') 
    when length(replace(replace(sukto2, '-', ''), ' ', ''))=3       
    then '0000000' concat replace(replace(sukto2, '-', ''), ' ', '')
    else replace(replace(sukto2, '-', ''), ' ', '')                 
    end as kto,                                                   
           replace(replace(sublz2, '-', ''), ' ', '') as blz      
                          from schulp where sukto2 <> ' '
    Ich 'normalisiere' das Feld KontoNr ( eine alpha Feld )
    auf 10 Stellen mit führender 0, ohne blank und -
    Da in der Datei 2 KontoNr sind, hänge ich die 2. Nr
    einfach dahinter.

    Erstelle ich damit eine View und mache ein
    Select * from view
    warte ich über eine Stunde auf die Anzeige.
    Interactiv im SQL, ohne View, habe ich sofort ein Bild.
    Auch ein LF (Index) über SUKTO1, SUBLZ1 bringt nix (auch SUKTO2 SUBLZ2)

    Muß ich nun die Daten doch physikalisch kopieren
    um schnell mit meiner Kontonr einen Debitor zu finden?

    Wie kann ich das beschleunigen ?
    V5R4, ca 1,25 Mio Debitoren
    Danke
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Die erste Frage die sich mir stellt ist, warum machst du das ?
    Kannst du die Daten nicht anders selektieren ?

    Der interaktive SQL macht sowieso irgend was anderes, was ich bisher auch noch nicht rausgefunden habe, auch Birgitta hat sich hierzu noch nicht geäußert.
    Debug und sonstige Analysen habe da noch nichts gebracht.

    Ausserdem enthält dein SQL auch keine Where-Klausel (die bezieht sich auf den Einzelsatz), dann zeigt SQL von Anfang an.

    Nun zu deiner View:

    Da du mit Sicherheit auf die View mit einer Whereklausel losgehst ist SQL gezwungen einen Tablescan durchzuführen, da diese Where-Klausel erst auf das Ergebnis angewendet werden kann.
    Durch die Union auch noch 2 Mal, wenn in der ersten nichts gefunden ist.

    Hier hilft nur tatsächlich ein Feld anzuhängen (bzw. 2. Datei), diese mit einem Trigger aus der 1. Datei im passenden Format füllen.

    Interaktiv kannst du das auch so machen:

    with
    MyView as (
    Select ...
    )
    select * from MyView
    where ...

    Ich denke, interaktiv wirst du da auch nicht schneller.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Übrigens versuch mal:

    right('0000000000' concat trim(replace(Konto, '-', '')), 10)
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  4. #4
    Registriert seit
    Jun 2001
    Beiträge
    2.044
    moin
    Die erste Frage die sich mir stellt ist, warum machst du das ?
    Kannst du die Daten nicht anders selektieren ?
    Habe Daten, die von den Erfassern 'Optisch angenem Lesbar' erfasst wurden. mit -, mit blank, mit ...(diverses)

    Bekomme vom Lieferanten nun Kontonr. Immer 10 Stellen, immer ohne Blank.
    Und nun soll ich die zuordnen. Ich habe zwar auch einen Namen, diese sind aber noch schlimmer verunstaltet, ggf sogar falsch.

    Da du mit Sicherheit auf die View mit einer Whereklausel losgehst ist SQL gezwungen einen Tablescan durchzuführen, da diese Where-Klausel erst auf das Ergebnis angewendet werden kann.
    Nö, zum testen ob das so geht wie ich mir das denke, mach ich nur : select * from view (mehr nicht)

    Habe nun zunächst die interaktive selektion in eine datei ausgegeben und teste die Erfolgsquote.

    Aber ohne Redundante Daten währ es mir 1000 mal lieber.
    na dann muß wohl später ein Trigger eine 2. Datei pflegen
    Gruß
    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    @interaktives SQL anders: es wird (fast) immer auf die schnelle Anzeige der ersten Sätze optimiert

    @View Stunden lang: typischer Bug des Query Optimizers

    @zusätzliche Datei: drittbeste Lösung

    @zweitbeste Lösung: zusätzliches Feld in derselben Datei per Trigger pflegen

    @Lösung: Datenbankdesign korrigieren!!! Kontonummer ist ein Schlüsselfeld - und Hunz in solchen Feldern führt zu Problemen jeder Art (Doubletten inklusiver falscher Zuordnung)

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Schlechte SQL Performance bei Join?
    By schatte in forum IBM i Hauptforum
    Antworten: 22
    Letzter Beitrag: 16-08-10, 06:26
  2. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  3. SQL Performance
    By mariupol1963 in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 11-08-06, 13:06
  4. Ferne SQL Analyse / Performance
    By pwrdwnsys in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 16-08-05, 08:56
  5. embedded SQL Performance Problem mit SCROLL
    By itec01 in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 16-09-04, 18:38

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •