[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2006
    Beiträge
    78

    SQL Funktion IN oder OR

    Hallo Zusammen,

    wollte mal wissen was aus Performance Sicht schneller im SQL ist wenn ich einen Feldinhalt in verschiedensten Sätzen prüfen will.
    Ist hier die Funktion IN oder OR schneller?

    Beispiel:

    select sum(Betrag) into :SumBetrag
    from DATEI
    where Firma = :A
    and Person = :B
    and Monat = :Mai
    and (FeldA = 'AB' or FeldA = 'CD' or FeldA = 'EF' or FeldA = 'RS' or FeldA = 'UV')

    oder

    select sum(Betrag) into :SumBetrag
    from DATEI
    where Firma = :A
    and Person = :B
    and Monat = :Mai
    and FeldA in ('AB', 'CD', 'EF', 'RS', 'UV')

    Vielen Dank für Eure Anregungen!

    LG

  2. #2
    Registriert seit
    Aug 2006
    Beiträge
    2.077
    Ich sach mal: Versuch macht klug. ___ GG

  3. #3
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Morgen,

    Sowas ist etwas schwierig zu beantworten.
    Am besten das ganze (wie schon vorgeschlagen) ausführen lassen und die erstellten Zugriffspläne miteinander vergleichen.
    Es könnte durchaus sein, dass die DB für beide SQLs den gleichen Zugriffsplan verwendet.

    Nur die Zeiten zu messen ist oft trügerisch, da im 1. SQL die Daten der Tabelle in den RAM geschrieben werden und das 2. SQL dadurch schon mal schneller sein kann.

    lg Andreas

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Lass beide Abfragen durch den Visual Explain laufen.
    Visual Explain zeigt den verwendeten Zugriffsplan (Access Plan) an.

    Da der Query Optimizer vor Ausführung jedes SQL Statement zunächst scannt und ggf. umschreibt, sollte die Ausführung im Endeffect auf der gleichen (umgeschriebenen) Abfrage basieren und damit auch der gleiche Zugriffsplan verwendet werden.

    Auf alle Fälle sollte ein Zugriffsweg (Index oder logische Datei) mit PersNr, Firma, Monat und FeldA vorhanden sein.

    ggf. kann man die Performance noch durch einen EVI (Encoded Vector Index) mit den zuvor vorgeschlagenen Schlüssel-Feldern und einer INCLUDE-Anweisung (Sum(Betrag) verbessern.
    Wird der EVI verwendet, so kann ein Index-Only-Access (IOA) erfolgen, d.h. alle notwendigen Informationen sind im Index hinterlegt, so dass kein Zugriff auf die eigentlichen Datensätze mehr erforderlich ist.

    Birgitta
    Birgitta Hauser

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

  5. #5
    Registriert seit
    Feb 2006
    Beiträge
    78
    Vielen Dank für Eure Anregungen!

    Ich werde das ganze mal ein wenig testen.
    Schöner wäre es gewesen wenn die eine oder andere Methode von Grund her schneller gewesen wäre.
    Aber nichts desto trotz ist mir schon sehr viel geholfen.

    Danke!
    LG

  6. #6
    Registriert seit
    Oct 2013
    Beiträge
    171
    Das wäre dann aber ein mehr als lausiger Optimizer, wenn die eine die andere Methode um Längen schlüge. Die Mehrheit erwartet absolut gleiche Laufzeit.
    Aber ich denke, wir sind auch alle gespannt, ob es stimmt. :-)
    Bitte berichte!

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Schöner wäre es gewesen wenn die eine oder andere Methode von Grund her schneller gewesen wäre.
    Warum! Sei doch froh, dass beide Abfragen zum gleichen Access Plan führen!
    Es wäre traurig, wenn der Optimizer solche einfachen Dinge nicht erkennen könnte!
    Es gibt noch genügend andere Möglichkeiten, bei der die eine oder andere Codierung ein besseres oder schlechters Ergebnis liefern.

    Außerdem welchen Sinn macht es ob die eine Version 0,0001 und die andere 0,0002 Sekunden benötigt. Wenn Du nicht die richtigen Zugriffswege hast, bringt das alles nichts.
    ... und zu glauben, man gibt einfach eine logische Datei an und dann wird diese genommen ...
    Pustekuchen! Wenn der Zugriffsweg in der vorgegebenen logischen verwendet wird, ist das nichts weiter als Zufall.

    Birgitta
    Birgitta Hauser

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

  8. #8
    Registriert seit
    Feb 2006
    Beiträge
    78
    Da es nicht immer nachvollziehbar oder vorhersehbar ist was SQL im Hintergrund genau macht, war für mich auch nicht klar, das selbst unterschiedliche SQL Abfragen (rein von der Codierung her) im Hintergrund für SQL auch gleich sein können.

    Nichts desto trotz spielt es für mich insofern eine entscheidende Rolle, da ich nicht nur einen Zugriff in dieser Art pro Person habe sondern viele mehr die mir die Daten sammeln.
    Und des weiteren auch das ich sehr viele Personen in der Datenbank habe (bis zu 20000 pro Land).

    Aber ich muss mir dazu generell noch Gedanken machen ob ich nicht eine Vorselektion treffen kann der mir den zeitfressenden Zugriff auf die DB minimiert.
    Ich komm hier zum Handkuss, den dieses Pgm ist schon älter und ich habs nun "geerbt".

    Darum war für mich vorweg ein schneller Ansatz hier zu hinterfragen ob SQL mit der ein oder anderen Methode schneller wäre - ein Trugschluss wie ich feststelle.

    Alle Infos die ich bekomme sind für mich hilfreich, auch wenn diese kritisch sind ;-)

    Vielen Dank!

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... selbst dieselbe Abfrage könnte in Abhängigkeit von anderen Bedingungen unterschiedlich ausgeführt werden. Beschreibe doch mal genauer Dein Problem (nicht die vermuteten Lösungen), die obige Beschreibung sieht erst mal nicht nach Problem aus: mehrere Zugriffe sind ja normal und 20.000 ist für eine Datenbank nicht viel.

    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/

  10. #10
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von XMan Beitrag anzeigen
    Darum war für mich vorweg ein schneller Ansatz hier zu hinterfragen ob SQL mit der ein oder anderen Methode schneller wäre - ein Trugschluss wie ich feststelle.
    Grundsätzlich ist dein Ansatz richtig. Bei Probleme mit der Performance sollte neben Indexstrategie auch das SQL selbst kritisch gesehen werden.

  11. #11
    Registriert seit
    Nov 2007
    Beiträge
    371
    OPS NAV - PLAN CACHE , Visual Explain , wird SQE verwendet (ok wird bei deinem Statement verwendet (Ausser Omit/Select logische ) aber ich glaub das hat die IBM auch hinbekommen , QAQQINI , Statisik..... das fällt mir auf die schnelle ein

Similar Threads

  1. Funktion die ich vermisse
    By AS400.lehrling in forum Intern - Hilfe - Feedback - Tests-Forum
    Antworten: 4
    Letzter Beitrag: 20-10-15, 20:24
  2. Datum in SQL Funktion prüfen
    By malzusrex in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 07-11-14, 08:01
  3. Funktion für Feldeintrag
    By H.V in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 20-09-02, 16:00
  4. Frage zur Formatierung mit Funktion DIGITS in QRY
    By hs in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 14-02-02, 06:30
  5. SQL Funktion " Like"
    By Stefan_R in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 23-01-02, 16:08

Berechtigungen

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