Existe / n'existe pas: 'select 1' vs 'sélectionnez le champ'
Où l'un des deux plus performant(j'ai récemment été accusée de ne pas être prudent avec mon code, car j'ai utilisé plus tard dans Oracle):
Select *
from Tab1
Where (not) exists(Select 1 From Tab2 Where Tab1.id = Tab2.id)
Select *
from Tab1
Where (not) exists(Select Field1 From Tab2 Where Tab1.id = Tab2.id)
Ou les deux sont-ils identiques?
Veuillez répondre à la fois à partir de SQL Server perspective ainsi que l'Oracle de la perspective.
J'ai googlé (surtout à partir de sql-server side) et constaté qu'il ya encore beaucoup de débat sur ce bien que, à mon avis/hypothèse est l'optimiseur dans les deux RDMBS sont assez matures pour comprendre que tout ce qui est nécessaire à partir de la sous-requête est une valeur Booléenne.
Pas de différence, ils sont tous deux de même. Vérifier le plan d'exécution pour les deux requêtes pour vérifier.
Jetez un oeil à cette réponse..stackoverflow.com/a/6140367/2975396
Jetez un oeil à cette réponse..stackoverflow.com/a/6140367/2975396
OriginalL'auteur anonxen | 2014-10-20
Vous devez vous connecter pour publier un commentaire.
Oui, ils sont les mêmes.
exists
vérifie si il y a au moins une ligne dans la sous-requête. Si oui, il évalue àtrue
. Les colonnes de la sous-requête n'a pas d'importance de toute façon.Selon MSDN,
exists
:Et Oracle:
Peut-être le Documentation de MySQL est encore plus expliquant:
Je ne sais pas. Je n'ai aucune expérience avec Postegres.
PostgreSQL est le même. Vous pouvez ainsi sélectionner la valeur null comme rien d'autre.
OriginalL'auteur Patrick Hofman
Je sais que c'est vieux,mais souhaitez ajouter quelques points que j'ai observé récemment..
Même s'il existe des contrôles pour seulement de l'existence ,quand nous écrivons "select *" toutes les ,colonnes sera élargi,autre que cette légère surcharge ,il n'y a pas de différences.
Source:
http://www.sqlskills.com/blogs/conor/exists-subqueries-select-1-vs-select/
Mise à jour:
L'Article que j'ai évoqué semble ne pas être valide.Même si, quand nous écrivons,
select 1
,SQLServer permettra de développer toutes les colonnes ..veuillez consulter le lien ci-dessous pour une analyse en profondeur et de statistiques de performances,lors de l'utilisation de diverses approches..
Sous-requête à l'aide de Existe 1 ou Existe *
SELECT *
permettra de développer toutes les colonnes de métadonnées etSELECT 1
ne sera pas. Cependant ils ont tous les deux en fait. Vous pouvez voir cela en refusant des autorisations sur une colonne et en cours d'exécutionSELECT 1 WHERE EXISTS (SELECT 1 FROM T);
qui peut échouer de façon inattendue avecThe SELECT permission was denied on the column 'Foo'
ou tout simplement un calendrier de l'effet de l'ajout de plusieurs colonnes à la fois ou à la recherche dans un débogueur stackoverflow.com/a/6140367/73226beaucoup,j'ai lu votre réponse à long retour,mais raté quelques choses.Merci encore pour déboulonner le mythe
OriginalL'auteur TheGameiswar