Ankündigung

Einklappen
Keine Ankündigung bisher.

Kann man abhängige Queries eigentlich optimieren?

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Kann man abhängige Queries eigentlich optimieren?

    Hi,

    Man nehme eine Tabelle mit der Spalte "name". In der Tabelle sind sagen wir mal 100 Einträge. 50 Davon sind Müller, 50 Meier. Die Reihenfolge dabei ist rein zufällig. Also nicht erst 50 Müllen und dann 50 Meier.

    Ich zeige die Tabelle nun in meinem Webclient in einer HTML Tabelle an, welche aber nur 25 Einträge anzeigt und dann muss man weiterblättern. Ausserdem kann ich nach Namen filtern.

    Nehmen wir nun mal an, ich filtere nach Müller. Dann würde die Tabelle die ersten 25 Müller von insgesamt 50 Müller aus total 100 Einträgen anzeigen.

    Um dem User das transparent zu machen steht genau das unter der Tabelle:

    "Zeiger 25 von 50 Einträgen gefiltert von gesamt 100 Einträgen"

    Um diese Daten zu bekommen muss ich im Moment 3 Queries machen.

    1) SELECT COUNT(name) FROM tabelle
    2) SELECT COUNT(name) FROM tabelle WHERE name = "Müller"
    3) SELECT name FROM tabelle WHERE name = "Müller" LIMIT 1-25

    Wie man sieht ist aber 3 immer eine Teilmenge von 2 und das immer eine Teilmenge von 1 (Wenn man mal davon absieht, dass bei 1 + 2 nur die Anzahl abgefragt wird.

    Bei deisen einfachen Queries ist das ja noch ok aber ich habe teilweise extrem komplexe Queries mit mehrfachen JOIN, CASES und sogar INNER SELECT und vor allem Sortierungen. Das kratzt dann schon ganz schön an der Performance.

    Die Frage ist jetzt ob man es sich irgendwie zu nutze machen kann, dass die 3 Queries Untermengen voneinander sind. Kann man das der DB irgendwie sagen so ala "Der nächste Query kann nur Ergebnisse des vorherigen haben"?

    Oder gibt es da eventuell noch eine ganz andere Lösung?

    Gruß

    Claus
    Pre-Coffee-Posts sind mit Vorsicht zu geniessen!

  • #2
    Zitat von Thallius Beitrag anzeigen
    1) SELECT COUNT(name) FROM tabelle
    2) SELECT COUNT(name) FROM tabelle WHERE name = "Müller"
    3) SELECT name FROM tabelle WHERE name = "Müller" LIMIT 1-25
    diese Abfragen sind nicht voneinander abhängig.
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Wie man sieht ist aber 3 immer eine Teilmenge von 2 und das immer eine Teilmenge von 1 (Wenn man mal davon absieht, dass bei 1 + 2 nur die Anzahl abgefragt wird.
      Das ist ein sehr großes Wenn

      Also ein Beispiel mit einer komplexeren Query wäre schon sinnvoll, denke aber eh, dass man sowas von Fall zu Fall entscheiden muss. Eventuell mal den Queryplan anzeigen lassen ob man irgendwo was findet.
      "Der nächste Query kann nur Ergebnisse des vorherigen haben"
      Vielleicht das Resultset in eine View oder temporäre Tabelle hauen und dann darauf die nächste Query ausführen. Weiß nicht ob das ansatzweise sinnvoll ist, aber kann man ja mal ausprobieren.
      [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
      [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

      Kommentar


      • #4
        Bei grossen InnoDB Tabellen empfiehlt es sich, die gesamte Tabelle nur selten zu zählen. Dafür das Resultat zwischenspeichern.

        Auf ResultSets ein Count ausführen sehe ich nicht so ein Problem.
        [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

        Kommentar


        • #5
          Query 2 und 3 lassen sich mit SQL_CALC_FOUND_ROWS und FOUND_ROWS() zusammenfassen.

          Kommentar


          • #6
            Zitat von erc Beitrag anzeigen
            Query 2 und 3 lassen sich mit SQL_CALC_FOUND_ROWS und FOUND_ROWS() zusammenfassen.
            Das ist ein guter Tipp das kannte ich noch nicht.

            Danke

            Claus
            Pre-Coffee-Posts sind mit Vorsicht zu geniessen!

            Kommentar

            Lädt...
            X