2009-08-17 4 views
1

J'ai une requête pour obtenir des données en double avec des conditions supplémentaires, mais je pense que ce n'est pas assez rapide. Toute solution pour rendre cette requête plus rapide?Un moyen plus rapide de trouver une requête SQL en double

v_listing contient grand informations

SELECT DISTINCT code, name, comm, address, area 
FROM v_listing t1 
WHERE EXISTS (SELECT NULL 
       FROM v_listing t2 
       WHERE t1.comm = t2.comm 
       AND t1.address = t2.address 
       AND t1.area = t2.area 
       AND (t1.code > t2.code OR t1.code < t2.code)) 
ORDER BY comm, address, area 
+0

Quelle est la définition de la vue, s'il vous plaît? Une vue est juste une macro et elle se développe dans les requêtes. – gbn

+0

v_listing est la combinaison de plusieurs tables, mais ce que je veux savoir si nous pouvons améliorer ce sql sans toucher la vue. – pang

+0

Quelle est la lenteur de votre requête? Sur quelle quantité de données l'avez-vous exécuté? – Jagannath

Répondre

0

Eh bien celui-ci seul changement devrait aider beaucoup:

SELECT DISTINCT code, name, comm, address, area 
FROM v_listing t1 
WHERE EXISTS (SELECT NULL 
     FROM v_listing t2 
      WHERE t1.comm = t2.comm 
      AND t1.address = t2.address 
      AND t1.area = t2.area 
      AND t1.code <> t2.code) 
ORDER BY comm, address, area 

Sinon, vous pouvez le faire comme ceci:

SELECT comm, address, area, MIN(code), MAX(code), MIN(name), COUNT(*) 
FROM v_listing t1 
GROUP BY comm, address, area 
HAVING COUNT(*) > 2 
ORDER BY comm, address, area 
+2

Je déconseille la deuxième façon. 'min (code)' et 'min (nom)' ne vont probablement pas toujours ensemble sur la même ligne. – Eric

+0

Je n'ai jamais laissé entendre qu'ils étaient, la question initiale était quelque peu non spécifique sur ses exigences. – RBarryYoung

3

Un exists clause fait une semi-jointure, ce qui n'est pas la façon la plus optimale de comparer deux très grandes tables. Dans ce cas, c'est une table, mais le point reste. Qu'est-ce que vous voulez faire est un inner join:

SELECT DISTINCT 
    t1.code, 
    t1.name, 
    t1.comm, 
    t1.address, 
    t1.area 
FROM 
    v_listing t1 
    inner join v_listing t2 on 
     t1.comm = t2.comm 
     AND t1.address = t2.address 
     AND t1.area = t2.area 
     AND t1.code <> t2.code 
ORDER BY t1.comm, t1.address, t1.area 

Assurez-vous également que vous avez des index sur toutes les colonnes de jointure. Cela accélérera énormément les choses également.

Questions connexes