2010-12-03 4 views
3

Cette requête est très très lente et je ne suis pas sûr de l'endroit où je vais me tromper.Requête SQL lente lors de la jonction de tables

Je suppose que c'est quelque chose à voir avec la table flight_prices
parce que si je supprime cette jointure, elle passe de 16 secondes à moins d'une.

SELECT * FROM OPENQUERY(mybook, 
    'SELECT wb.booking_ref 
    FROM web_bookings wb 
      LEFT JOIN prod_info pi ON wb.location = pi.location 
      LEFT JOIN flight_prices fp ON fp.dest_date = pi.dest_airport + '' '' + wb.sort_date 
    WHERE fp.dest_cheapest = ''Y'' 
      AND wb.inc_flights = ''Y'' 
      AND wb.customer = ''12345'' ') 

Des idées comment je peux accélérer cette jointure ??

Répondre

4

Il est peu probable que vous ayez une indexation sur flight_prices.dest_date à utiliser car vous ne vous joignez pas à une autre colonne, ce qui complique la tâche de l'optimiseur.

Si vous pouviez modifier le schéma, je ferais en sorte que flight_prices.dest_date soit scindé en deux colonnes dest_airport et dest_Date car il semble s'agir actuellement d'un composite d'aéroport et de date. Si vous faisiez cela, vous pourriez alors rejoindre comme ceci

fp.dest_date = wb.sort_date and fp.dest_airport = pi.dest_airport 
+0

Cela accélère les choses, mais cela reste 6 secondes pour ce qui devrait être une requête assez simple. – Tom

+0

Toutes ces colonnes sont-elles indexées? S'ils sont indexés, pouvez-vous regarder le plan? Je suis d'accord que ça devrait être plus rapide. – JamieDainton

2

Essayez EXPLAIN PLAN et voyez à quoi ressemble votre base de données.

Si vous voyez TABLE SCAN, vous devrez peut-être ajouter des index.

Cette deuxième JOIN semble plutôt étrange pour moi. Je me demande si cela pourrait être réécrit.

+0

Je vois le balayage à distance - 100%, cela signifie-t-il quelque chose pour n'importe qui? – Tom

+0

Votre table entière est en cours de numérisation et les index ne sont pas utilisés – JamieDainton

3

Votre déclaration reformaté me donne ce

SELECT wb.booking_ref 
FROM web_bookings wb 
     LEFT JOIN prod_info pi ON wb.location = pi.location 
     LEFT JOIN flight_prices fp ON fp.dest_date = pi.dest_airport + ' ' + wb.sort_date 
WHERE fp.dest_cheapest = 'Y' 
     AND wb.inc_flights = 'Y' 
     AND wb.customer = '12345' 

Je veillerais que les champs suivants ont des indices

  • dest_cheapest
  • dest_date
  • location
  • client
  • , inc_flights, booking_ref (index de couverture)
Questions connexes