2012-09-25 2 views
0

Si j'ai n requêtes q1, q2, q3 ... qn et chacune d'entre elles exécutant t1, t2, t3 ... tn comme temps de fonctionnement.Mysql Union temps V.S. requête séparée un par un

Aussi j'ai une autre requête q1 UNION ALL UNION q2 q3 ALL .... UNION ALL QN durée est tu

comparer et tu t1 + t2 + t3 + ... + tn, que l'on sera plus vite en théorie? Je sais que faire l'expérience est la meilleure façon de le découvrir, mais j'ai besoin d'entendre une voix spécialisée sur la théorie. Merci

+1

Cela ressemble à une question d'examen. –

+0

C'est un besoin pratique. Besoin de prendre en compte la stratégie de mise en œuvre –

+0

avez-vous essayé d'exécuter chaque version? ou comparer les plans d'exécution? – Taryn

Répondre

2

L'opérateur UNION requiert que les lignes dupliquées soient supprimées du jeu de résultats avant que toutes les lignes soient renvoyées. C'est effectivement une opération SORT UNIQUE. Ce qui est relativement peu coûteux pour petits jeux de résultats, mais pour des ensembles massifs, il peut être beaucoup de ressources sur l'heure du serveur (par exemple prendre beaucoup de temps.)

En théorie, en combinant les requêtes avec un opérateur UNION ALL plutôt qu'un opérateur UNION serait être le plus rapide, car il éliminerait ( n -1) les allers-retours à la base de données, par rapport aux requêtes en cours d'exécution séparément. Mais pour les grandes valeurs de n, vous allez rencontrer des limites pratiques sur la taille du texte SQL (taille maximale des paquets). Étant donné le choix entre l'opérateur UNION et les requêtes séparées, pour un ensemble de résultats volumineux, les requêtes séparées seront moins gourmandes en ressources côté serveur. En bref, c'est vraiment un compromis entre la lourde tâche de chaque requête, et la lourde levée d'une opération SORT UNIQUE.

2

Étant donné que UNION ALL avec n sous-requêtes pouvait être exécutée comme n sélections, un SGBD intelligent devrait pouvoir faire au plus le même travail que n sélections séparées.

Cela laisse le temps aller-retour, qui est n * rtt pour n requêtes et rtt pour le UNION ALL.

En théorie, un SGBD intelligent doit toujours répondre à un seul UNION ALL plus rapidement que n requêtes distinctes.
En pratique, comme d'habitude, tous les paris sont désactivés sans test.