Question

J'écris un programme qui envoie un e-mail à l'heure locale spécifique d'un client.J'ai une méthode .NET qui prend un fuseau horaire, une heure et un fuseau horaire de destination et renvoie l'heure dans ce fuseau horaire.Ma méthode consiste donc à sélectionner chaque fuseau horaire distinct dans la base de données, à vérifier si l'heure est correcte à l'aide de la méthode, puis à sélectionner chaque client hors de la base de données avec ce ou ces fuseaux horaires.

La requête ressemblera à l’une de celles-ci.Gardez à l’esprit que l’ordre des résultats n’a pas d’importance, donc une union conviendrait.Lesquels courent plus vite, ou font-ils vraiment la même chose ?

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)

ou

SELECT email FROM tClient WHERE timezoneID = 1
    UNION ALL SELECT email FROM tClient WHERE timezoneID = 4
    UNION ALL SELECT email FROM tCLIENT WHERE timezoneID = 9

Modifier: timezoneID est une clé étrangère de tTimezone, une table avec la clé primaire timezoneID et le champ varchar(20) timezoneName. Aussi, je suis allé avec WHERE IN puisque je n'avais pas envie d'ouvrir l'analyseur.

Modifier 2 : La requête traite 200 000 lignes en moins de 100 ms, donc à ce stade, j'ai terminé.

Était-ce utile?

La solution

Hé!Ces requêtes ne sont pas équivalentes.

Les résultats ne seront les mêmes que si l’on suppose qu’un e-mail appartient uniquement à un seul fuseau horaire.Bien sûr, c'est le cas, mais le moteur SQL ne le sait pas et essaie de supprimer les duplicités.La première requête devrait donc être plus rapide.

Utilisez toujours UNION ALL, sauf si vous savez pourquoi vous souhaitez utiliser UNION.

Si vous n'êtes pas sûr de la différence, consultez ce Alors question.

Note:ce cri appartient à la version précédente de question.

Autres conseils

Pour la plupart des questions de performances liées aux bases de données, la vraie réponse est de l'exécuter et d'analyser ce que la base de données fait pour votre ensemble de données.Exécutez un plan d'explication ou une trace pour voir si votre requête atteint les index appropriés ou créez des index si nécessaire.

J'opterais probablement pour la première utilisation de la clause IN, car elle contient le plus de sémantique de ce que vous voulez.Le timezoneID ressemble à une clé primaire sur certaines tables de fuseaux horaires, il doit donc s'agir d'une clé étrangère sur le courrier électronique et indexée.En fonction de l'optimiseur de base de données, je pense qu'il devrait effectuer une analyse d'index sur l'index de clé étrangère.

Ma première hypothèse serait que

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)
sera plus rapide car il ne nécessite qu'une seule analyse de la table pour trouver les résultats, mais je suggère de vérifier le plan d'exécution pour les deux requêtes.

Je n'ai pas MS SQL Query Analyzer sous la main pour vérifier réellement mon hypothèse, mais je pense que la variante WHERE IN serait plus rapide car avec le serveur UNION, il faudra effectuer 3 analyses de table alors qu'avec WHERE IN, il n'en faudra qu'une.Si vous disposez d'un analyseur de requêtes, vérifiez les plans d'exécution pour les deux requêtes.

Sur Internet, vous pouvez souvent rencontrer des suggestions pour éviter d'utiliser WHERE IN, mais cela fait référence à des cas où des sous-requêtes sont utilisées.Ce cas sort donc du cadre de cette recommandation et est en outre plus facile à lire et à comprendre.

Je pense qu'il manque plusieurs informations très importantes dans la question.Tout d'abord, il est d'une grande importance que le timezoneID soit indexé ou non, fait-il partie de la clé primaire, etc.Je conseillerais à tout le monde de jeter un œil à l'analyseur, mais d'après mon expérience, la clause WHERE devrait être plus rapide, surtout avec un index.La logique est la suivante: il y a une surcharge supplémentaire dans la requête syndicale, la vérification des types, des numéros de colonne dans chacune, etc.

Dans le livre "SQL Performance Tuning", les auteurs ont constaté que les requêtes UNION étaient plus lentes dans les 7 SGBD qu'ils ont testés (SQL Server 2000, Sybase ASE 12.5, Oracle 9i, DB2, etc.) : http://books.google.com/books?id=3H9CC54qYeEC&pg=PA32&vq=UNION&dq=sql+performance+tuning&source=gbs_search_s&sig=ACfU3U18uYZWYVHxr2I3uUj8kmPz9RpmiA#PPA33,M1

Les derniers SGBD ont peut-être optimisé cette différence, mais c'est douteux.De plus, la méthode UNION est beaucoup plus longue et plus difficile à maintenir (et si vous en voulez une troisième ?) par rapport à la méthode UNION.l'IN.

Sauf si vous avez de bonnes raisons d'utiliser UNION, restez fidèle à la méthode OR/IN.

Certains optimiseurs de requêtes de SGBD modifient votre requête pour la rendre plus efficace. Ainsi, en fonction du SGBD que vous utilisez, vous ne devriez probablement pas vous en soucier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top