Je suis juste curieux.
Supposons que vous ayez un tableau de 1 million d'enregistrements / lignes.
select order_value from store.orders
Cela fait-il une différence si cette table a 1 champ, 2 champs ou 100 champs, en temps réel de requête? Je veux dire tous les champs autres que "order_value".
En ce moment, je pousse des données vers un entrepôt de données. Parfois, je vide des champs dans la table qui "pourraient être utilisés à l'avenir, un jour" - mais ils ne sont pas interrogés pour le moment, par quoi que ce soit. Ces champs «étrangers» affecteraient-ils des instructions sélectionnées qui ne les incluent pas, directement ou indirectement (non * je veux dire)?
sql-server
query-performance
select
user45867
la source
la source
Réponses:
Cela dépend vraiment des index et des types de données.
En utilisant la base de données Stack Overflow comme exemple, voici à quoi ressemble la table Users:
Il a un PK / CX sur la colonne Id. Il s'agit donc de l'intégralité des données de la table triées par Id.
Avec cela comme seul index, SQL doit lire tout cela (sans les colonnes LOB) en mémoire s'il n'est pas déjà là.
Le temps des statistiques et le profil io ressemblent à ceci:
Si j'ajoute un index non cluster supplémentaire sur juste l'ID
J'ai maintenant un index beaucoup plus petit qui satisfait ma requête.
Le profil ici:
Nous pouvons faire beaucoup moins de lectures et gagner un peu de temps CPU.
Sans plus d'informations sur la définition de votre table, je ne peux pas vraiment essayer de reproduire ce que vous essayez de mieux mesurer.
Oui, cela est spécifique aux tables rowstore. Les données sont stockées par la ligne sur les pages de données. Même si d'autres données de la page ne sont pas pertinentes pour votre requête, cette ligne entière> page> index doit être lue en mémoire. Je ne dirais pas que les autres colonnes sont "scannées" autant que les pages sur lesquelles elles existent sont scannées pour récupérer la valeur unique sur celles-ci en rapport avec la requête.
En utilisant l'exemple de l'annuaire téléphonique: même si vous ne faites que lire des numéros de téléphone, lorsque vous tournez la page, vous tournez le nom, le prénom, l'adresse, etc. avec le numéro de téléphone.
la source
Cela dépend de la structure de la table et des index disponibles.
Cas A: table commune (magasin de lignes), aucun index activé
(order_value)
.Le seul plan d'exécution possible est de lire l'intégralité du tableau (ce qui est bien sûr très différent quand il fait 2 vs 200 colonnes, donc quelques vs quelques milliers d'octets de large).
Cas B: table commune, il existe un index sur
(order_value)
ou certains autres index qui incluent cette colonne.Il y a un meilleur plan maintenant, scannez tout l'index (l'un d'eux) - qui est bien sûr beaucoup plus étroit que la table entière, juste quelques octets. Ce qui n'est pas pertinent si le tableau comporte 2 ou 200 colonnes. Seul l'index est analysé.
Cas C: c'est une table columnstore.
Comme son nom l'indique, la structure de ces tables est orientée colonne par colonne, et non par ligne. Aucun index n'est nécessaire, la conception de la table elle-même est adaptée à la lecture de colonnes entières.
la source