Je me suis fait un peu un imbécile de moi plus tôt aujourd'hui sur Cette question . La question utilisait SQL Server et la réponse correcte impliquait l'ajout d'une clause code> code>. L'erreur initiale que j'ai faite était de penser qu'un alias de l'instruction code> de sélectionner code> pourrait être utilisé dans la clause code> code>, qui n'est pas autorisée dans SQL Server. J'ai fait cette erreur parce que j'ai supposé que SQL Server avait les mêmes règles que MySQL, qui permettent à un alias d'être utilisé dans le Cela m'a eu curieux, et j'ai goûté sur Dépassement de pile et ailleurs, trouver un tas de matériau expliquant pourquoi ces les règles em> sont appliquées sur les deux RDBR respectifs. Mais nulle part j'ai trouvé une explication de ce que les performance em> les implications permettraient de permettre / interdire un alias dans la clause donner un béton Exemple, je vais dupliquer la requête qui s'est produite dans la question mentionnée ci-dessus: p> quelles seraient les conséquences de la performance de l'utilisation d'un alias dans le Ceci est une rare instance où il pourrait être correct de baliser une question SQL avec MySQL et SQL Server, alors profitez-en ce moment au soleil. P> P> ayant code> clause.
code>. P>
ayant code > Clause au lieu de la spécification du nombre
code>? Cette question peut répondre directement à MySQL, et j'espère que quelqu'un pourrait donner un aperçu de ce qui se passerait dans SQL si elle devait prendre en charge l'alias dans le
ayant code> clause. P>
3 Réponses :
Ceci est trop long pour un commentaire. P>
Je ne pense pas qu'il n'y ait vraiment aucune implication de performance, à moins que l'expression dans la clause code> code> contienne un traitement compliqué (dire, Je suis presque certain que MySQL effectuera la fonction d'agrégation deux fois si elle est mentionnée deux fois dans la requête. Je ne sais pas si SQL Server optimisera la deuxième référence, mais je devinerai non (SQL Server a un bon optimiseur, mais ce n'est pas une si bonne élimination d'expression commune). P>
La question est alors la complexité de l'expression. Des expressions simples telles que Si vous avez une expression complexe dans SQL Server, vous devriez être en mesure de garantir qu'il est évalué une fois en utilisant une sous-requête. P> comptage (distinct) code> ou une fonction complexe ou une fonction complexe. , tels que le traitement des chaînes sur une longue chaîne). P>
comptent () code> et
somme () code> vraiment n'encurent pas beaucoup de frais supplémentaires - une fois que l'agrégation est déjà fait. Les expressions complexes pourraient commencer à coûter cher. P>
Donc, il serait donc prudent de dire qu'il est généralement préférable dans MySQL de utiliser i> un alias dans la clause code>, supposant qu'il soit possible de le faire?
J'essaie d'évaluer si les frais généraux du calcul d'un alias se reproduisent à nouveau à réévaluer l'expression dans la clause code>. En d'autres termes, j'espérais que vous pouviez nous faire savoir quelle devrait être la meilleure pratique en ce qui concerne la clause
code>.
@Timbiegeleisen. . . Oui je suis d'accord. Je suis à peu près sûr que le but de permettre à l'alias dans la clause code> est partiellement basé sur le fait que MySQL matérialise sous-requêtes. Ainsi, une sous-requête n'est pas un bon moyen de définir un calcul complexe (telle que la distance) lorsque vous souhaitez l'utiliser pour filtrer.
J'attendais que le SQL se déroule dans l'ordre de Je ne suis pas un expert mysql, mais j'ai trouvé cette raison sortie dans le Documentation MySQL sur la raison pour laquelle il est légal. p>
MySQL étend l'utilisation standard SQL du groupe par de manière à ce que la liste de sélection puisse se référer à des colonnes non protégées non nommées dans le groupe par clause. Cela signifie que la requête précédente est légale dans MySQL. sur l'impact sur la performance, je suppose que, l'aliasement ayant diminué plus lentement que l'indemnité que le filtre doit être appliqué après toute l'exécution. J'attendrai que les experts commenteront. p> à partir de code>,
où code>,
groupe par code>,
ayant code> ,
sélectionnez code>,
commander par code> p>
étroitement axé sur cette requête particulière et avec des données d'échantillonnage chargées ci-dessous. Cela traite d'autres requêtes telles que le nombre l'alias Ceci utilise Une table préexistante avec environ 5 millions de lignes en elle a créé rapidement via cette Répondre de la mine qui prend 3 à 5 minutes. p> Structure résultante: p> mais utiliser innodb à la place. Crée à l'anomalie InnoDB Gap attendue en raison des insertions de réservation de gamme. Je viens de dire, mais ne fait aucune différence. 4,7 millions de lignes. P> Modifiez la table pour obtenir près du schéma supposé de Tim. P> Ce qui suit prendra un certain temps. Lancez-le à nouveau et encore dans des morceaux ou bien votre connexion peut trop faire du délai d'attente. Le délai d'attente est due à 5 millions de lignes sans clause limite dans la déclaration de mise à jour. Remarque, nous do em> ont une clause limite. P> Nous le faisons donc dans un demi-million d'itérations. Définit une colonne sur un
nombre aléatoire compris entre 1 et 20 p> continuez à exécuter ce qui précède jusqu'à ce que non Je l'ai couru comme 10 fois (le tout prend 7 à 10 minutes) p> créer un index utile (après les insertions bien sûr). p> (distinct ...) code> mentionné par d'autres.
dans l'atteinte code> apparaît légèrement surperformer ou assez un peu surperformer son alternative (selon la requête). strong> p>
Camid code> est null. p>
+----+-------------+----------+-------+---------------+------------+---------+----------------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+------------+---------+----------------------+--------+----------------------------------------------+
| 1 | SIMPLE | campus | index | PRIMARY | PRIMARY | 4 | NULL | 20 | Using index; Using temporary; Using filesort |
| 1 | SIMPLE | students | ref | ix_stu_cam | ix_stu_cam | 5 | bigtest.campus.camID | 123766 | Using index |
+----+-------------+----------+-------+---------------+------------+---------+----------------------+--------+----------------------------------------------+
Je me fais un imbécile de moi tout le temps.
Dupliqué possible de Paramétrage d'une SQL en clause