2010-09-22 6 views
0

Je vais avoir des problèmes avec une requête SQL, voici une généralisation de ce que je suis en train de faire:MySQL sélectionner de sélectionner?

select 
oh.a as a, 
oh.b as b, 
oi.c as c, 
(select h.d from history h where h.id = oh.id and h.d not in ('d1', 'd2') order by h.date limit 1) as d 
from order_header oh 
join order_item oi on oh.order_id = oi.order_id 
where oh.state in (0, 10, 20) 

Mon problème est ce type de requête fonctionne très bien dans la version MySQL 5.0.77, mais il échoue dans MySQL version 5.1.47. Et par problème, je veux dire quand la requête fonctionne MySQL pince le processeur à 100% et il ne se termine jamais. Même en plaçant une explication devant la sélection, la requête ne retourne jamais.

Toute suggestion ou pointeur serait grandement appréciée!

Merci, Doug

+0

Depuis combien de temps l'utilisez vous? Quelque chose d'autre a changé en plus de votre version? Taille? Les données? –

Répondre

1

Voici comment j'écrire cette requête:

select 
oh.a as a, 
oh.b as b, 
oi.c as c, 
h1.d as d 
from order_header oh 
join order_item oi on oh.order_id = oi.order_id 
left outer join history h 
on h.id = oh.id and h.d not in ('d1', 'd2') 
left outer join history h2 
on h2.id = oh.id and h2.d not in ('d1', 'd2') 
and (h.date > h2.date or h.date = h2.date and h.id > h2.id) 
where oh.state in (0, 10, 20) and h2.id is null 
+0

Bill, merci pour les commentaires, je vais prendre votre suggestion et adapter ma requête réelle à elle et faire des tests avec elle. Merci encore! –

1

J'ai trouvé MySQL's profiling mode être tout aussi utile que EXPLIQUEZ. Vous pouvez l'activer avant d'exécuter votre requête, puis vider les timings pour chaque étape. C'est un moyen très pratique d'optimiser les sous-requêtes - vous remarquerez peut-être que votre sous-requête est en cours d'exécution pour chaque ligne d'une clause SELECT alors qu'elle pourrait s'exécuter une seule fois en tant que clause WHERE.

+0

Merci Jeff, c'est très pratique. La chose d'explication est bonne, mais elle vous donne seulement et "l'idée" combien de temps les choses prendront. Je vais essayer ça! –

Questions connexes