2012-04-05 11 views
1

Hier ist der Hintergrund, ich habe eine API-Methode, die eine normalisierte Liste von Namen an meinen Server sendet, die dann die Namen zu bestimmten Personen Objekte übereinstimmt. Jede Person hat viele Post-Objekte, die mit ihnen in Beziehung stehen und die ich zurückgeben möchte. Meine Datenbank-Abfrage sieht wie folgt aus:Schienen Optimierung komplizierter Abfrage

@articles = Article.joins(:artists).select("artists.*").where({:artists=>{:name=>keys}}).group("#{Article.col_list}").order("articles.publish_date DESC").limit(25) 

Diese Abfrage so lange wie 2 Sekunden auf meinem Produktions-Server erfolgen kann, wenn die Liste der Namen groß ist (über 100). Wie kann ich diese Abfrage so optimieren?

Hier ist das EXPLAIN für die Abfrage.

Limit (cost=9144.19..9144.20 rows=25 width=802) (actual time=4341.409..4341.431 rows=25 loops=1) 
    -> Sort (cost=9144.19..9150.74 rows=13096 width=802) (actual time=4341.408..4341.416 rows=25 loops=1) 
     Sort Key: articles.publish_date 
     Sort Method: top-N heapsort Memory: 47kB 
     -> HashAggregate (cost=9030.99..9070.28 rows=13096 width=802) (actual time=4255.854..4315.125 rows=3916 loops=1) 
       -> Nested Loop (cost=1581.27..8978.60 rows=13096 width=802) (actual time=7.443..3337.624 rows=39920 loops=1) 
        -> Hash Join (cost=1581.27..7650.04 rows=13096 width=4) (actual time=7.426..2627.426 rows=39920 loops=1) 
          Hash Cond: (articles_artists.artist_id = artists.id) 
          -> Seq Scan on articles_artists (cost=0.00..5476.38 rows=737461 width=8) (actual time=0.019..1310.806 rows=737515 loops=1) 
          -> Hash (cost=1579.83..1579.83 rows=413 width=4) (actual time=7.383..7.383 rows=300 loops=1) 
           Buckets: 1024 Batches: 1 Memory Usage: 8kB 
           -> Bitmap Heap Scan on artists (cost=477.60..1579.83 rows=413 width=4) (actual time=4.959..7.152 rows=300 loops=1) 
             Recheck Cond: ((name)::text = ANY ('{"A BOY NAMED EARTH","A ROCKET TO MOON","A SKYLIT DRIVE","A VISIBLE BOY","AARON GILLESPIE",AB,"ABBIE BARRETT",ABERFELDY,"ABRA NIIRE","ABSOLUTE ZERO",ACDC,"ADAM GREEN",ADELE,ADO,"ADRINA THORPE",ADVENTURE,AEROSMITH,"AESOP ROCK",AFI,AIR,"AIR TRAFFIC",AKON,"AL GREEN","ALANIS MORISSETTE",ALCENDOR,"ALEX CHILTON","ALEXI MURDOCH","ALIAS EHREN","ALICE RUSSELL","ALICIA KEYS","AMANDA PALMER","AMERICAN FOOTBALL","AMY MACDONALD","AMY WINEHOUSE","ANALOG REBELLION",ANBERLIN,"ANDREW BIRD","ANDREW HILL","ANGELS AIRWAVES",AQUEDUCT,"ARCADE FIRE","ARETHA FRANKLIN","ART BRUT","ART GARFUNKEL","ARTIC MONKEYS","ARTIC MONKEYS","AS TALL AS LIONS",ASHANTI,"ATLAS SOUND","ATTACK ATTACK!",AUTOLUX,"AVENUE D","AVRIL LAVIGNE","B JU",BACK2SQUARE1,"BAD ENGLISH",BALMORHEA,"BAND OF HORSES",BARCELONA,"BAXTER DURY","BEASTIE BOYS",BEATLES,BECK,"BELLE AND SEBASTIAN","BEN FOLDS FIVE","BEN MARTIN","BETTE MIDLER","BETTIE SERVEERT",BEYONCE,"BIFFY CLYRO","BILLY BRAGG","BILLY BRAGG AND BLOKES","BILLY JOEL","BILLY OCEAN",BIRDY,"BLACK EYED PEAS","BLACK KIDS",BLACKSTONE,"BLIND PILOT","BLINK 182","BLOC PARTY","BLOODHOUND GANG",BLUEBOY,BLUR,"BOB DYLAN","BOB MARLEY","BOB MARLEY WAILERS","BOMBAY BICYCLE CLUB","BON IVER","BONNIE TYLER",BONOBO,"BOX CAR RACER","BOYS LIKE GIRLS","BOYZ II MEN",BREAKBOT,"BRENDAN BENSON","BRETT ANDERSON",BRICOLAGE,"BRITNEY SPEARS",BRONCO,"BRUCE SPRINGSTEEN","BRUNO MARS",BUSH,"BUSTA RHYMES",BUSTED,CAESARS,"CAGE ELEPHANT",CAKE,CALLA,"CALVIN HARRIS",CAMRON,CAMRON,CAMP,CAMPING,"CANDIE PAYNE",CASHEW,"CASSANDRA WILSOM",CASSIDY,"CATE LE BON","CHARLIE FEATHERS","CHERRY GHOST",CHIC,CHICAGO,CHINGY,"CHRIS BROWN","CHRISTINA AGUILERA","CHRISTINA STURMER",CHUMBAWAMBA,CIRCLE,"CLARENCE CARTER",CLIPSE,"COBRA STARSHIP",COLDPLAY,COMMON,CONSPIRATORS,COOLIO,COPELAND,"COPY HAHO",CORNELIUS,CREED,CULTS,"CYNDI LAUPER","CYPRESS HILL","CAT EMPIRE",CURE,"DA LATA","DAFT PUNK",DALMINJO,DAMERO,"DARREN HANLON","DASHBOARD CONFESSIONAL",DATAROCK,"DAVID BOWIE","DAVID E SUGAR","DAVID GUETTA","DAVID KITT","DEATH CAB FOR CUTIE","DIANA KRALL",DIGITALISM,"DINOSAUR JR","DISCO INFERNO",DISCOVERY,"DIZZEE RASCAL",DMX,"DON BLACKMAN","DR DOG",DRAKE,DRUGSTORE,DIPLOMATS,DREAM,EAGLES,EDITORS,ELBOW,ELECTRELANE,"ELIZA DOOLITTLE","ELLE MILANO","ELLIE GOULDING","ELTON JOHN","ELVIS COSTELLO WITH BURT BACHARACH","ELVIS PRESLEY",EMBRACE,EMINEM,"EMMY GREAT","EMPIRE! EMPIRE!","ERIC CHURCH","ERIC CLAPTON","ERIN MCCARLEY",ERRORS,"EUGENE KELLY","EXPLOSIONS IN SKY",FABOLOUS,FAILURE,"FAITH EVANS","FAR EAST MOVEMENT",FAUNTS,FEIST,FELT,FIELDS,"FLEET FOXES","FLIGHT OF CONCHORDS","FLORENCE MACHINE",FOALS,"FOO FIGHTERS","FOSTER PEOPLE","FOUR TET","FRANK TURNER","FRANZ FEDINAND",FREE,"FLAMING LIPS",GORILLAZ,"GRATEFUL DEAD",IDLEWILD,"IMANI COPPOLA","IMOGEN HEAP",INCUBUS,INCUBUS,"IRON WINE","J DILLA","J COLE",JACK,"JACK JOHNSON",JACOBITES,"JAMES BLAKE","JAMES BLUNT","JAMES BONG","JAMES BROWN","JAMIE T","JAN DELAY","JANE CULLUM","JASON DERULO","JASON MORAN","JAY Z","JAY Z","JEFF WAYNE","JENNIFER LOPEZ","JENNY LEWIS",JEREMIH,"JIM JONES","JIMMY EAT WORLD","JOHN COLTRANE","JOHN LEGEND","JOHN MAYER","JOY DIVISION","JUELZ SANTANA","JUNIOR BOYS","JUSTIN TIMBERLAKE","KAISER CHEIFS",KANTE,"KANYE WEST",KARMA,"KATE NASH","KATE NASH","KATY PERRY",KESHA,KEANE,KEANE,"KELLY ROWLAND","KENNY G","KERI HILSON","KEVIN AYERS","KID CUDI","KID HARPOON","KID LOCO","KID ROCK","KINGS OF LEON",KILLERS,KOOKS,"LADY GAGA","LADY SOVEREIGN","LED ZEPPELIN","LEE DORSEY",LEMAR,LEMONGRASS,"LEROY HUTSON","LIL WAYNE","LILY ALLEN","LITTLE COMETS","LITTLE JOY","LL COOL J",LLOYD,"LLOYD BANKS","LONDON LOUNGE",LOST,LOVE,LUDACRIS,LUDIQUE,"LUPE FIASCO","LUTHER VANDROS","MACHINE HEAD","MACY GRAY",MADONNA,MAINO,"MANU CHAO","MAREN MONTAUK","MARIAH CAREY","MARK FRY","MARK MORRISON","MARK RONSON","MAROON 5","MARY J BLIGE","MASSIVE ATTACK","MAT KEARNEY","MATTHEW DEAR","MEAT LOAF",METALLICA,MGMT,"MICHAEL GIACCHINO","MICHAEL JACKSON","MILES DAVIS","MISSY ELLIOTT","MOBB DEEP","MODEST MOUSE","MODEST MOUSE",MONK,MOON,MORRISSEY,MOTZ,"MOVING HEARTS",MUSE,MUTEMATH,"MY WRITES","MORNING OF",NAS,"NE YO","NICKI MINAJ","NINE INCH NAILS","P DIDDY","PATRICK WATSON","PAUL MCCARTNEY","PEARL JAM","PEPE ALGILAR","PEPE WHITE","PETER GABRIEL",PHARRELL,"PHIL COLLINS",PHISH,PITBULL,PIXIES,POLICE,PRINCE,"R KELLY",RADIOHEAD,RAKIM,RANK,"RASCAL FLATTS","RAY CHARLES","RED HOT CHILI PEPPERS",REDNEX,REENO,"RELIENT K","RICK ROSS","RICKY NELSON",RIFT,RIHANNA,"ROBBIE WILLIAMS","ROD STEWART","RODNEY HUNTER",ROKOKO,"ROLLING STONES","ROSCOE DASH","ROY DAVIS JR","RYAN LESLIE","RYAN LESLIE",RZA,"SARAH MCLACHLAN","SARAH RUSSELL",SEAL,"SHANIA TWAIN",SHERWOOD,"SMASH MOUTH",SMITHS,"SNOOP DOGG","SOMETHING CORPORATE",SPOON,SPOON,"ST LUNATICS",STARS,"STAT QUO","STEELY DAN","STEVIE WONDER","STYLES P","SUNSET RUBDOWN",SUPERCHUNK,"SWIZZ BEATZ","SECRET HANDSHAKE",SMITHS,"T PAIN",TI,"TALIB KWELI","TAYLOR SWIFT","THROWING MUSES",TLC,"TOM JONES","TOM PETTY","TONY YAYO",TOOL,"TORI AMOS",TORTOISE,TRAIN,"TREY SONGZ","TRIBE CALLED QUEST",TUBBS,TYCHO,"WHITE STRIPES","WAKA FLOCKA FLAME",WALE,WILCO,"WILL SMITH",U2,USHER,"YEAH YEAH YEAHS","YEAR OF RABBIT","YOUNG BUCK","YOUNG JEEZY","ZAC BROWN BAND",2PAC,"50 CENT"}'::text[])) 
             -> Bitmap Index Scan on index_artists_on_name (cost=0.00..477.58 rows=413 width=0) (actual time=4.897..4.897 rows=311 loops=1) 
              Index Cond: ((name)::text = ANY ('{"A BOY NAMED EARTH","A ROCKET TO MOON","A SKYLIT DRIVE","A VISIBLE BOY","AARON GILLESPIE",AB,"ABBIE BARRETT",ABERFELDY,"ABRA NIIRE","ABSOLUTE ZERO",ACDC,"ADAM GREEN",ADELE,ADO,"ADRINA THORPE",ADVENTURE,AEROSMITH,"AESOP ROCK",AFI,AIR,"AIR TRAFFIC",AKON,"AL GREEN","ALANIS MORISSETTE",ALCENDOR,"ALEX CHILTON","ALEXI MURDOCH","ALIAS EHREN","ALICE RUSSELL","ALICIA KEYS","AMANDA PALMER","AMERICAN FOOTBALL","AMY MACDONALD","AMY WINEHOUSE","ANALOG REBELLION",ANBERLIN,"ANDREW BIRD","ANDREW HILL","ANGELS AIRWAVES",AQUEDUCT,"ARCADE FIRE","ARETHA FRANKLIN","ART BRUT","ART GARFUNKEL","ARTIC MONKEYS","ARTIC MONKEYS","AS TALL AS LIONS",ASHANTI,"ATLAS SOUND","ATTACK ATTACK!",AUTOLUX,"AVENUE D","AVRIL LAVIGNE","B JU",BACK2SQUARE1,"BAD ENGLISH",BALMORHEA,"BAND OF HORSES",BARCELONA,"BAXTER DURY","BEASTIE BOYS",BEATLES,BECK,"BELLE AND SEBASTIAN","BEN FOLDS FIVE","BEN MARTIN","BETTE MIDLER","BETTIE SERVEERT",BEYONCE,"BIFFY CLYRO","BILLY BRAGG","BILLY BRAGG AND BLOKES","BILLY JOEL","BILLY OCEAN",BIRDY,"BLACK EYED PEAS","BLACK KIDS",BLACKSTONE,"BLIND PILOT","BLINK 182","BLOC PARTY","BLOODHOUND GANG",BLUEBOY,BLUR,"BOB DYLAN","BOB MARLEY","BOB MARLEY WAILERS","BOMBAY BICYCLE CLUB","BON IVER","BONNIE TYLER",BONOBO,"BOX CAR RACER","BOYS LIKE GIRLS","BOYZ II MEN",BREAKBOT,"BRENDAN BENSON","BRETT ANDERSON",BRICOLAGE,"BRITNEY SPEARS",BRONCO,"BRUCE SPRINGSTEEN","BRUNO MARS",BUSH,"BUSTA RHYMES",BUSTED,CAESARS,"CAGE ELEPHANT",CAKE,CALLA,"CALVIN HARRIS",CAMRON,CAMRON,CAMP,CAMPING,"CANDIE PAYNE",CASHEW,"CASSANDRA WILSOM",CASSIDY,"CATE LE BON","CHARLIE FEATHERS","CHERRY GHOST",CHIC,CHICAGO,CHINGY,"CHRIS BROWN","CHRISTINA AGUILERA","CHRISTINA STURMER",CHUMBAWAMBA,CIRCLE,"CLARENCE CARTER",CLIPSE,"COBRA STARSHIP",COLDPLAY,COMMON,CONSPIRATORS,COOLIO,COPELAND,"COPY HAHO",CORNELIUS,CREED,CULTS,"CYNDI LAUPER","CYPRESS HILL","CAT EMPIRE",CURE,"DA LATA","DAFT PUNK",DALMINJO,DAMERO,"DARREN HANLON","DASHBOARD CONFESSIONAL",DATAROCK,"DAVID BOWIE","DAVID E SUGAR","DAVID GUETTA","DAVID KITT","DEATH CAB FOR CUTIE","DIANA KRALL",DIGITALISM,"DINOSAUR JR","DISCO INFERNO",DISCOVERY,"DIZZEE RASCAL",DMX,"DON BLACKMAN","DR DOG",DRAKE,DRUGSTORE,DIPLOMATS,DREAM,EAGLES,EDITORS,ELBOW,ELECTRELANE,"ELIZA DOOLITTLE","ELLE MILANO","ELLIE GOULDING","ELTON JOHN","ELVIS COSTELLO WITH BURT BACHARACH","ELVIS PRESLEY",EMBRACE,EMINEM,"EMMY GREAT","EMPIRE! EMPIRE!","ERIC CHURCH","ERIC CLAPTON","ERIN MCCARLEY",ERRORS,"EUGENE KELLY","EXPLOSIONS IN SKY",FABOLOUS,FAILURE,"FAITH EVANS","FAR EAST MOVEMENT",FAUNTS,FEIST,FELT,FIELDS,"FLEET FOXES","FLIGHT OF CONCHORDS","FLORENCE MACHINE",FOALS,"FOO FIGHTERS","FOSTER PEOPLE","FOUR TET","FRANK TURNER","FRANZ FEDINAND",FREE,"FLAMING LIPS",GORILLAZ,"GRATEFUL DEAD",IDLEWILD,"IMANI COPPOLA","IMOGEN HEAP",INCUBUS,INCUBUS,"IRON WINE","J DILLA","J COLE",JACK,"JACK JOHNSON",JACOBITES,"JAMES BLAKE","JAMES BLUNT","JAMES BONG","JAMES BROWN","JAMIE T","JAN DELAY","JANE CULLUM","JASON DERULO","JASON MORAN","JAY Z","JAY Z","JEFF WAYNE","JENNIFER LOPEZ","JENNY LEWIS",JEREMIH,"JIM JONES","JIMMY EAT WORLD","JOHN COLTRANE","JOHN LEGEND","JOHN MAYER","JOY DIVISION","JUELZ SANTANA","JUNIOR BOYS","JUSTIN TIMBERLAKE","KAISER CHEIFS",KANTE,"KANYE WEST",KARMA,"KATE NASH","KATE NASH","KATY PERRY",KESHA,KEANE,KEANE,"KELLY ROWLAND","KENNY G","KERI HILSON","KEVIN AYERS","KID CUDI","KID HARPOON","KID LOCO","KID ROCK","KINGS OF LEON",KILLERS,KOOKS,"LADY GAGA","LADY SOVEREIGN","LED ZEPPELIN","LEE DORSEY",LEMAR,LEMONGRASS,"LEROY HUTSON","LIL WAYNE","LILY ALLEN","LITTLE COMETS","LITTLE JOY","LL COOL J",LLOYD,"LLOYD BANKS","LONDON LOUNGE",LOST,LOVE,LUDACRIS,LUDIQUE,"LUPE FIASCO","LUTHER VANDROS","MACHINE HEAD","MACY GRAY",MADONNA,MAINO,"MANU CHAO","MAREN MONTAUK","MARIAH CAREY","MARK FRY","MARK MORRISON","MARK RONSON","MAROON 5","MARY J BLIGE","MASSIVE ATTACK","MAT KEARNEY","MATTHEW DEAR","MEAT LOAF",METALLICA,MGMT,"MICHAEL GIACCHINO","MICHAEL JACKSON","MILES DAVIS","MISSY ELLIOTT","MOBB DEEP","MODEST MOUSE","MODEST MOUSE",MONK,MOON,MORRISSEY,MOTZ,"MOVING HEARTS",MUSE,MUTEMATH,"MY WRITES","MORNING OF",NAS,"NE YO","NICKI MINAJ","NINE INCH NAILS","P DIDDY","PATRICK WATSON","PAUL MCCARTNEY","PEARL JAM","PEPE ALGILAR","PEPE WHITE","PETER GABRIEL",PHARRELL,"PHIL COLLINS",PHISH,PITBULL,PIXIES,POLICE,PRINCE,"R KELLY",RADIOHEAD,RAKIM,RANK,"RASCAL FLATTS","RAY CHARLES","RED HOT CHILI PEPPERS",REDNEX,REENO,"RELIENT K","RICK ROSS","RICKY NELSON",RIFT,RIHANNA,"ROBBIE WILLIAMS","ROD STEWART","RODNEY HUNTER",ROKOKO,"ROLLING STONES","ROSCOE DASH","ROY DAVIS JR","RYAN LESLIE","RYAN LESLIE",RZA,"SARAH MCLACHLAN","SARAH RUSSELL",SEAL,"SHANIA TWAIN",SHERWOOD,"SMASH MOUTH",SMITHS,"SNOOP DOGG","SOMETHING CORPORATE",SPOON,SPOON,"ST LUNATICS",STARS,"STAT QUO","STEELY DAN","STEVIE WONDER","STYLES P","SUNSET RUBDOWN",SUPERCHUNK,"SWIZZ BEATZ","SECRET HANDSHAKE",SMITHS,"T PAIN",TI,"TALIB KWELI","TAYLOR SWIFT","THROWING MUSES",TLC,"TOM JONES","TOM PETTY","TONY YAYO",TOOL,"TORI AMOS",TORTOISE,TRAIN,"TREY SONGZ","TRIBE CALLED QUEST",TUBBS,TYCHO,"WHITE STRIPES","WAKA FLOCKA FLAME",WALE,WILCO,"WILL SMITH",U2,USHER,"YEAH YEAH YEAHS","YEAR OF RABBIT","YOUNG BUCK","YOUNG JEEZY","ZAC BROWN BAND",2PAC,"50 CENT"}'::text[])) 
        -> Index Scan using articles_pkey on articles (cost=0.00..0.10 rows=1 width=802) (actual time=0.006..0.006 rows=1 loops=39920) 
          Index Cond: (articles.id = articles_artists.article_id) 
