[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2006
    Beiträge
    112

    Problem gepackte und gezonte Felder (SQL)

    Moin Kollegens',

    folgendes Anliegen:

    Ich lese eine Datei per SQL und setze zudem ein subselect auf eine andere Datei ab.

    In der Ausgangsdatei ist das Schlüsselfeld gepackt und in der zugelesenen Datei ist das Schlüsselfeld gezont.

    Auf beiden Dateien gibt es entsprechend logische Dateien - aber SQL liest immer sequentiell - logische bleiben unberücksichtigt !

    Weiß jemand, wie man dieses Problem in den Griff bekommt ?

    Liebe Grüße und ein schönes Wochenende
    wünscht

    BratMaxxe

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo,

    gib zunächst einmal das SQL-Statement an.
    u.U. ist dann schon ersichtlich, warum jeweils ein Table Scan erforderlich ist. (mich macht der Sub-Select stutzig!)

    Ansonsten sind gepackt (Decimal) und gezont (Numeric) auch für SQL unterschiedliche Datentypen. Zugriffswege können nur auf Original-Spalten erstellt werden. Für die Verknüpfung ist zumindest für eine Datei eine Konvertierung erforderlich, d.h. für diese Datei kein Zugriffsweg verwendet werden.

    Es könnte demnach für eine der beiden Dateien ein Zugriffsweg verwendet werden.

    Eventuell kann dies durch Umschreiben des SQL-Statements errreicht werden. Aber das ist ohne das SQL-Statement zu kennen und ohne weitere Analyse reine Spekulation.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    wie Birgitta bereits bemerkte, lässt sich ein (in Ziffern 1) sequentieller Zugriff noch wegkriegen, wobei noch offen ist, ob das was bringt, aber wirklich heilen kann man dies nur mit einer Verbesserung des Datenbank Designs, sprich Keyfelder müssen zueinander passen.

    D*B

    Zitat Zitat von Bratmaxxe Beitrag anzeigen
    Moin Kollegens',

    folgendes Anliegen:

    Ich lese eine Datei per SQL und setze zudem ein subselect auf eine andere Datei ab.

    In der Ausgangsdatei ist das Schlüsselfeld gepackt und in der zugelesenen Datei ist das Schlüsselfeld gezont.

    Auf beiden Dateien gibt es entsprechend logische Dateien - aber SQL liest immer sequentiell - logische bleiben unberücksichtigt !

    Weiß jemand, wie man dieses Problem in den Griff bekommt ?

    Liebe Grüße und ein schönes Wochenende
    wünscht

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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Das Problem tritt leider häufig bei Kombination diverser Anwendungen auf, die ursprünglich wenig oder gar nichts mit einander zu tun haben.

    Bei Join-Beziehungen (auch Subselect), muss dann eben die linke Seite gecastet werden:

    select ...
    from filea
    join fileb on cast(filea.key as ...)=fileb.key

    In deinem Fall also

    cast(a.key as zoned(n, m)) = b.key

    Ist die Ausprägung ggf. auch noch anders muss ggf. mehrfach gecastet werden.
    Ich habe z.B. das Problem, dass in Brain-XPPS die Kunden-Nr. 8-stellig gepackt ist, in DCW-Fibu aber 7-stellig Alpha!
    Dies geht auch sehr schnell eben mit:

    substr(digits(kdkdnr), 2, 7) = UKTO

    Für andere Feldtypen müssen eben entsprechende Regeln angewendet werden.
    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

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    hier könnte es auch Sinn machen eine zusätzliche Umschlüsselungstabelle für die Kundennummer anzulegen und zusätzlich zu joinen (geht natürlich auch nicht immer)
    D*B


    Zitat Zitat von Fuerchau Beitrag anzeigen
    Das Problem tritt leider häufig bei Kombination diverser Anwendungen auf, die ursprünglich wenig oder gar nichts mit einander zu tun haben.

    Bei Join-Beziehungen (auch Subselect), muss dann eben die linke Seite gecastet werden:

    select ...
    from filea
    join fileb on cast(filea.key as ...)=fileb.key

    In deinem Fall also

    cast(a.key as zoned(n, m)) = b.key

    Ist die Ausprägung ggf. auch noch anders muss ggf. mehrfach gecastet werden.
    Ich habe z.B. das Problem, dass in Brain-XPPS die Kunden-Nr. 8-stellig gepackt ist, in DCW-Fibu aber 7-stellig Alpha!
    Dies geht auch sehr schnell eben mit:

    substr(digits(kdkdnr), 2, 7) = UKTO

    Für andere Feldtypen müssen eben entsprechende Regeln angewendet werden.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Jan 2006
    Beiträge
    112
    Hallo,

    anbei das SQL Statement:

    Code:
     
    select terminkont.*,                                                
    (select sum(bmvmen) from pbestlo where bmkonz = mandant
    and bmfirm = '001' and bmbedarfnr = bedarfnr) 
    as menge 
    from terminkont 
    where mandant = '100' and ktr = 666 and block = '10'  
    In der Datei pbestlo ist das Feld BMBEDARFNR ZONED
    in der Datei Terminkont ist das Feld bedarfnr PACKED

    Das nachfolgende Statement bringt auch keine Abhilfe !

    Code:
     
    select terminkont.*,                                                
    (select sum(bmvmen) from pbestlo where bmkonz = mandant  
    and bmfirm = '001' and cast (bmbedarfnr as dec(10, 0))= bedarfnr) 
    as menge 
    from terminkont 
    where mandant = '100' and ktr = 666 and block = '10'

    Gruß und schönes Wochenede
    Bratmaxxe

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo,

    explizites casten bringt nichts, da der Optimizer wie zuvor erwähnt nur Zugriffwege, die über die Original-Spalten generiert wurden verwenden kann. Wenn Du ein Feld castest, veränderst Du es und damit ist die Verwendung eines Zugriffspfades über diese Spalte unmöglich.

    M.E. bewirkt der Subselect, dass für beide Tabellen ein Table Scan erfolgen muss.
    Versuch mal die Abfrage wie folgt umzuschreiben:
    PHP-Code:
    Wit x as (Select Bmkonzbmbedarfnrsum(bmvmen) as Menge
                from pbestlo
                Where bmKonz 
    '100' and bmfirm '001'
                
    group by bmkonzbmbedarfnr)
    select terminkont.*, Menge
      from terminkont join x 
    on bmkonz 
    mandant and mandant '100' and bmbedarfnr bedarfNr
      where ktr 
    666 and block '10'

    oder

    PHP-Code:
    Select terminkont.*, Menge
       from terminkont join 
    (select bmkonzbmbedarnrsum(mbvmen) as Menge
                               from pbestlo
                               where bmkonz 
    '100' and bmfirm '001'
                               
    group by bmkonzbmbedarnr)
            
    on bmkonz mandant and mandant '100' and bmbedarf bedarfnr
       Where ktr 
    666 and block '10' 
    Sofern ich mich nicht vertan habe, sollte der Optimizer jetzt in der Lage sein, zumindest für eine Tabelle einen Index zu verwenden, wenn nicht sogar für beide.
    Vorausgesetzt entsprechende Zugriffswege (Mandant, KTR, Block, bmkonz, bmfirm) vorhanden sind und das Ergebnis nicht mehr als ca. 20% aller Datensätze betrifft.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    da gibt es ja nicht nur den Subselect, sondern auch noch Auswahlfelder auf beiden Tables, da würde ich das Statement erst mal unter debug laufen lassen und mir im Joblog anschauen, was ihm an welchem Index nicht schmeckt und ob es einen anderen haben will.

    D*B


    Zitat Zitat von Bratmaxxe Beitrag anzeigen
    Hallo,

    anbei das SQL Statement:

    Code:
     
    select terminkont.*,                                                
    (select sum(bmvmen) from pbestlo where bmkonz = mandant
    and bmfirm = '001' and bmbedarfnr = bedarfnr) 
    as menge 
    from terminkont 
    where mandant = '100' and ktr = 666 and block = '10'  
    In der Datei pbestlo ist das Feld BMBEDARFNR ZONED
    in der Datei Terminkont ist das Feld bedarfnr PACKED

    Das nachfolgende Statement bringt auch keine Abhilfe !

    Code:
     
    select terminkont.*,                                                
    (select sum(bmvmen) from pbestlo where bmkonz = mandant  
    and bmfirm = '001' and cast (bmbedarfnr as dec(10, 0))= bedarfnr) 
    as menge 
    from terminkont 
    where mandant = '100' and ktr = 666 and block = '10'

    Gruß und schönes Wochenede
    Bratmaxxe
    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. Gezonte Felder aus Bildschirm-/Druckdateien intern gepackt
    By Xanas in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 13-06-06, 14:38
  2. problem mit eigener sql function
    By Stefan_Sk in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-05-06, 16:37
  3. SQL Problem
    By Lucky4712 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-05-06, 15:57
  4. SQL :mehrere felder in einen string
    By Robi in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 24-03-05, 14:43
  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
  •