Paul: PHP DB-Abfrage

Moin,
mit folgender Zeile frage ich eine MSSQL Datenbank ab:
$stmt = $vgs_pdo->prepare("SELECT NAME, RECHTS, HOCH FROM dbName WHERE RECHTS <= ? AND RECHTS >= ? AND HOCH <= ? AND HOCH >= ?");

Klappt auch. Nur will ich die gefundenen Datensätze wegen der Performance begrenzen.

Habe schon "SELECT top 10 NAME, ..." versucht. Dabei werden nur die ersten 10 Einträge geliefert. Allerdings werden immernoch alle 40.000 Einträge der DB durchsucht => keine Performanceverbesserung.

Wie kann ich es erreichen, dass die Abfrage nach 10 gefundenen Einträgen abbricht?

Paul

  1. Moin,
    mit folgender Zeile frage ich eine MSSQL Datenbank ab:
    $stmt = $vgs_pdo->prepare("SELECT NAME, RECHTS, HOCH FROM dbName WHERE RECHTS <= ? AND RECHTS >= ? AND HOCH <= ? AND HOCH >= ?");

    Klappt auch. Nur will ich die gefundenen Datensätze wegen der Performance begrenzen.

    Habe schon "SELECT top 10 NAME, ..." versucht. Dabei werden nur die ersten 10 Einträge geliefert. Allerdings werden immernoch alle 40.000 Einträge der DB durchsucht => keine Performanceverbesserung.

    Wie kann ich es erreichen, dass die Abfrage nach 10 gefundenen Einträgen abbricht?

    Paul

    Hast dus schon mit LIMIT versucht??

    lg Richie

    1. Hello,

      Hast dus schon mit LIMIT versucht??

      da kann der MSSQL-Server IMHO nichts mit anfangen.

      MfG
      Rouven

      --
      -------------------
      sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
      Death is nature's way of telling you to slow down.
  2. Hello,

    Wie kann ich es erreichen, dass die Abfrage nach 10 gefundenen Einträgen abbricht?

    es mag noch jemanden mit mehr spezifischem MSSQL-Wissen geben (hallo Frank...), aber ich fürchte fast, wenn TOP das Problem NICHT löst, dann wird es ohne weiteres keine Lösung geben. Für jedes Statement mit ORDER BY lässt sich das Verhalten sogar sinnvoll begründen, für eines ohne ORDER BY allerdings nicht ohne weiteres...

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Vegetarier essen meinem Essen das Essen weg.
  3. yo,

    Habe schon "SELECT top 10 NAME, ..." versucht. Dabei werden nur die ersten 10 Einträge geliefert. Allerdings werden immernoch alle 40.000 Einträge der DB durchsucht => keine Performanceverbesserung.

    halte ich für ein Gerücht, vielleicht durchsucht er 40.000 Datensätze, aber er wird nach den ersten 10 Treffer nicht weiter suchen. Es sei den, du hast us nicht die ganze Wahrheit gesagt, und es ist eine Sortierung mit drinne.

    Schau dir mal den Ausführungsplan aus, ich vermute eine felende oder nicht rchtig gesetzte Indizierung.

    Ilja

    1. Stimmt, da steckt noch ne Sortierung mit drin (ORDER BY). Hab ich hier rausgelassen um das Statement klein zu halten (mein Fehler).

      Wäre es nicht trotzdem sinnvoll die ersten 10 Treffer zu sortieren?

      Paul

      1. Auch ohne Sortierung keine Performance Verbesserung!

        Paul

        1. yo,

          das kommt drauf an, wann die sortierunng ausgeführt wird. ob er erst sortiert und dann die ersten 10 holt, oder erst 10 holt und dann sortiert. ich halte es für sinnvoll, erst zu sortieren und dann die 10 ersten auszugeben, dann muss er natürlich über den ganzen bestand. das gleiche problem tritt bei GROUP BY auf.

          Nun aber zurück zu deinem Problem, hast du dir den Ausfürhungsplan angeschaut, sind geeignte Indizes gestezt, um deine Bedingungen in der WHERE klausel abzudecken ? auch sehe ich das ">" Zeichen als kritisch an.

          Ilja

          1. Hallo

            Nun aber zurück zu deinem Problem, hast du dir den Ausfürhungsplan angeschaut, sind geeignte Indizes gestezt, um deine Bedingungen in der WHERE klausel abzudecken ? auch sehe ich das ">" Zeichen als kritisch an.

            diese könnten hier sinnvollerweise durch BETWEEN ... AND ersetzt werden.

            Schnelle Tests mit ca. 100.000 Datensätzen zeigten deutlich unterschiedliche
            Laufzeiten von Abfragen mit und ohne TOP.

            Freundliche Grüße

            Vinzenz

            1. diese könnten hier sinnvollerweise durch BETWEEN ... AND ersetzt werden.

              Da wird bei mir gar nicht gefunden:
              "SELECT TOP 10 NAME, RECHTS, HOCH FROM
                    dbName WHERE RECHTS BETWEEN ? AND ? AND HOCH BTWEEN ? AND ? ORDER BY NAME"

              Oder bin ich zu doof?

              1. Hallo

                diese könnten hier sinnvollerweise durch BETWEEN ... AND ersetzt werden.

                Da wird bei mir gar nicht gefunden:
                "SELECT TOP 10 NAME, RECHTS, HOCH FROM
                      dbName WHERE RECHTS BETWEEN ? AND ? AND HOCH BTWEEN ? AND ? ORDER BY NAME"

                Oder bin ich zu doof?

                wenn Du die Dokumentation zu BETWEEN ... AND nicht gelesen hast und daher die
                Reihenfolge Deiner Parameter nicht geändert hast, dann ist das sicher nicht
                meine Schuld.

                Freundliche Grüße

                Vinzenz

                1. Ganz so doof bin ich dann doch nicht ;-)
                  Folgendes gibt kein Ergebnis (und die Werte liegen 100%-ig dazwischen):

                  "SELECT NAME, RECHTS, HOCH FROM dbName WHERE RECHTS BETWEEN 0 AND 10000000 AND HOCH BTWEEN 0 AND 10000000 ORDER BY NAME"

                  Paul

                  1. Hallo

                    Ganz so doof bin ich dann doch nicht ;-)
                    Folgendes gibt kein Ergebnis (und die Werte liegen 100%-ig dazwischen):

                    HOCH BTWEEN

                    wirft einen Syntaxfehler. BETWEEN ist tägliches Brot, funktioniert zuverlässig!

                    Freundliche Grüße

                    Vinzenz

                    1. Oh, oh! Da bin ich also doch doof :lol:

                      Funktionieren tut's jetzt. Leider ist die Abfrage mit BETWEEN ca. 20% langsamer als mit < >.

                      Paul

              2. Yerf!

                Da wird bei mir gar nicht gefunden:
                "SELECT TOP 10 NAME, RECHTS, HOCH FROM
                      dbName WHERE RECHTS BETWEEN ? AND ? AND HOCH BTWEEN ? AND ? ORDER BY NAME"

                ^^

                Oder bin ich zu doof?

                Ich enthalte mich der Aussage...

                Gruß,

                Harlequin

                --
                <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->
          2. Vielen Dank für Deine Geduld!
            Leider verstehe ich nicht allzuviel davon :-(

            das kommt drauf an, wann die sortierunng ausgeführt wird....

            Wie kann ich das beeinflussen?

            Nun aber zurück zu deinem Problem, hast du dir den Ausfürhungsplan angeschaut,...

            Wo finde ich den?

            sind geeignte Indizes gestezt, um deine Bedingungen in der WHERE klausel abzudecken ?

            Was sind geeignete Indizes?

            auch sehe ich das ">" Zeichen als kritisch an.

            Warum?

            Paul

            1. yo,

              das kommt drauf an, wann die sortierunng ausgeführt wird....
              Wie kann ich das beeinflussen?

              nur mit TOP alleine gar nicht

              Nun aber zurück zu deinem Problem, hast du dir den Ausfürhungsplan angeschaut,...
              Wo finde ich den?

              bin ich was MSSQL angeht überfragt, aber googeln sollte bestimmt ergebnisse aufzeigen.

              sind geeignte Indizes gestezt, um deine Bedingungen in der WHERE klausel abzudecken ?
              Was sind geeignete Indizes?

              tuning ist die königsdiziplin was die datenbank-administration betrifft. selbst profis werden dabei regelmäßig überrascht. Hier gilt probieren über studieren, grundsätzlich isnd spalten ind er WHERE klausel geiegnte Kanditaten für einen Index, wobei ich zusammengesetzte schlüssel einsetzen würde.

              auch sehe ich das ">" Zeichen als kritisch an.
              Warum?

              ein index ist eine sortierung, die man sich wie seitenzahlen vorstellen kann. wenn du nun nach einer bestimmten seite nachschaust, dann findest du die seite im buch recht schnell, schließlich sind die seiten ja sortiert, es sei den der autor hat sich einen spass erlaubt. wenn ich nun aber sage, zeige mir alle seiten größer 100, dann kann ist das natürlich wesentlich ungenauer.

              Ilja

              1. Vielen Dank!