Total runtime: 4343.603 ms 
(18 rows) 
+2

Dies ist wirklich eine DB-Optimierungsfrage. Sehen Sie sich Ihre Protokolldatei an, um die tatsächliche SQL-Abfrage zu finden, und führen Sie sie durch "EXPLAIN" aus. Wenn Sie nicht in die richtige Richtung weisen, fügen Sie diese Information zur Frage hinzu. Möglicherweise fehlt ein Index für den Join. – Thilo

+0

Bitte schreiben Sie die tatsächliche SQL, die von AR für diese Abfrage ausgegeben wird. Haben Sie einen Index für articles_artists (artist_id)? – dbenhur

Antwort

0

Sieht aus, als ob Sie die neuesten 25 Artikel unabhängig davon greifen werden. Also würde ich eine Unterabfrage verwenden, die diese 25 neuesten Artikel auswählt und das Ergebnis mit der Künstler-Tabelle verbindet.

Warum sollte das besser sein? Weil Ihre Abfrage ein temporäres Ergebnis erstellt, das JEDEN Künstler mit allen Artikeln verbindet, bevor Sie das Ergebnis bestellen und die letzten 25 nehmen.

Nein ... Ich liege falsch. Ich sehe, wo die Bedingung für Künstler beim Namen steht, was bedeutet, dass meine Lösung nicht funktionieren wird.

