10
votes

Qui est la fonction d'agrégat la moins coûteuse en l'absence de tout ()

J'utilise habituellement max () ou min () d'un DBMS n'a aucune fonction () d'agrégat.

Y a-t-il quelque chose de moins cher dans MySQL et MS-SQL?


9 commentaires

Pourquoi n'existe-t-il aucune fonction totale () d'agrégat?


Pourquoi une fonction d'agrégation () existerait-elle? Quelle serait sa spécification?


Que voulez-vous dire avec tout () ? Il devrait renvoyer une ligne aléatoire?


Tout (expression) : renvoie toute valeur de l'expression dans le groupe. Afin d'avoir de bonnes performances avec des colonnes dépendantes triviales dans les cas où tous sont les mêmes ou tout simplement une bonne fille


Aucun agrégat dans ANSI-92 SQL contrib.Adrew.cmu.edu / tshadow/sql/sql1992.txt


@ypercube: moins cher pour le SGBD


SQL Server a premier () et Dernier () pour "Ne pas prendre en charge" les champs dans les requêtes groupées. MySQL ne nécessite rien de faire quoi que ce soit pour obtenir des champs non agrégés dans les requêtes groupées, utilisez simplement le nom de terrain comme vous le feriez dans n'importe quel autre SELECT.


@Mark B: Je les connais sur l'accès mais pas sur SQL Server, je ne connaissais pas la voie MySQL, je viens d'apprendre. Merci


@Luissiquot - Voir aussi ma réponse ici


5 Réponses :



3
votes

Il y a aucun tout agrégat dans ANSI SQL-92

est le qualificatif pour correspondre à une partie et à tous


6 commentaires

J'ai sélectionné un mauvais nom à la fonction "My Aggregate". Mais je veux dire un moyen d'avoir une alternative moins chère de max () ou de min () s'il existe


super!! lien < / a>


SQL Server a un tout agrégat


@GBN - Je ne sais pas s'il y aurait un avantage pour réécrire une requête pour l'obtenir. Peut-être une réduction mineure du temps de la CPU potentiellement car il n'est pas nécessaire de faire des comparaisons?


@Martin Smith: Je dirais que c'est une optimisation interne pour traiter de tels cas que celles-ci ci-dessus. Si utilisable directement, cela provoquerait une confusion comme le groupe MySQL par un non-sens


Cette réponse n'est plus exacte à partir de 2015 - Voir cette mise à jour pour MySQL 5.7+.



1
votes

mysql fait pas besoin un tout () agrégat.

Si je fais un xxx

microsofts t-sql se plaindre mais < / p>

mySQL exécutera silencieusement exécuté silencieusement xxx

ce qui est bien sûr plus rapide que Sélectionnez max (champ1), champ2, somme (.... Groupe par champ2

mySQL prend en charge tout , mais sélectionnez n'importe quel (champ1) ... ne fonctionne pas car tout est un opérateur similaire à dans et tout .
Voir: http://dev.mysql.com /doc/refman/5.0/fr/any-in-some-subqueries.html

J'aime MySQL


12 commentaires

Ambigu et pas explicite = dangereux.


@GBN, de nombreux outils vous donnent une arme à feu pour tirer, c'est pourquoi vous devez connaître votre outil, de sorte que vous ne vous tirez pas dans le pied. Que les armes à feu tuent des gens ou des personnes tuent les gens est une autre discussion entièrement.


@Johan génial !! J'ai vu Select Field1, Field2, Somme (Field3) de Table1 Group par Field2, Field1 ... mais le champ 1 est REUUDUNAT car il dépend du champ2. Je pense que c'est pire que Min (Field1) aussi


Mauvaise analogie: non comparable. Dans cette situation, je ne vois pas besoin de faire deviner une colonne de RDBMS en mon nom. Seulement MySQL a cette ambiguïté aussi: SQL Server, Sybase, Oracle, Postgres Ne pas . Voir Stackoverflow.com/q/5986127/27535


@gbn, personnellement, je pense que le mot-clé tout () est la meilleure solution, en ce qui concerne les docs MySQL le soutenir, mais que SOOO beaucoup de requêtes MySQL dépendent de l'ancien comportement dangereux que ça ne va pas partir . Toute l'idiologie de MySQL doit être aussi pardonnante que possible, pour certaines choses que cela en fait l'outil droit pour le travail TM, pour d'autres emplois non. Connaissez vos outils et choisissez judicieusement.


Quelle monnaie fantastique et très appropriée: idiologie , comme dans Idio [TIC] [Ideo] Logy, comme dans "l'idiologie de MySQL". Je me souviendrai d'un. (L'orthographe correcte est idéologie , BTW.)


@ Johan - Pour porter votre analogie d'armes à feu à sa conclusion - des pistolets de qualité (tous les autres RDBM) vous donnent un interrupteur de sécurité pour empêcher la cuisson accidentelle. MySQL vous donne une gâchette de cheveux et des munitions surchargées pour vous rendre beaucoup plus facile de vous blesser.


Me frappe comme une erreur sujette. Dans DBS qui gérent le fenêtrage, vous pouvez obtenir ce comportement de manière plus évidente.


@Jnk, @johan, @andrew Lazarus: un exemple de pourquoi ce comportement MySQL est stupide Stackoverflow.com/q/6642241/27535


@GBN - Je n'ai pas besoin de convaincre, mais merci pour le lien.


@Jnk: Je sais d'en haut, mais certaines munitions en cas de Bunfight ... ;-)


En tant que note, ce n'est plus le cas avec les paramètres de connexion par défaut, en particulier dans MySQL Workbench - Ceci est contrôlé par sql_mode = seulement_full_group_by . L'émission d'une telle requête montrera les éléments suivants: Code d'erreur: 1055. Expression #Number de la liste de sélection n'est pas en groupe par clause et contient la colonne non contenue "Tableau.Column" qui ne dépend pas fonctionnellement des colonnes de la clause de groupe par la clause; Ceci est incompatible avec sql_mode = seulement_full_group_by



0
votes

Bien, rephasons la question initiale. Au lieu de tout, ce qui est ambigu et non standard SQL, ce serait génial si une fonction d'agrégation était fournie.

à plusieurs reprises que j'ai utilisé "Compte (externe.column)> 0" pour imiter "Exist (externe.column)", qui serait sans doute moins chère puisque le comptage est jeté quand même.


0 commentaires

1
votes

AS de MySQL 5.7 (publié en octobre 2015), il existe une fonction pour cela! Any_Value (Col) rencontre explicitement ce besoin - voir le documentation pour plus de détails.

Cependant, il est important de noter qu'il semble toujours ne pas garantir un court-circuit et peut toujours effectuer une analyse complète, donc l'objectif d'une efficacité accrue. peut ne pas être satisfait. Si MySQL est intelligent à ce sujet, il y a une chance, bien que les tests soient sages. Il y a deux circonstances dans lesquelles il peut être utile de toute façon:

  • Si la valeur à agrégée est particulièrement importante et sans indication, de sorte que toutes les comparaisons soient chères.
  • Si l'intention du code serait faite moins claire en tirant parti de max ou un autre agrégat d'espace réservé. Par exemple, un max peut impliquer une raison quelconque de son existence plutôt que d'obtenir "quoi que ce soit" du regroupement, mais any_value définirait explicitement l'intention sans commentaire supplémentaire. < / li>

    échantillon de jouet: xxx


0 commentaires