Announcement

Collapse
No announcement yet.

Performancevergleich versch. SQL-Anweisungen

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

  • Performancevergleich versch. SQL-Anweisungen

    <html>

    <head>
    <meta http-equiv="Content-Type"
    content="text/html; charset=iso-8859-1">
    <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
    <title>Normale Seite ohne Titel</title>
    </head>

    <body bgcolor="#FFFFFF">

    <pre>Zur Vertiefung meines Grundwissens interessiert mich folgendes:</pre>

    <pre>Meine Daten sind auf mehrere Interbase Tabellen verteilt. In einer ieser Tabellen liegen die Adressendaten, getrennt nach Name, Str., Hausnr. usw.. Bei der Datenabfrage werden die Felder wieder zusammengesetzt innererhalb der SQL-Anweisung).</pre>

    <pre>Momentan sieht meine SQL-Anweisung so aus:</pre>

    <pre>select ..., ..., (select Postleitzahl || &quot; &quot; || ort || &quot;, &quot; || strasse || &quot; &quot; || Hausnummer
    from ADRESSEN where anlage.adressindex = index_) where ...</pre>

    <pre>Die Daten sind alle vom Typ varchar.</pre>

    <pre>Kann ich die Performance der SQL-Anweisung verbessern, indem ich ein View erzeuge, das die vollständige Adresse in einem Feld enthält und ich dann dieses Feld in meiner select-Anweisung verwende? </pre>

    <pre>Meine zweite Idee ist eine stored Procedures die mir die zusmmengesetzte Adresse liefert. </pre>

    <pre>Vielleicht gibt es ja auch noch andere Varianten. </pre>

    <p>&nbsp;</p>

    <pre>Danke Torsten</pre>
    </body>
    </html>

  • #2
    Hallo,

    anstelle der <b>Sub-Query</b> würde ich einen <b>Join</b> über beide Tabellen ausprobieren. Mit dem Join sollte der InterBase die Daten spürbar schneller liefern. Allerdings kann mit dem InterBase-Tool <b>InterBase Interactive SQL</b> über den Menüpunkt <i>Session -> Basic Settings</i> die Option <b> Display Query Plan</b> aktiviert werden. In diesem Fall liefert der InterBase die Entscheidung seines <b>Optimizers</b> zurück und zeigt den Weg der Datenermittlung an. Mit diesen Daten kann man dann anschließend seine eigenen SQLs solange optimieren, bis das beste Ergebnis erzielt wird.

    Ein <b>VIEW</b> wird in bereits analysierter Form in der Datenbank abgelegt, so daß der Optimizer nicht bei jedem Aufruf seine Arbeit erneut durchführen muß - somit ist ein VIEW schneller (wie viel, hängt von dem Leistungsverbrauch der Abfrage ab). Für eine <b>Stored Procedure</b> gilt in diesem Punkt das Gleiche

    Comment


    • #3
      Auf jeden Fall sollte man sub Querys vermeiden, wenn es irgendwie geht!

      Mein Rat:

      Stored Procedure, weil hier der Programmierer die Strategie (also den Plan) festlegt, ohne das der Optimierer noch die Chance zur Benutzung einer "unglücklichen" Strategie ha

      Comment


      • #4
        <html>

        <head>
        <meta http-equiv="Content-Type"
        content="text/html; charset=iso-8859-1">
        <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
        <title>Normale Seite ohne Titel</title>
        </head>

        <body bgcolor="#FFFFFF">
        <b>
        <pre>Ich habe mich an der Erstellung der stored procedure versucht.
        Mit dem Aufruf habe ich allerdings Probleme.
        Ich wollte die stored procedure in meine select-Anweisung integrieren,
        bekomme aber immer die Fehlermeldung &quot;unbekannte Funktion&quot;. Kann man
        stored procedure nicht in dieser Art und Weise verwenden bzw. welche
        Lösungsmöglichkeiten gibt es dafür?</pre>

        <p>Definition:</p>

        <pre>create procedure adresse1 (ad_index integer)
        returns (adresse varchar(60))
        as
        begin
        select Postleitzahl || &quot; &quot; || ort || &quot;, &quot; || strasse || &quot; &quot; || Hausnummer from adressen
        where index_ = :ad_index
        into adresse;
        suspend;
        end</pre>

        <p>verwenden möchte ich die stored procedure wie folgt:</p>

        select ..., adresse1(adressindex), ... from adressen<br>
        where ...

        <p>Danke</p>

        Torsten</pre></b>
        </body>
        </html&gt

        Comment


        • #5
          Hallo Torsten,

          auch wenn dieser Aufruf einer Stored Procedures vom InterBase unterstützt würde, ändert das nichts am Problem der <b>Sub Query</b>. In der Stored Procedure werden nur Felder einer Tabelle genutzt, daher ist der Performancegewinn minimal (der Optimizier hat bei dieser SELECT-Anweisung keine knifflige Aufgabe zu lösen, so daß er in jedem Fall sehr schnell fertig ist). Ich würde daher eine der folgenden Alternativen wählen: <br>
          1. Das Sub Select durch eine JOIN-Abfrage ersetzen, oder <br>
          2. Die vollständige SELECT-Abfrage in eine Stored Procedure auslagern. <br>
          Die Reihenfolge der Alternativen ist auch meine Wertigkeit.

          Beispiel (SQL89-Syntax): <br>
          <pre>
          SELECT r.RECHNUNGSNUMMER, r.KundenIndex,
          a.Postleitzahl || " " || a.Ort || ", " || a.Strasse || " " || a.Hausnummer
          FROM Rechnung r, Adressen a
          WHERE r.KundenIndex = a.Index
          </pre>

          oder moderner in der SQL92-Syntax: <br>
          <pre>
          SELECT r.RECHNUNGSNUMMER, r.KundenIndex,
          a.Postleitzahl || " " || a.Ort || ", " || a.Strasse || " " || a.Hausnummer
          FROM Rechnung r JOIN Adressen a ON r.KundenIndex = a.Index
          </pre>

          In jedem Fall würde ich mir aber den <b>Query-PLAN</b> anschauen, den der InterBase zurückliefert. Taucht dort der Verweis auf einen verwendeten INDEX auf

          Comment


          • #6
            <html>

            <head>
            <meta http-equiv="Content-Type"
            content="text/html; charset=iso-8859-1">
            <meta name="GENERATOR" content="Microsoft FrontPage Express 2.0">
            <title>Normale Seite ohne Titel</title>
            </head>

            <body bgcolor="#FFFFFF">

            <pre><font face="Arial"><strong>Hallo Andreas,</strong></font></pre>

            <pre><font face="Arial"><strong>es werden Indizes verwendet. Der Query-Plan sieht wie folgt aus:</strong></font></pre>

            <pre><font face="Arial"><strong>select anlagennummer, anlagenname,
            (select Postleitzahl || &quot; &quot; || ort || &quot;, &quot; || strasse || &quot; &quot; || Hausnummer
            from ADRESSEN where anlage.adressindex = index_)
            from anlage</strong>

            <br>PLAN (ADRESSEN INDEX (ADRESSEN_INDEX))
            PLAN (ANLAGE NATURAL)
            </font></pre>

            <pre><font face="Arial">
            Current memory = 310208
            Delta memory = 0
            Max memory = 317416
            Elapsed time= 0.03 sec
            Buffers = 75
            Reads = 0
            Writes 0
            Fetches = 49

            </font></pre>

            <pre><font face="Arial">
            <strong>select al.anlagennummer, al.anlagenname,
            ad.Postleitzahl || &quot; &quot; || ad.ort || &quot;, &quot; || ad.strasse || &quot; &quot; || ad.Hausnummer
            from anlage al left join adressen ad on al.adressindex =ad. index_</strong>

            <p>
            PLAN JOIN (AL NATURAL,AD INDEX (ADRESSEN_INDEX))</p>

            Current memory = 310208
            Delta memory = 0
            Max memory = 317416
            Elapsed time= 0.03 sec
            Buffers = 75
            Reads = 0
            Writes 0
            Fetches = 50

            </font></pre>

            <p><font face="Arial"></font>&nbsp;</p>

            <pre><font face="Arial"><strong>Vielen Dank für Deine Info's. In Zukunft kann ich zumindest diese Performance-Fallgruben
            umgehen.</strong></font></pre>

            <p><font face="Arial"></font>&nbsp;</p>

            Tschüß

            Torsten
            <p>&nbsp;</p>
            </body>
            </html&gt

            Comment


            • #7
              Hallo zusammen,

              ich hab mal eine Frage zur Performance von Interbase-Servern.
              Wir setzen einen Interbase - Server 5.1 unter Novell ein. Beim
              Upsizing von Daten aus einer bestehenden dBase-Datenbank
              (ca. 50.000 Datensätze) braucht der Server ca. 48 Stunden um
              die Daten zu übertragen. In der Interbase Tabelle sind noch keine
              Indizes definiert. Auch mit BatchMove gehts nicht schneller. Hat jemand
              eine Idee????

              Danke im voraus.

              Norber

              Comment


              • #8
                Hallo Nobert,

                werden die 50 000 Datensätze aus der dBASE-Tabelle in einer Transaktion importiert und geht das Step by Step je Datensatz mit einer neuen Transaktion? Verwendet die InterBase-Datenbank INSERT-Trigger? Ist zum Zeitpunkt des Import noch ein anderen User in der Datenbank?

                Was passiert, wenn in einer explizit gestarteten Transaktion die InterBase-Tabellen über die folgende Beispielanweisung mit Daten gefüllt wird:
                <pre>
                INSERT INTO ":KonferenzWS_IB:KUNDENIMP" (KUNDENID, VORNAME, NACHNAME)
                SELECT p.KDNNR, p.N1, p.N2 FROM Adressen p
                </pre>

                Die InterBase-Tabelle wird dank der LOCAL SQL-Fähigkeiten der BDE mit dem Inhalt der dBASE-Tabelle Adressen gefüllt. Erst am Ende wird die laufende Transaktion mit COMMIT bestätigt. Das kann alles im SQL-Explorer (alias Datenbank-Explorer) vorab getestet werden (diese Anweisung wird nur dann fehlerfrei ausgeführt, wenn im SQL-Explorer der BDE-Alias der dBASE-Tabelle Adressen geöffnet und aktiv ist. Nur dann "kennt" die BDE die Syntax von Local SQL. Wird hingegen die Anweisung aus der geöffneten InterBase-Datenbank heraus gestartet, so beschwert sich die BDE beim ersten Doppelpunkt über einen Syntaxfehler). In jedem Fall würde ich den Test aber in einer Delphi-Anwendung und der Transaktionssteuerung über TDatabase wiederholen.
                &#10

                Comment

                Working...
                X