Ergebnis 1 bis 4 von 4

Thema: Abfrage mit OFFSET und ORDER BY langsam

  1. #1
    tzzdr ist offline Neuer Benutzer
    Registriert seit
    07.10.2011
    Beiträge
    8

    Standard Abfrage mit OFFSET und ORDER BY langsam

    Hallo,

    ich habe ein kleines Problem mit der Geschwindigkeit meiner abfrage. Es sind ca. 500000 Datensätze in der Tabelle.
    Könnte Ihr mir tipps geben was ich besser machen kann um die Performance zu erhöhen?

    SQL:
    Code:
    explain analyze
    
    SELECT       r.*, q.*, md5(r.xx)
    FROM         rr AS r
    
    LEFT JOIN    qq AS q
    ON           q.xx = r.xx
    
    LEFT JOIN    aa AS a
    ON         a.xx = r.xx
    
    WHERE        r.xx
    LIKE         '%00%'
    
    OR           a.aa
    LIKE         '%00%' 
    
    ORDER BY r.xx ASC OFFSET 499990 LIMIT 10;
    Code:
    Limit  (cost=119429.73..119429.73 rows=1 width=219) (actual time=9940.137..9940.178 rows=10 loops=1)
      ->  Merge Left Join  (cost=118073.37..119429.73 rows=180000 width=219) (actual time=7527.963..9721.198 rows=500000 loops=1)
            Merge Cond: ((r.xx)::text = (q.xx)::text)
            ->  Sort  (cost=118020.71..118470.71 rows=180000 width=139) (actual time=7527.929..8299.778 rows=500000 loops=1)
                  Sort Key: r.xx
                  Sort Method:  external merge  Disk: 74440kB
                  ->  Hash Left Join  (cost=24008.83..77080.83 rows=180000 width=139) (actual time=991.936..3698.130 rows=500000 loops=1)
                        Hash Cond: ((r.xx)::text = (a.xx)::text)
                        Filter: (((r.xx)::text ~~ '%00%'::text) OR ((a.xx)::text ~~ '%00%'::text))
                        ->  Seq Scan on rr r  (cost=0.00..15639.00 rows=500000 width=139) (actual time=0.039..486.760 rows=500000 loops=1)
                        ->  Hash  (cost=14095.37..14095.37 rows=500037 width=35) (actual time=991.382..991.382 rows=500000 loops=1)
                              ->  Seq Scan on aa a  (cost=0.00..14095.37 rows=500037 width=35) (actual time=0.024..454.691 rows=500000 loops=1)
            ->  Sort  (cost=52.67..54.52 rows=740 width=80) (actual time=0.018..0.018 rows=0 loops=1)
                  Sort Key: q.xx
                  Sort Method:  quicksort  Memory: 17kB
                  ->  Seq Scan on qq q  (cost=0.00..17.40 rows=740 width=80) (actual time=0.003..0.003 rows=0 loops=1)
    Total runtime: 9960.185 ms
    Danke im Vorraus und Grüße

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von tzzdr Beitrag anzeigen
    Hallo,

    ich habe ein kleines Problem mit der Geschwindigkeit meiner abfrage. Es sind ca. 500000 Datensätze in der Tabelle.
    Könnte Ihr mir tipps geben was ich besser machen kann um die Performance zu erhöhen?

    SQL:
    Code:
    explain analyze
    
    SELECT       r.*, q.*, md5(r.xx)
    FROM         rr AS r
    
    LEFT JOIN    qq AS q
    ON           q.xx = r.xx
    
    LEFT JOIN    aa AS a
    ON         a.xx = r.xx
    
    WHERE        r.xx
    LIKE         '%00%'
    
    OR           a.aa
    LIKE         '%00%' 
    
    ORDER BY r.xx ASC OFFSET 499990 LIMIT 10;
    Code:
    Limit  (cost=119429.73..119429.73 rows=1 width=219) (actual time=9940.137..9940.178 rows=10 loops=1)
      ->  Merge Left Join  (cost=118073.37..119429.73 rows=180000 width=219) (actual time=7527.963..9721.198 rows=500000 loops=1)
            Merge Cond: ((r.xx)::text = (q.xx)::text)
            ->  Sort  (cost=118020.71..118470.71 rows=180000 width=139) (actual time=7527.929..8299.778 rows=500000 loops=1)
                  Sort Key: r.xx
                  Sort Method:  external merge  Disk: 74440kB
                  ->  Hash Left Join  (cost=24008.83..77080.83 rows=180000 width=139) (actual time=991.936..3698.130 rows=500000 loops=1)
                        Hash Cond: ((r.xx)::text = (a.xx)::text)
                        Filter: (((r.xx)::text ~~ '%00%'::text) OR ((a.xx)::text ~~ '%00%'::text))
                        ->  Seq Scan on rr r  (cost=0.00..15639.00 rows=500000 width=139) (actual time=0.039..486.760 rows=500000 loops=1)
                        ->  Hash  (cost=14095.37..14095.37 rows=500037 width=35) (actual time=991.382..991.382 rows=500000 loops=1)
                              ->  Seq Scan on aa a  (cost=0.00..14095.37 rows=500037 width=35) (actual time=0.024..454.691 rows=500000 loops=1)
            ->  Sort  (cost=52.67..54.52 rows=740 width=80) (actual time=0.018..0.018 rows=0 loops=1)
                  Sort Key: q.xx
                  Sort Method:  quicksort  Memory: 17kB
                  ->  Seq Scan on qq q  (cost=0.00..17.40 rows=740 width=80) (actual time=0.003..0.003 rows=0 loops=1)
    Total runtime: 9960.185 ms
    Danke im Vorraus und Grüße
    mal so aus dem Bau raus:
    - JOINs über text-felder sind bäää
    - LIKE '%...' kann keinen Index nutzen
    - Dein work_mem ist zu klein, aber ob du den wirklich auf ca. 100 MByte erhöhen willst/kannst weiß ich nicht

    Du solltest vielleicht überlegen, ob das wirklich so nötig ist, immerhin sind 2 mal 500000 Datensätzen zu holen, zu joinen, zu sortieren und 499990 davon dann zu entsorgen.


    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    tzzdr ist offline Neuer Benutzer
    Registriert seit
    07.10.2011
    Beiträge
    8

    Standard

    Hi,
    danke für deine antwort.
    Ja, aus der Tabelle "aa" muss ich nach datensätzen suchen, die Tabelle "qq" benötige ich.
    An der DB Struktur kann ich leider nichts ändern.
    Arbeitsspeicher habe ich 4 GB auf dem Server.

  4. #4
    tzzdr ist offline Neuer Benutzer
    Registriert seit
    07.10.2011
    Beiträge
    8

    Standard

    keiner noch eine idee ?

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 27.11.2008, 09:43
  2. Limit offset
    Von marc9022 im Forum Programmierung
    Antworten: 2
    Letzter Beitrag: 02.11.2008, 21:42
  3. Abfrage beim ersten Mal langsam, dann schnell
    Von slartibartfass im Forum SQL
    Antworten: 1
    Letzter Beitrag: 29.02.2008, 10:34
  4. limit/offset und indexe
    Von Stefan T im Forum SQL
    Antworten: 3
    Letzter Beitrag: 15.01.2008, 12:10
  5. Anzahl von Zeilen; LIMIT , OFFSET
    Von tr3bor im Forum SQL
    Antworten: 2
    Letzter Beitrag: 02.05.2007, 16:56

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum