Effet sur les performances de l'utilisation de TOP 1 dans une requête SELECT
J'ai une table Utilisateur où il y a un nom d'utilisateur et de l'Application des colonnes. Nom d'utilisateur peut répéter, mais la combinaison de nom d'utilisateur + Application est unique, mais je n'ai pas la contrainte unique sur la table (pour la performance)
Question: il n'y aura aucune différence (en terme de performance) entre :
SELECT * FROM User where UserName='myuser' AND Application='myapp'
ET -
SELECT TOP 1 * FROM User where UserName='myuser' AND Application='myapp'
Comme la combinaison de nom d'utilisateur + Application est unique, à la fois les requêtes seront toujours de ne retourner qu'un seul album, TOP 1 n'affecte pas le résultat. J'ai toujours pensé que l'ajout de HAUT 1 va vraiment accélérer les choses comme sql server arrêter de regarder après il a trouvé un match, mais j'ai lu récemment dans un article que l'utilisation de HAUT seront en fait ralentir les choses et il est recommandé d'éviter, s'ils n'ont pas expliqué pourquoi.
Des commentaires?
Merci!
Andrey
Andrey, cliquez sur l'icône avant d'entrer dans le code. Le truc, c'est que toute ligne qui commence avec quatre espaces est interprété comme du code. J'ai simplement sélectionner mon code dans SSMS et de retrait. Qui me donne une parfaite mise en forme. (J'ai SSMS mis en place pour l'utilisation des espaces au lieu des caractères de tabulation.)
OriginalL'auteur Andrey | 2009-09-16
Vous devez vous connecter pour publier un commentaire.
Vous pouvez obtenir des performances différence de simplement en utilisant
top
, mais la performance réelle que vous obtenez en utilisant les index.Si vous avez un indice pour le nom d'utilisateur et les champs d'Application, la base de données n'a même pas besoin de toucher la table jusqu'à ce qu'il a isolé le seul enregistrement. Aussi, il le sait déjà, à partir de la table des statistiques que les valeurs sont uniques, à l'aide de
top
ne fait aucune différence.Savez-vous que le fait de passer l'index unique va ralentir les inserts (plus d'un index non unique) ou êtes-vous juste de se douter qu'il va? Si l'on suppose l'unicité, vous devez le sauvegarder avec un index unique.
Un index unique va ralentir insère comme il se doit vérifier l'existance avant de l'insérer, mais la différence doit être assez faible. Vous pouvez obtenir un peu de meilleures performances de lecture à partir d'un index unique, mais le principal avantage est qu'il garantit l'intégrité de la table.
Guffa a écrit, "Un index unique va ralentir insère comme il se doit de vérifier l'existence du fichier avant de l'insérer, mais la différence doit être assez faible." D'accord. La différence est susceptible d'être suffisamment petites pour ne pas être mesurables. Garantir l'unicité est valable quelle que soit infime différence.
Il y a un défaut dans SQL Server pour certains
TOP n
requêtes. Voir cette. dba.stackexchange.com/questions/143218/...OriginalL'auteur
Si il n'y a plus d'une ligne dans les résultats et pas de clause ORDER BY, le "TOP 1" enregistre un tonne de travail pour le serveur. Si il y a une clause order by, le serveur a encore à se matérialiser, l'ensemble de l'ensemble de résultats de toute façon, et si il y a une seule ligne, elle n'a pas vraiment changer quoi que ce soit.
Je ne dirais pas "zéro". Les optimiseurs de requêtes sont capricieux choses, donc je ferais de jeter quelques mots ambigus comme "probablement trivial si tout".
Il fera toute la différence, il int monde pour certaines valeurs, aucun pour les autres. Lorsque vous demandez de l'utilisateur et de l'application qui arriver à être le premier dans l'ordre physique dans le tableau 1 semble miracoulos qu'il va arrêter le scan après un enregistrement. Lorsque vous demandez de l'utilisateur et de l'application à proximité de l'extrémité de l'arbre-b 1 ne fera aucune différence. Ce que vous avez vraiment besoin de couvrir des indices.
OriginalL'auteur
Je pense que cela dépend sur le plan d'exécution de requête SQL génère ... Dans le passé sur des versions antérieures de SQL Server, j'ai vu l'utilisation de superflu, 'TOP' livrer définitive des avantages de performance avec des requêtes complexes avec de nombreuses jointures. Mais certainement pas dans tous les cas.
Je crois que le meilleur conseil que je puisse vous donner est d'essayer sur une base de cas par cas.
OriginalL'auteur
vous dire que vous n'avez pas l'application de la contrainte, qui traduit il n'y a pas d'index unique sur (nom d'utilisateur, de l'Application) ou (Application, le nom d'utilisateur). Peut la requête d'utiliser un chemin d'accès qui cherche soit sur
UserName
ouApplication
? En d'autres termes, est l'un de ces deux colonnes indexées? Si oui, le plan permettra de choisir le plus sélective qui est indexé et faire une analyse de plage, peut-être une boucle imbriquée avec une recherche de signet si l'index non-cluster, puis un filtre. Top 1 arrêtera la requête après le premier filtre est adapté, mais si cela fait une différence dépend de la cardinalité des données (nombre d'enregistrements de la plage de détection et combien de satisfaire le filtre).Si il n'y a pas d'index, puis il va faire un cluster de numériser n'importe quoi. Top 1 va arrêter le balayage sur le premier match, si c'est après le traitement de 1 enregistrement ou après le traitement de 999 mil. enregistrements depdends sur le nom réel de l'utilisateur et de l'application...
La seule chose que wil faire un réel différence est de permettre à la requête de faire une recherche pour les deux valeurs, c'est à dire. ont un index de couverture. La contrainte serait mise en œuvre à travers exactement comme un index de couverture. En d'autres termes: en désactivant la contrainte, sans doute pour des performances d'écriture, être prêt à payer le prix au lit. Est-ce important? Avez-vous mesure de confirmer que le supplément de l'indice d'écriture de la contrainte critique d'amortissement de la performance?
OriginalL'auteur