Announcement

Collapse
No announcement yet.

Echt Schwierig! SQL-Abfrage mit Some/Any

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Echt Schwierig! SQL-Abfrage mit Some/Any

    Hallo,

    ich habe folgendes Problem zu lösen, das mir seit Wochen den Verstand raubt!
    In einer alten Datenbankstrucktur (Die leider noch benötigt wird) befinden sich 2 Tabellen Kunde und Auftrag nun sind in Kunden alle Datensätze mehrfach vorhanden weil jedem Kunden verschiedene Kdnr's gegeben wurde
    also anstatt eine Tabelle Lieferanschriften anzulegen wurden alle Kunden
    doppelt und dreifach angelegt mit jeweils verschiedenen Kdnr's 1,1246,9001
    usw. die Schreibweise der Kunden unterscheidet zudem auch noch.
    (Den Kerl könnt ich umbringen!!!) Gottseidank sind die Hauptkunden mit
    Kdnr's von 1- 499 vorhanden, so das es hierbei keine Wiederholung giebt.

    Nun möchte man aber alle Aufträge eines Kunden sehen der ja nunmal verschiedene Kdnr's (Kundennummern) hat, also habe ich eine dritte Tabelle
    generiert in der eine Hauptkdnr(1-499)= KN_Haupt vorhanden ist und jeweils die weiteren Kdnr's als KN_Kdnr nun möchte ich folgende SQL-Anweisung
    einsetzen um alle Aufträge zu ermitteln:

    select AUF_Kdnr, AUF_Auftrag, AUF_NTERM from T_Auftrag Where<br> AUF_NTERM= '200120' and <br>
    AUF_Kdnr= Some(Select KN_Kdnr from T_Kundenr Where KN_Kdnr= '2')<br>
    Order by AUF_Auftrag DESC<br>

    Diese Abfrage (die eigentlich wesentlich umfangreicher ist) dauert auf dem
    Server über die IB-Console bereits rund 4 min. beim Client mehr als 10 min.
    und oft führt Sie zum Absturz.

    FRAGE: Sieht einer von euch eine Alternative? oder mach ich irgendwas falsch ?

    jürgen

  • #2
    Hallo Jürgen,

    probiere es mal so

    <pre>
    select A.AUF_Kdnr, A.AUF_Auftrag, A.AUF_NTERM from T_Auftrag A
    left join T_Kundenr K
    on (A.AUF_Kdnr = K.KN_Kdnr)
    where A.AUF_NTERM= '200120' and
    K.KN_Haupt = 2
    Order by A.AUF_Auftrag DESC
    </pre>

    Ich hoffe mal, dass ich alle Spalten richtig benannt habe.

    Wurden passende Indizes auf die interessanten Spalten angelegt?
    Wurde schon analysiert was der Interbase bei Deiner Abfrage macht (welche Indizes verwendet wurden, wieviel Lesezugriffe per Index und wieviel ohne Index erfolgt sind). Für die Analyse kann man unter anderem auch das Tool <b>IBExpert</b> verwenden <a href="www.ibexpert.com">www.ibexpert.com</a>

    Tschüß

    Torste

    Comment


    • #3
      Hallo Torsten,

      ist echt Spitze deine Lösung. Hätte nicht gedacht das so eine
      Performence (jetzt 0,661 Sec. auf dem Server) möglich ist.

      Schick mir doch mal deine E-Mail Adresse an [email protected]

      Comment


      • #4
        Hallo Jürgen,

        wenn Du auf meinen Namen klickst findest Du u.a. auch meine e-mail Adresse.

        Tschüß

        Torste

        Comment


        • #5
          Hallo Jürgen,

          noch ein kleiner Nachtrag. Wenn Du Dein SQL-Statement in einer StoredProc unterbringst, wirst Du noch einen weiteren deutlichen (bei einer prozentualen Betrachtungsweise) Performancegewinn beobachten können. Als Nebeneffekt verringert sich auch die Netzwerkbelastung.

          Tschüß

          Torste

          Comment


          • #6
            Die Performance Steigerung liegt daran das InterBase bei nested SQL, also

            ... where key = (select ...

            oder so, da hintere SQL Statement für jeden Satz des ersten Teils ausführt. Das ist meist suboptimal und führt zum quadratischen Anstieg des Aufwandes. Daher outer joins oder stored procedures in solchen Fällen benutzen

            Comment

            Working...
            X