Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL-Abfrage/Performace-Optimierung

Einklappen

Neue Werbung 2019

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

  • SQL-Abfrage/Performace-Optimierung

    Hallo zusammen,

    ich habe eine SQL Abfrage, welche mir zu lange dauert, leider verliefen meine Optimierungsversuche bisher alle ohne Erfolg.

    zu dem Problem:
    Ich habe 2 Tabellen:
    1. Tabelle "Genre" mit ca. 100 Einträgen und eine 2. Tabelle mit Files (Tracks) sagen wir ca. 100.000 Einträge.

    In der Tabelle Tracks ist in dem Feld "strGenre" mehrere Genre wie folgt gespeichert (da ein Lied mehreren Genre zugeordnet werden kann):
    strGenre ="| Pop | Disco | Electro |"

    In der Tabelle Genre existieren hierfür 3 Einträge (POP, Disco, Electro).
    Meine Ausgabe soll nun wie folgt sein:
    Pro Genre soll eine TrackID des Liedes ermittelt werden (track.idTrack, genre.strGenre (gewünschte Ausgabe: "Pop", "123"))

    SQL zurzeit:
    Code:
    SELECT  genre.[strGenre], tracks.[idTrack]
    FROM genre INNER JOIN tracks 
    ON tracks.[strGenre] like ("%|%" || genre.[strGenre] || " |%" )  group by genre.[strGenre]
    weitere Versuche:
    Code:
    SELECT genre.[strGenre], tracks.[idTrack]
    FROM genre, tracks
    where tracks.[strGenre] like ("%|%" || genre.[strGenre] || " |%" ) 
    group by  genre.[strGenre]
    Code:
    SELECT g.strGenre, t.[idTrack]
    FROM genre g left OUTER JOIN tracks t 
     on t.[strGenre] like ("%|%" || g.[strGenre] || " |%" ) group by g.strGenre
    Wäre klasse, wenn jemand einen Vorschlag zur Optimierung hat. Zurzeit kostet das "group by" zu viel Zeit (ca. 1500 ms mit "group by" ohne ca. 63ms.).

    Danke
    Messiahs

  • #2
    Ganz klassisch: Datenbank Design Fehler

    Daher kommen auch die Performanceprobleme!

    Schau dir mal das Stichwort Normalisierung an. Im Endeffekt brauchst du eine 3te Tabelle die die Kombination von Tracks und Genre darstellt.

    Kommentar


    • #3
      .. daran kann ich leider aber nichts ändern. Sind die Tabellen einer HTPC-Software (MediaPortal)..

      Kommentar


      • #4
        Ich glaube nicht das du mit einer solchen Struktur eine schnellere Methode finden wirst. Denn hier kann man keinen Index verwenden, hier müssen immer alle Datensätze komplett durchsucht werden.

        Kommentar


        • #5
          ... habe ich mir fast gedacht.
          Ein Spit des Feldes track.strGenre ist wahrscheinlich auch nicht möglich... und mit "where exists" kann ich keine Felder zurückgeben, oder ?

          In etwa so:
          Code:
          select genre.strGenre, idTrack from genre 
          where exists (Select tracks.idTrack as idTrack from tracks 
          where tracks.strGenre like ("%|%" || genre.[strGenre] || " |%" )  )

          Kommentar

          Lädt...
          X