2009-09-07 4 views
3

Tenir compte de la requête suivante:MySQL expliquer anomalie

select FEE_NUMBER 
from CARRIER_FEE CF 
left outer join CONTYPE_FEE_LIST cfl on CF.CAR_FEE_ID=cfl.CAR_FEE_ID and cfl.CONT_TYPE_ID=3 
where CF.SEQ_NO = (
    select max(CF2.SEQ_NO) from CARRIER_FEE CF2 
    where CF2.FEE_NUMBER=CF.FEE_NUMBER 
    and CF2.COMPANY_ID=CF.COMPANY_ID 
    group by CF2.FEE_NUMBER) 
group by CF.CAR_FEE_ID 

Sur mon portable ce renvoie aucun résultat. En utilisant exactement la même base de données (sauvegardée) sur mes serveurs, elle renvoie des résultats.

Si je lance un Explain lui donne cette (notez la différence dans la colonne ref) mon portable je reçois ce

| id | select_type  | table | type | possible_keys        | key     | key_len | ref     | rows | Extra          | 
+----+--------------------+-------+-------+---------------------------------------------+-----------------------+---------+------------------------+------+----------------------------------------------+ 
| 1 | PRIMARY   | CF | index | NULL          | PRIMARY    | 8  | NULL     | 132 | Using where         | 
| 1 | PRIMARY   | cfl | ref | FK_CONTYPE_FEE_LIST_1,FK_CONTYPE_FEE_LIST_2 | FK_CONTYPE_FEE_LIST_1 | 8  | odysseyB.CF.CAR_FEE_ID | 6 |            | 
| 2 | DEPENDENT SUBQUERY | CF2 | ref | FK_SURCHARGE_1        | FK_SURCHARGE_1  | 8  | func     | 66 | Using where; Using temporary; Using filesort | 

considérant que tous mes autres serveurs

| id | select_type  | table | type | possible_keys        | key     | key_len | ref     | rows | Extra          | 
+----+--------------------+-------+-------+---------------------------------------------+-----------------------+---------+------------------------+------+----------------------------------------------+ 
| 1 | PRIMARY   | CF | index | NULL          | PRIMARY    | 8  | NULL     | 132 | Using where         | 
| 1 | PRIMARY   | cfl | ref | FK_CONTYPE_FEE_LIST_1,FK_CONTYPE_FEE_LIST_2 | FK_CONTYPE_FEE_LIST_1 | 8  | odysseyB.CF.CAR_FEE_ID | 6 |            | 
| 2 | DEPENDENT SUBQUERY | CF2 | ref | FK_SURCHARGE_1        | FK_SURCHARGE_1  | 8  | odysseyB.CF.COMPANY_ID | 66 | Using where; Using temporary; Using filesort | 

Si je supprimer soit la jointure, soit la sous-requête, soit le dernier groupe, puis j'obtiens les résultats attendus.

Je suppose que c'est un problème de configuration, mais ce n'est pas celui que j'ai vu auparavant. Est-ce que quelqu'un sait ce qui pourrait causer cela?

Mon ordinateur portable exécute OSX 10.6 avec MySQL 5.0.41. Un autre ordinateur portable fonctionnant sous OSX 10.5.7 et MySQL 5.0.37 fonctionne bien, tout comme les serveurs Linux exécutant MySQL 5.0.27.

Quelqu'un peut-il expliquer la différence entre un plan d'explication utilisant ref = func et l'autre utilisant ref = odysseyB.CF.COMPANY_ID?

Merci.

+0

wow! même jeu de données? des résultats différents? c'est un problème assez sérieux ... –

+0

yep. Même jeu de données. Des résultats différents Pas bon. – Damo

+1

Êtes-vous sûr que c'est le même jeu de données? les lignes de votre explication sont légèrement différentes.201 vs 202 16 vs 18 100 vs 101 – Rufinus

Répondre

0

Je ne sais pas pourquoi ça donne des résultats différents. Vous n'avez pas avoir exactement le même vidage de données, car les nombres de lignes signalés dans vos rapports EXPLAIN sont différents. Je vous recommande de faire des requêtes plus simples pour tester vos hypothèses.

Vérifiez également que vous exécutez réellement la même requête SQL sur les deux serveurs. Par exemple, si vous avez par inadvertance changé votre jointure externe gauche en une jointure interne, cela pourrait rendre la requête entière sans résultat.

BTW, tangentielle à votre question, mais je résous ces « plus ligne par groupe » types de requêtes avec une jointure externe:

select FEE_NUMBER 
from CARRIER_FEE CF 
left outer join CARRIER_FEE CF2 
    on CF.FEE_NUMBER = CF2.FEE_NUMBER and CF.COMPANY_ID = CF.COMPANY_ID 
    and CF.SEQ_NO < cf2.SEQ_NO 
left outer join CONTYPE_FEE_LIST cfl 
    on CF.CAR_FEE_ID=cfl.CAR_FEE_ID and cfl.CONT_TYPE_ID=3 
where CF2.SEQ_NO IS NULL 
group by CF.CAR_FEE_ID; 

Ce type de solution est souvent plus rapide que la solution de sous-requête corrélative vous » re en cours d'utilisation. Je ne pense pas que cela pourrait changer le résultat de la requête, je ne fais que l'offrir en option.

+0

Merci. C'est certainement une option. J'ai mis à jour les plans d'explication. Ils utilisent exactement le même jeu de données. – Damo

1

Sur les deux machines:

mysql> SHOW CREATE TABLE CARRIER_FEE CF; 

Assurez-vous que les deux types de moteur de table sont les mêmes.

De plus, puisque vous utilisez OS X 10.6 sur la machine ayant l'erreur? Peut-être que les types de données sur cet OS ont des qualités différentes de 10.5.x.

On dirait que les gens ont des problèmes de compatibilité avec le léopard des neiges. Essayez d'installer MySQL 5.4 sur votre ordinateur portable 10.6.

http://forums.mysql.com/read.php?10,278942,278942#msg-278942

Questions connexes