En savoir plus sur les antipatterns, les plans d'exĂ©cution, la complexitĂ© temporelle, le rĂ©glage des requĂȘtes et l'optimisation SQL

Le langage de requĂȘte structurĂ© (SQL) est une compĂ©tence indispensable dans l'industrie informatique et, d'une maniĂšre gĂ©nĂ©rale, l'apprentissage de cette compĂ©tence est relativement simple. Cependant, la plupart des gens oublient que SQL ne consiste pas seulement Ă Ă©crire des requĂȘtes, c'est juste la premiĂšre Ă©tape sur la route. Garantir les performances des requĂȘtes ou faire correspondre le contexte dans lequel vous travaillez est une tout autre chose.
C'est pourquoi ce guide SQL vous fournira un petit aperçu de certaines des Ă©tapes que vous pouvez suivre pour Ă©valuer votre requĂȘte:
- Tout d'abord, vous commencerez par un bref aperçu de l'importance de l'apprentissage SQL pour travailler dans le domaine de la science des données;
- Ensuite, vous apprendrez d'abord comment traiter et exĂ©cuter des requĂȘtes SQL afin de comprendre l'importance de crĂ©er des requĂȘtes de qualitĂ©. Plus prĂ©cisĂ©ment, vous verrez que la demande est analysĂ©e, réécrite, optimisĂ©e et finalement Ă©valuĂ©e.
- Dans cet esprit, vous irez non seulement Ă quelques antipatterns de requĂȘtes que les dĂ©butants font lors de l'Ă©criture de requĂȘtes, mais vous en apprendrez Ă©galement plus sur les alternatives et les solutions Ă ces erreurs possibles; De plus, vous en apprendrez davantage sur l'approche de requĂȘte basĂ©e sur un ensemble.
- Vous verrez Ă©galement que ces antipatterns dĂ©coulent de problĂšmes de performances et qu'en plus de l'approche «manuelle» pour amĂ©liorer les requĂȘtes SQL, vous pouvez analyser vos requĂȘtes de maniĂšre plus structurĂ©e et approfondie, en utilisant d'autres outils qui vous aident Ă voir le plan de requĂȘte; Et
- Vous apprendrez briÚvement la complexité du temps et la notation O, pour avoir une idée de la complexité du plan d'exécution à temps avant d'exécuter la demande;
- Vous apprendrez briĂšvement comment optimiser votre requĂȘte.
Pourquoi devriez-vous apprendre SQL à travailler avec des données?
SQL est loin d'ĂȘtre mort: c'est l'une des compĂ©tences les plus recherchĂ©es que vous trouverez dans les descriptions de travail de l'industrie du traitement et de l'analyse des donnĂ©es, que vous postuliez pour l'analyse de donnĂ©es, l'ingĂ©nieur de donnĂ©es, le spĂ©cialiste des donnĂ©es ou tout autre rĂŽle. Cela est confirmĂ© par 70% des rĂ©pondants Ă l'enquĂȘte sur les salaires O 'Reilly Data Science pour 2016, qui indiquent qu'ils utilisent SQL dans leur contexte professionnel. De plus, dans cette enquĂȘte, SQL se dĂ©marque des langages de programmation R (57%) et Python (54%).
Vous obtenez l'image: SQL est une compétence nécessaire lorsque vous travaillez à trouver un emploi dans l'industrie informatique.
Pas mal pour un langage qui a été développé au début des années 1970, non?
Mais pourquoi est-il si souvent utilisé? Et pourquoi n'est-il pas mort malgré le fait qu'il existe depuis si longtemps?
Il existe plusieurs raisons: l'une des premiĂšres raisons pourrait ĂȘtre que les entreprises stockent principalement des donnĂ©es dans des systĂšmes de gestion de bases de donnĂ©es relationnelles (RDBMS) ou dans des systĂšmes de gestion de flux de donnĂ©es relationnelles (RDSMS), et SQL est requis pour accĂ©der Ă ces donnĂ©es. SQL est une
lingua franca de donnĂ©es: il permet d'interagir avec presque n'importe quelle base de donnĂ©es ou mĂȘme de crĂ©er la vĂŽtre localement!
Si cela ne suffit toujours pas, gardez à l'esprit qu'il existe de nombreuses implémentations SQL qui sont incompatibles entre les fournisseurs et ne sont pas nécessairement conformes aux normes. Par conséquent, la connaissance du SQL standard est une exigence pour vous de trouver votre chemin dans l'industrie (informatique).
De plus, il est sĂ»r de dire que de nouvelles technologies ont Ă©galement rejoint SQL, comme Hive, une interface de langage de requĂȘte de type SQL pour interroger et gĂ©rer de grands ensembles de donnĂ©es, ou Spark SQL, qui peut ĂȘtre utilisĂ© pour exĂ©cuter des requĂȘtes SQL. Encore une fois, le SQL que vous y trouverez sera diffĂ©rent du standard que vous pourriez apprendre, mais la courbe d'apprentissage sera beaucoup plus simple.
Si vous voulez faire une comparaison, considérez-la comme l'apprentissage de l'algÚbre linéaire: aprÚs avoir mis tous ces efforts dans ce sujet, vous savez que vous pouvez également l'utiliser pour maßtriser l'apprentissage automatique!
En bref, c'est pourquoi vous devriez apprendre ce langage de requĂȘte:
- Il est assez facile Ă apprendre, mĂȘme pour les dĂ©butants. La courbe d'apprentissage est assez simple et progressive, vous Ă©crirez donc des requĂȘtes dĂšs que possible.
- Il suit le principe «apprendre une fois, utiliser partout», c'est donc un excellent investissement de votre temps!
- C'est un excellent ajout aux langages de programmation; Dans certains cas, l'Ă©criture d'une requĂȘte est mĂȘme prĂ©fĂ©rable Ă l'Ă©criture de code, car elle est plus efficace!
- ...
Qu'attendez-vous encore? :)
Traitement SQL et exĂ©cution de requĂȘtes
Pour amĂ©liorer les performances de votre requĂȘte SQL, vous devez d'abord savoir ce qui se passe Ă l'intĂ©rieur lorsque vous cliquez sur un raccourci pour exĂ©cuter la requĂȘte.
Tout d'abord, la demande est analysée dans un arbre d'analyse; La demande est analysée pour vérifier sa conformité aux exigences syntaxiques et sémantiques. L'analyseur crée une représentation interne de la demande d'entrée. Cette sortie est ensuite transférée vers le mécanisme de réécriture.
Ensuite, l'optimiseur doit trouver l'exĂ©cution ou le plan de requĂȘte optimal pour la requĂȘte donnĂ©e. Le plan d'exĂ©cution dĂ©termine avec prĂ©cision quel algorithme est utilisĂ© pour chaque opĂ©ration et comment les opĂ©rations sont coordonnĂ©es.
Pour trouver le plan d'exĂ©cution le plus optimal, l'optimiseur rĂ©pertorie tous les plans d'implĂ©mentation possibles, dĂ©termine la qualitĂ© ou le coĂ»t de chaque plan, reçoit des informations sur l'Ă©tat actuel de la base de donnĂ©es, puis sĂ©lectionne les meilleurs d'entre eux comme plan d'implĂ©mentation final. Les optimiseurs de requĂȘte pouvant ĂȘtre imparfaits, les utilisateurs et les administrateurs de base de donnĂ©es doivent parfois examiner et rĂ©gler manuellement les plans créés par l'optimiseur pour amĂ©liorer les performances.
Maintenant, vous vous demandez probablement ce qui est considĂ©rĂ© comme un «bon plan de requĂȘte».
Comme vous l'avez déjà lu, la qualité du coût d'un plan joue un rÎle important. Plus précisément, des éléments tels que le nombre d'E / S disque requis pour évaluer le plan, le coût du processeur du plan et le temps de réponse total que le client de base de données peut observer, et le temps d'exécution total, sont importants. C'est là que le concept de complexité temporelle se pose. Vous en apprendrez plus à ce sujet plus tard.
Ensuite, le plan de requĂȘte sĂ©lectionnĂ© est exĂ©cutĂ©, Ă©valuĂ© par le mĂ©canisme d'exĂ©cution du systĂšme et les rĂ©sultats de la requĂȘte sont renvoyĂ©s.
Ăcriture de requĂȘtes SQL
Il peut ne pas ĂȘtre devenu clair Ă partir de la section prĂ©cĂ©dente que le principe de Garbage In, Garbage Out (GIGO) se manifeste naturellement dans le processus de traitement et d'exĂ©cution d'une requĂȘte: celui qui formule la requĂȘte possĂšde Ă©galement des clĂ©s pour les performances de vos requĂȘtes SQL. Si l'optimiseur reçoit une requĂȘte mal formulĂ©e, il peut en faire autant ...
Cela signifie que vous pouvez faire certaines choses lors de la rĂ©daction d'une demande. Comme vous l'avez dĂ©jĂ vu dans l'introduction, la responsabilitĂ© ici est double: il ne s'agit pas seulement d'Ă©crire des requĂȘtes qui rĂ©pondent Ă une certaine norme, mais aussi de collecter des idĂ©es sur les endroits oĂč les problĂšmes de performances peuvent ĂȘtre masquĂ©s dans votre requĂȘte.
Un point de dĂ©part idĂ©al est de penser Ă des «endroits» dans vos requĂȘtes oĂč des problĂšmes peuvent survenir. Et, en gĂ©nĂ©ral, il existe quatre mots clĂ©s dans lesquels les nouveaux arrivants peuvent s'attendre Ă des problĂšmes de performances:
- Condition
WHERE
; - Tous les mots clés
INNER JOIN
ou LEFT JOIN
; Et aussi HAVING
état;
Bien sĂ»r, cette approche est simple et naĂŻve, mais, pour un dĂ©butant, ces points sont d'excellents pointeurs, et il est sĂ»r de dire que lorsque vous commencez, des erreurs se produisent Ă ces endroits et, curieusement, oĂč il est Ă©galement difficile de les remarquer.
Cependant, vous devez également comprendre que la performance doit devenir significative. Cependant, le simple fait de dire que ces phrases et mots clés sont mauvais n'est pas ce dont vous avez besoin lorsque vous pensez aux performances SQL. Avoir une
WHERE
ou
HAVING
dans une requĂȘte ne signifie pas nĂ©cessairement que c'est une mauvaise requĂȘte ...
Consultez la section suivante pour en savoir plus sur les antipatterns et les approches alternatives pour crĂ©er votre requĂȘte. Ces trucs et astuces sont destinĂ©s Ă servir de guide. Comment et si vous avez vraiment besoin de réécrire votre demande dĂ©pend, entre autres choses, de la quantitĂ© de donnĂ©es, de la base de donnĂ©es et du nombre de fois que vous devez terminer la demande. Cela dĂ©pend complĂštement du but de votre demande et avoir une connaissance prĂ©alable de la base de donnĂ©es avec laquelle vous travaillerez est crucial!
1. Récupérez uniquement les données nécessaires
La conclusion «plus il y a de donnĂ©es, mieux c'est» - ne doit pas ĂȘtre suivie lors de l'Ă©criture de SQL: vous risquez non seulement de vous perdre en obtenant plus de donnĂ©es que vous n'en avez rĂ©ellement besoin, mais Ă©galement les performances peuvent souffrir car votre requĂȘte reçoit trop de donnĂ©es.
C'est pourquoi, en rÚgle générale, vous devez faire attention à l'
SELECT
, Ă la
SELECT
DISTINCT
et Ă l'instruction
LIKE
.
SELECT
La premiĂšre chose que vous pouvez dĂ©jĂ vĂ©rifier lorsque vous Ă©crivez une requĂȘte est de savoir si l'
SELECT
aussi compacte que possible. L'objectif ici devrait ĂȘtre de supprimer les colonnes inutiles de
SELECT
. De cette façon, vous vous forcez Ă ne rĂ©cupĂ©rer que les donnĂ©es correspondant Ă votre requĂȘte.
Si vous avez corrĂ©lĂ© des sous-requĂȘtes avec
EXISTS
, vous devez essayer d'utiliser une constante dans l'
SELECT
cette sous-requĂȘte au lieu de choisir la valeur de la colonne rĂ©elle. Ceci est particuliĂšrement pratique lorsque vous ne vĂ©rifiez que l'existence.
N'oubliez pas qu'une sous-requĂȘte corrĂ©lĂ©e est une sous-requĂȘte qui utilise les valeurs d'une requĂȘte externe. Et notez que mĂȘme si
NULL
peut fonctionner comme une «constante» dans ce contexte, c'est trÚs déroutant!
Considérez l'exemple suivant pour comprendre ce que signifie l'utilisation d'une constante:
SELECT driverslicensenr, name FROM Drivers WHERE EXISTS (SELECT '1' FROM Fines WHERE fines.driverslicensenr = drivers.driverslicensenr);
Astuce: il est utile de savoir qu'avoir une sous-requĂȘte corrĂ©lĂ©e n'est pas toujours une bonne idĂ©e. Vous pouvez toujours envisager de vous en dĂ©barrasser, par exemple, en les réécrivant Ă l'aide de
INNER JOIN
:
SELECT driverslicensenr, name FROM drivers INNER JOIN fines ON fines.driverslicensenr = drivers.driverslicensenr;
Opération DISTINCT
L'
SELECT DISTINCT
utilisée pour renvoyer uniquement des valeurs différentes.
DISTINCT
est un point à éviter si possible. Comme dans d'autres exemples, le temps d'exécution augmente uniquement lorsque cette phrase est ajoutée à la demande. Par conséquent, il est toujours utile de déterminer si vous avez vraiment besoin de cette opération
DISTINCT
pour obtenir les résultats que vous souhaitez obtenir.
LIKE
Lors de l'utilisation de l'opérateur
LIKE
dans une requĂȘte, l'index n'est pas utilisĂ© si le modĂšle commence par
%
ou
_
. Cela empĂȘchera la base de donnĂ©es d'utiliser l'index (s'il en existe un). Bien sĂ»r, d'un autre point de vue, on peut Ă©galement affirmer que ce type de demande laisse potentiellement la possibilitĂ© d'obtenir trop d'enregistrements qui ne rĂ©pondent pas nĂ©cessairement Ă l'objet de la demande.
Encore une fois, connaĂźtre les donnĂ©es stockĂ©es dans la base de donnĂ©es peut vous aider Ă formuler un modĂšle qui filtrera correctement toutes les donnĂ©es pour trouver uniquement les lignes qui sont vraiment importantes pour votre requĂȘte.
2. Limitez vos résultats
Si vous ne pouvez pas éviter de filtrer votre
SELECT
, vous pouvez limiter vos résultats d'autres maniÚres. C'est là qu'interviennent des approches telles que la
LIMIT
et les conversions de types de données.
ROWNUM
TOP
, LIMIT
et ROWNUM
Vous pouvez ajouter des instructions
LIMIT
ou
TOP
aux requĂȘtes pour spĂ©cifier le nombre maximal de lignes pour l'ensemble de rĂ©sultats. Voici quelques exemples:
SELECT TOP 3 * FROM Drivers;
Notez que vous pouvez éventuellement spécifier
PERCENT
, par exemple, si vous modifiez la premiĂšre ligne de requĂȘte avec
SELECT TOP 50 PERCENT *
.
SELECT driverslicensenr, name FROM Drivers LIMIT 2;
Vous pouvez également ajouter la
ROWNUM
équivalente à l'utilisation de
LIMIT
dans la requĂȘte:
SELECT * FROM Drivers WHERE driverslicensenr = 123456 AND ROWNUM <= 3;
Conversions de types de données
Les plus efficaces doivent toujours ĂȘtre utilisĂ©s, c'est-Ă -dire les plus petits types de donnĂ©es. Il y a toujours un risque lorsque vous fournissez un type de donnĂ©es Ă©norme, tandis qu'un plus petit sera plus suffisant.
Cependant, lors de l'ajout d'une conversion de type de donnĂ©es Ă la requĂȘte, seul le temps d'exĂ©cution augmente.
Une alternative consiste Ă Ă©viter autant que possible la conversion des types de donnĂ©es. Veuillez Ă©galement noter qu'il n'est pas toujours possible de supprimer ou d'ignorer la conversion du type de donnĂ©es des requĂȘtes, mais vous devez toujours vous efforcer de les inclure et vĂ©rifier l'effet de l'ajout avant d'exĂ©cuter la requĂȘte.
3. Ne compliquez pas les requĂȘtes qu'elles ne devraient l'ĂȘtre
Les conversions de types de donnĂ©es vous amĂšnent au point suivant: vous ne devez pas trop concevoir vos requĂȘtes. Essayez de les rendre simples et efficaces. Cela peut sembler trop simple ou stupide mĂȘme pour ĂȘtre un indice, principalement parce que les demandes peuvent ĂȘtre complexes.
Cependant, dans les exemples mentionnĂ©s dans les sections suivantes, vous verrez que vous pouvez facilement commencer Ă rendre les requĂȘtes simples plus complexes qu'elles ne devraient l'ĂȘtre.
Opérateur OR
Lorsque vous utilisez l'opérateur
OR
dans votre requĂȘte, vous n'utilisez probablement pas d'index.
N'oubliez pas qu'un index est une structure de donnĂ©es qui amĂ©liore la vitesse de recherche des donnĂ©es dans une table de base de donnĂ©es, mais il est coĂ»teux: des enregistrements supplĂ©mentaires seront nĂ©cessaires et un espace de stockage supplĂ©mentaire sera nĂ©cessaire pour maintenir la structure des donnĂ©es d'index. Les index sont utilisĂ©s pour rechercher ou rechercher rapidement des donnĂ©es sans avoir Ă rechercher chaque ligne de la base de donnĂ©es Ă chaque accĂšs Ă la table de base de donnĂ©es. Les index peuvent ĂȘtre créés en utilisant une ou plusieurs colonnes dans une table de base de donnĂ©es.
Si vous n'utilisez pas d'index inclus dans la base de donnĂ©es, l'exĂ©cution de votre requĂȘte prendra inĂ©vitablement plus de temps. C'est pourquoi il est prĂ©fĂ©rable de rechercher des alternatives Ă l'utilisation de l'opĂ©rateur
OR
dans votre requĂȘte;
ConsidĂ©rez la requĂȘte suivante:
SELECT driverslicensenr, name FROM Drivers WHERE driverslicensenr = 123456 OR driverslicensenr = 678910 OR driverslicensenr = 345678;
L'opĂ©rateur peut ĂȘtre remplacĂ© par:
Condition avec
IN
; ou
SELECT driverslicensenr, name FROM Drivers WHERE driverslicensenr IN (123456, 678910, 345678);
Deux
SELECT
avec
UNION
.
Astuce: ici, vous devez faire attention à ne pas utiliser l'opération
UNION
inutile, car vous consultez plusieurs fois la mĂȘme table. En mĂȘme temps, vous devez comprendre que lorsque vous utilisez
UNION
dans votre requĂȘte, le temps d'exĂ©cution augmente. Alternatives Ă l'opĂ©ration
UNION
: reformulez la requĂȘte afin que toutes les conditions soient placĂ©es dans une seule
SELECT
, ou utilisez
OUTER JOIN
au lieu d'
UNION
.
Astuce: Gardez Ă l'esprit que mĂȘme si
OR
- et les autres opérateurs qui seront mentionnés dans les sections suivantes - n'utilisent probablement pas d'index, la recherche d'index n'est pas toujours préférable!
NOT
opérateur
Lorsque votre requĂȘte contient un opĂ©rateur
NOT
, il est probable que l'index n'est pas utilisé, comme avec l'opérateur
OR
. Cela ralentira inĂ©vitablement votre demande. Si vous ne savez pas ce que cela signifie ici, considĂ©rez la requĂȘte suivante:
SELECT driverslicensenr, name FROM Drivers WHERE NOT (year > 1980);
Cette requĂȘte s'exĂ©cutera certainement plus lentement que vous ne le pensez, principalement parce qu'elle est formulĂ©e beaucoup plus compliquĂ©e qu'elle ne peut l'ĂȘtre: dans des cas comme celui-ci, il est prĂ©fĂ©rable de chercher une alternative. Pensez Ă remplacer
NOT
des opérateurs de comparaison tels que
>
,
<>
ou
!>
; L'exemple ci-dessus peut en fait ĂȘtre réécrit et ressembler Ă ceci:
SELECT driverslicensenr, name FROM Drivers WHERE year <= 1980;
Ăa a dĂ©jĂ l'air mieux, non?
AND
opérateur
L'opérateur
AND
est un autre opĂ©rateur qui n'utilise pas d'index et qui peut ralentir une requĂȘte s'il est utilisĂ© de maniĂšre trop complexe et inefficace, comme dans l'exemple suivant:
SELECT driverslicensenr, name FROM Drivers WHERE year >= 1960 AND year <= 1980;
Il est prĂ©fĂ©rable de réécrire cette requĂȘte Ă l'aide de l'instruction
BETWEEN
:
SELECT driverslicensenr, name FROM Drivers WHERE year BETWEEN 1960 AND 1980;
ANY
et ALL
opérateurs
De plus, les opérateurs
ANY
et
ALL
sont ceux avec lesquels vous devez faire attention, car si vous les incluez dans vos requĂȘtes, l'index ne sera pas utilisĂ©. Des fonctions d'agrĂ©gation alternatives telles que
MIN
ou
MAX
sont utiles ici.
Conseil: dans les cas oĂč vous utilisez les alternatives proposĂ©es, vous devez savoir que toutes les fonctions d'agrĂ©gation, telles que
SUM
,
AVG
,
MIN
,
MAX
sur plusieurs lignes, peuvent entraĂźner une longue requĂȘte. Dans de tels cas, vous pouvez essayer de minimiser le nombre de lignes Ă traiter ou Ă prĂ©-calculer ces valeurs. Encore une fois, vous voyez qu'il est important de connaĂźtre votre environnement, le but de votre demande, ... Lorsque vous dĂ©cidez quelle demande utiliser!
Isoler les colonnes dans des conditions
De plus, dans les cas oĂč une colonne est utilisĂ©e dans un calcul ou dans une fonction scalaire, l'index n'est pas utilisĂ©. Une solution possible serait de simplement sĂ©lectionner une colonne spĂ©cifique afin qu'elle ne fasse plus partie du calcul ou de la fonction. Prenons l'exemple suivant:
SELECT driverslicensenr, name FROM Drivers WHERE year + 10 = 1980;
Ăa a l'air drĂŽle, hein? Au lieu de cela, essayez de rĂ©viser le calcul et de réécrire la requĂȘte comme ceci:
SELECT driverslicensenr, name FROM Drivers WHERE year = 1970;
4. Manque de force brute
Cette derniĂšre astuce signifie que vous ne devriez pas essayer de limiter trop la demande, car cela peut affecter ses performances. Cela est particuliĂšrement vrai pour les jointures et pour la clause HAVING.
Ordre des tables dans les jointures
Lors de la jonction de deux tables, il peut ĂȘtre important de considĂ©rer l'ordre des tables dans la jointure. Si vous voyez qu'une table est considĂ©rablement plus grande que l'autre, vous devrez peut-ĂȘtre réécrire la requĂȘte afin que la plus grande table soit placĂ©e en dernier dans la jointure.
Conditions de connexion excessives
Si vous ajoutez trop de conditions aux connexions SQL, vous devez choisir un chemin spécifique. Cependant, il se peut que ce chemin ne soit pas toujours plus efficace.
HAVING
condition
La
HAVING
été ajoutée à l'origine à SQL car le mot clé
WHERE
n'a pas pu ĂȘtre utilisĂ© avec des fonctions d'agrĂ©gation.
HAVING
généralement utilisé avec la
GROUP BY
pour restreindre les groupes de lignes renvoyĂ©es Ă celles qui remplissent certaines conditions. Cependant, si cette condition est utilisĂ©e dans la requĂȘte, l'index n'est pas utilisĂ©, ce qui, comme vous le savez dĂ©jĂ , peut conduire au fait que la requĂȘte ne fonctionne pas si bien.
Si vous recherchez une alternative, essayez d'utiliser la
WHERE
.
Tenez compte des requĂȘtes suivantes:
SELECT state, COUNT(*) FROM Drivers WHERE state IN ('GA', 'TX') GROUP BY state ORDER BY state
SELECT state, COUNT(*) FROM Drivers GROUP BY state HAVING state IN ('GA', 'TX') ORDER BY state
La premiĂšre requĂȘte utilise la
WHERE
pour limiter le nombre de lignes qui doivent ĂȘtre rĂ©sumĂ©es, tandis que la deuxiĂšme requĂȘte additionne toutes les lignes de la table, puis utilise
HAVING
pour supprimer les montants calculés. Dans de tels cas, l'option de
WHERE
est clairement meilleure car vous ne gaspillez pas de ressources.
On peut voir qu'il ne s'agit pas de limiter l'ensemble de rĂ©sultats, mais de limiter le nombre intermĂ©diaire d'enregistrements dans la requĂȘte.
Il convient de noter que la différence entre les deux conditions est que la
WHERE
introduit une condition pour les lignes individuelles, tandis que la
HAVING
introduit une condition pour les agrĂ©gations ou les rĂ©sultats de sĂ©lection, oĂč un rĂ©sultat, tel que
MIN
,
MAX
,
SUM
, ... était créé à partir de plusieurs lignes.
Vous voyez, l'Ă©valuation de la qualitĂ©, l'Ă©criture et la réécriture des demandes ne sont pas une tĂąche facile, Ă©tant donnĂ© qu'elles doivent ĂȘtre aussi productives que possible; La prĂ©vention des contre-modĂšles et la considĂ©ration d'options alternatives feront Ă©galement partie de la responsabilitĂ© lors de l'Ă©criture de requĂȘtes devant ĂȘtre effectuĂ©es sur des bases de donnĂ©es dans un environnement professionnel.
Cette liste n'était qu'un petit aperçu de quelques antipatterns et astuces qui, je l'espÚre, aideront les débutants; Si vous voulez avoir une idée de ce que les développeurs plus ùgés considÚrent comme les anti-patterns les plus courants, consultez
cette discussion .
Approches basĂ©es sur des ensembles ou procĂ©durales pour Ă©crire des requĂȘtes
Les antipatterns susmentionnĂ©s impliquent qu'ils se rĂ©sument en fait Ă une diffĂ©rence dans les approches basĂ©es sur des ensembles et procĂ©durales pour construire vos requĂȘtes.
L'approche procĂ©durale des requĂȘtes est une approche trĂšs similaire Ă la programmation: vous dites au systĂšme quoi faire et comment le faire.
Un exemple de ceci est les conditions excessives dans les connexions ou les cas oĂč vous
HAVING
conditions
HAVING
, comme dans les exemples ci-dessus, dans lesquels vous interrogez une base de données en exécutant une fonction puis en appelant une autre fonction, ou vous utilisez une logique qui contient des conditions, des boucles, des fonctions définies par l'utilisateur ( UDF), curseurs, ... pour obtenir le résultat final. Avec cette approche, vous demanderez souvent un sous-ensemble de données, puis un autre sous-ensemble de données, etc.
Sans surprise, cette approche est souvent appelĂ©e une requĂȘte «étape par Ă©tape» ou «ligne par ligne».
Une autre approche est une approche basĂ©e sur un ensemble, oĂč vous indiquez simplement quoi faire. Votre rĂŽle consiste Ă spĂ©cifier les conditions ou exigences pour l'ensemble de rĂ©sultats que vous souhaitez recevoir de la requĂȘte. Vous laissez la façon dont vos donnĂ©es sont rĂ©cupĂ©rĂ©es aux mĂ©canismes internes qui dĂ©terminent la mise en Ćuvre de la requĂȘte: vous laissez le moteur de base de donnĂ©es dĂ©terminer les meilleurs algorithmes ou logique de traitement pour exĂ©cuter votre requĂȘte.
Ătant donnĂ© que SQL est basĂ© sur un ensemble, il n'est pas surprenant que cette approche soit plus efficace que procĂ©durale, et cela explique Ă©galement pourquoi, dans certains cas, SQL peut s'exĂ©cuter plus rapidement que le code.
Le conseil est une approche basée sur un ensemble d'interrogations. C'est aussi celle que la plupart des grands employeurs de l'industrie des technologies de l'information vous demanderont de maßtriser! Il est souvent nécessaire de basculer entre ces deux types d'approches.
Veuillez noter que si vous avez besoin d'une demande procédurale, vous devriez envisager de la réécrire ou de la refactoriser.
La partie suivante couvrira l'optimisation du plan et des requĂȘtes.