Le nombre de colonnes affecte-t-il les performances de la requête?
CAS 1: j'ai une table avec 30 colonnes et j'ai une requête à l'aide de 4 colonnes dans la clause where.
CAS 2: j'ai une table avec 6 colonnes et j'ai une requête à l'aide de 4 colonnes dans la clause where.
Qu'est-ce que la différence de performance dans les deux cas?
Par exemple, j'ai de la table
table A
{
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10),
f varchar(10),
g varchar(10),
h varchar(10)
}
SELECT b,c,d
FROM A
WHERE f='foo'
create table B
{
b varchar(10),
c varchar(10),
d varchar(10),
e varchar(10),
f varchar(10)
}
SELECT b,c,d
FROM B
WHERE f='foo'
À la fois A Et B de la table ont la même structure seule différence dans le nombre de colonne et la colonne utilisée dans la condition where est aussi le même et de la colonne à sélectionner est aussi le même. la différence est que le tableau B n'ont que quelques colonnes inutilisées ils ne sont pas utilisés dans le select et where condition
dans ce cas, est-il une différence de performance entre les deux requêtes ?
source d'informationauteur Pradeep Gaur
Vous devez vous connecter pour publier un commentaire.
Oui, parce que le principal bénéficier du retour de moins de colonnes dans un
SELECT
est que SQL pourrait être en mesure d'éviter la lecture de la table /du cluster, et au lieu de cela, si il peut récupérer tous lesselected
données à partir d'un indice (soit que les colonnes indexées et /ou des colonnes incluses dans le cas d'un index de couverture).Évidemment, les colonnes utilisées dans le prédicat (où le filtre), c'est à dire
f
dans votre exemple, DOIT être dans les colonnes indexées de l'index, et le doit être suffisamment sélectivepour un indice à être utilisés en premier lieu.Il y a aussi un secondaire bénéficier en retour de moins de colonnes à partir d'un
SELECT
comme cela réduira les I/O au-dessus, surtout si il est lent réseau entre le serveur de Base de données et l'application de consommer de la data - c'est à dire qu'il est de bonne pratique de ne jamais retourner les colonnes dont vous avez réellement besoin, et éviter d'utiliser laSELECT *
.Modifier : En réponse à l'OP, mis à jour du post:
Sans index, les deux requêtes fera les analyses de la table. Étant donné que
Table B
a moins de colonnes queTable A
le nombre de lignes par page (densité) sera plus élevé surB
et doncB
sera un peu plus rapide que SQL aurez besoin de chercher de moins de pages.Cependant, avec des indices comme par ci-dessous
A(f) INCLUDE (b,c,d)
B(f) INCLUDE (b,c,d)
Les performances devraient être identiques pour les requêtes (en supposant que les mêmes données dans deux tables), étant donné que SQL va frapper les indices qui sont maintenant similaires largeurs de colonne et de ligne densités.
Modifier
Certains autres plans:
B(f)
avec aucune autre clé ouINCLUDE
colonnes, ou avec un jeu incomplet deINCLUDE
colonnes (c'est à dire un ou plusieurs deb, c or d
sont manquantes):SQL Server aurez probablement besoin de faire un Clé ou en DÉBARRASSER Recherche que même si l'index est utilisé, il y aura un besoin de "se joindre" retour à la table pour récupérer les colonnes manquantes dans la clause select. (La recherche de type dépend si la table dispose d'un cluster PK ou pas)
B(f,b,c,d)
Ce sera encore très performant, comme l'index sera utilisé et la table d'éviter, mais ne sera pas tout à fait aussi bon que la couverture de l'indice deparce que la densité de l'arbre d'index sera de moins en moins en raison de l'augmentation des colonnes clés dans l'index.
De le tester et de voir!
Il y aura une différence de performance, toutefois 99% du temps, vous ne remarquerez - généralement, vous n'aurez même pas être capable de le détecter!
Vous ne pouvez pas la même garantie que celle de la table avec moins de colonnes sera plus rapide si sa vous dérange alors essayez et vous verrez.
Technique des ordures: (du point de vue de Microsoft SQL Server)
Avec l'hypothèse que, dans tous les autres égards (index, les nombres de lignes, les données contenues dans les 6 communes de colonnes, etc...) les tables sont identiques, la seule différence sera que plus la taille de la table est réparti sur plus de pages sur disque ou en mémoire.
SQL server tente seulement de lire les données qu'il a absolument besoin, cependant, il sera toujours charger une page entière à un moment (8 KO). Même avec la même quantité exacte de données est nécessaire que la sortie de la requête, si les données sont réparties sur plusieurs pages, puis de plus en plus de IO est nécessaire.
Cela dit, SQL server est incroyablement efficace avec ses données d'accès, et vous êtes donc très peu probable de voir un impact notable sur la performance, sauf dans des circonstances extrêmes.
En outre, il est également probable que votre requête sera exécutée à l'encontre de l'index plutôt que celui de la table, de toute façon, et donc, avec les index exactement de la même taille que le changement est susceptible d'être 0.
Il n'y aura pas de différence de performances basé sur la position de la colonne. Maintenant, la construction de la table est une histoire différente, par exemple le nombre de lignes, les index, le nombre de colonnes, etc.
Le scénario que vous êtes parle, où vous êtes en comparant la position de la colonne dans les deux tableaux, c'est comme comparer des pommes à des oranges presque, car il ya tellement de nombreuses variables différentes en plus de la position de la colonne.
Sauf si vous disposez d'un très large ensemble de colonnes différence avec aucun indice utilisé (donc une analyse de la table), vous devriez voir le peu de différence dans la performance. Cela étant dit, il est toujours utile et bénéfique pour y revenir quelques colonnes que possible pour satisfaire vos besoins. Le hic ici est que plus grand avantage peut être obtenu en retournant les colonnes dont vous avez besoin, plutôt que d'une seconde extraction de base de données pour les autres colonnes.
Dépend de la largeur de la table (Octets par ligne), le nombre de lignes dans la table, et s'il existe des indices sur les colonnes utilisées par la requête. Pas de réponse définitive sans cette info. Cependant, plus le nombre de colonnes dans le tableau, les chances sont qu'il est plus large. Mais l'effet d'un bon indice est beaucoup plus important que l'effet de la taille de la table.