Announcement

Collapse
No announcement yet.

Query nicht performant genug

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

  • Query nicht performant genug

    Tag zusammen.
    Folgendes Problem: Ich habe zwei Tabellen (categories und products) und will alle Kategorien auswählen und die Anzahl der Produkte einer einzelnen Kategorie zählen.
    Mein Query:
    Code:
    SELECT *, (SELECT count(*) FROM products WHERE cat_id = c.id) AS num_prod FROM categories c;
    Das ist natürlich nicht sehr performant und braucht bei 400 Kategorien und 50000 Produkten ein paar Minuten.

    Gibt es einen effektiveren Weg um ans Ziel zu gelangen? Oder sollte ich gleich in der categories-Tabelle eine neue Spalte num_products anlegen, die ich dann anderweitig aktuell halte?

    Vielen Dank,
    Gruß Stefan

  • #2
    Wie wäre es hiermit:
    [highlight=sql]SELECT count(*), c.id
    FROM products
    JOIN categories c ON cat_id = c.id
    GROUP BY c.id[/highlight]

    oder noch einfacher falls du nur die Spalte cat_id benötigst:
    [highlight=sql]SELECT count(*), cat_id
    FROM products
    GROUP BY cat_id[/highlight]

    Gruss

    Comment


    • #3
      Gerade hier sehe ich eigentlich nur Sinn in der 2. Variante. Es ist schon schwer 400 Kategorien zu überblicken, da brauche ich doch nicht auch noch 50000 Produkte.

      Wenn Du öfters große Datenmengen zählen musst, dann bieten sich hierfür diverse Produkte an die besser geeignet sind als pures SQL. z.B.

      Lucene .NET

      oder

      Endeca

      Comment


      • #4
        Das ist schon mal sehr viel besser, danke :-)

        Nachteil ist aber, dass Kategorien ohne Produkte nicht mit ausgewählt werden. Ich denke das beste wird sein, wenn ich das Ergebnis zwischenspeichere und entweder regelmäßig oder bei Bedarf aktualisiere.

        Comment


        • #5
          Originally posted by stefan09 View Post
          Nachteil ist aber, dass Kategorien ohne Produkte nicht mit ausgewählt werden.
          Das kannst du lösen indem du im ersten Vorschlag einen right outer join nimmst.

          Comment

          Working...
          X