Also ich bin zurückgekommen, um zu sehen, ob ich helfen kann. Der Künstlername "Filter" kostet Sie am meisten, wenn Sie die Kosten in den von Ihnen geposteten Erklärungsdaten betrachten. Beachten Sie auch, dass die Künstlernamen alle dort erscheinen, ZWEIMAL impliziert, dass Sie für diese Operation mehr als einmal bezahlen, innerhalb von verschachtelten Schleifen.

Also, wenn Sie können, bauen Sie eine temporäre Tabelle, die die Künstler-Tabelle durch Ihren Filter ist. Verwenden Sie dann diese Tabelle, um die Artikelsuche wie oben beschrieben durchzuführen, und Ihre Abfragen werden viel schneller sein.

+0

Der Künstlername-Filter dauert etwa 7ms. Die großen Kosten liegen im Seq-Scan der Join-Tabelle articles_artists und des Hash-Joins mit den im Artist-Filter gefundenen Künstlern. Siehe http://explain.depesz.com/s/Az9x für eine schönere Sicht auf den Plan mit Hervorhebung der teuren Schritte. – dbenhur

+0

OP muss die Abfrage SQL veröffentlichen, damit wir mit Methoden experimentieren können, um diesen Plan zu verbessern. – dbenhur

1

Dieses zeichnet sich durch:

-> Seq Scan auf articles_artists (cost = 0.00..5476.38 rows = 737.461 width = 8) (tatsächliche Zeit = 0.019..1310.806 rows = 737.515 Schleifen = 1)

Wenn Sie eine EXPLAIN auf eine Abfrage ausführen und den Begriff "Seq Scan" irgendwo sehen, ist es ein Zeichen, dass Sie überprüfen müssen, ob Sie die richtigen Indizes haben. Überprüfen Sie articles_artists und stellen Sie sicher, dass Sie Indizes für beide haben article_id und artist_id, vorausgesetzt, dass Sie so benannt haben.

Führen Sie auch eine VACUUM ANALYZE auf Ihrer Datenbank und sehen Sie, ob das Dinge beschleunigt. Der Abfrageoptimierer von Postgresql hängt von den Werten ab, die von VACUUM ANALYZE erzeugt werden. Wenn sich die Tabelle erheblich geändert hat, ohne dass sie ausgeführt wurde, kann die Abfrageleistung darunter leiden.

Schließlich, ziehen Sie in Betracht, diese Abfrage zu brechen und Ruby zu erhalten, um die Daten zu sammeln. Manchmal ist es besser, wenn Sie nicht versuchen, die Datenbank so intelligent zu gestalten, dass eine komplexe Abfrage ordnungsgemäß ausgeführt und stattdessen manuell auf dem Client optimiert wird.

+0

Beachten Sie jedoch, dass der nachfolgende Hash-Join 40 KB dieser 730.000 Zeilen erhält. Bei einer Selektivität von 12% ist es durchaus möglich, dass das sequentielle IO eines Seq-Scans die zufällige Suche eines Index-Scans übertrifft. – dbenhur

+0

Ja, das stimmt. Ich wollte nicht so weit in meiner Antwort gehen :) Das ist falsch, ich sagte "es ist ein Zeichen" und "es bedeutet", dass mehr Indexierung benötigt wird. –

0

Ich sehe zwei Probleme. Der erste ist der Seq-Scan, den Michele oben erwähnt hat. Die zweite ist die Nested Loop Join, wahrscheinlich aufgrund zu vieler Datensätze an diesem Punkt.

Ich würde schauen, was Sie weiter unten in der Abfrage in Bezug auf Suchkriterien drücken können, so dass so wenige Elemente wie möglich ausgewählt werden.

Meine Vermutung ist, dass Indizes keinen großen Unterschied machen werden, aber zusätzliche Suchkriterien, besonders wenn diese einen Index treffen können.