2010-08-02 3 views
4

Je pense que c'est un scénario plutôt courant: j'ai une page Web qui renvoie des liens et des extraits aux 10 entrées de blog les plus récentes.Exécution de renvoyer des tables entières contenant du texte de blog plutôt que de sélectionner des colonnes spécifiques

Si je demandais simplement l'ensemble de la table, je pourrais utiliser mon objet mappé ORM, mais je téléchargerais tout le texte du blog.

Si je limitais la requête aux colonnes dont j'avais besoin, je définirais une autre classe qui ne contiendrait que les champs requis.

À quel point les performances sont-elles affectées si je devais interroger des lignes entières? Vaut-il la peine de choisir ce dont j'ai besoin?

Répondre

2

La réponse est "ça dépend".

Il y a deux choses qui affectent la performance dans la mesure où la sélection de la colonne:

  1. Y at-il covering indexes? Par exemple. S'il y a un index contenant TOUTES les colonnes dans la requête plus petite, alors un ensemble de colonnes plus petit aurait des performances extrêmement bénéfiques, puisque l'index serait lu sans lire les lignes elles-mêmes.

  2. Taille des colonnes. Fondamentalement, comptez combien la taille de la ligne entière est grande, par rapport à la taille des colonnes seulement dans une requête plus petite.

    • Si le rapport est significatif (par exemple ligne complète est 3 fois plus), alors vous pourriez avoir des économies importantes dans les deux IO (pour la recherche) et le réseau (pour la transmission) coût.

    • Si le rapport est plus proche de 10% de bénéfice, il ne vaut peut-être pas la peine d'en tirer un gain de performances.

+0

Cela prend tout son sens. Merci! –

+0

@Rei - bienvenue. – DVK

2

Cela dépend, mais il ne sera jamais aussi efficace que de retourner uniquement les colonnes dont vous avez besoin (évidemment). S'il y a peu de lignes et que la taille des lignes est petite, la bande passante du réseau ne sera pas trop affectée. Toutefois, renvoyer uniquement les colonnes dont vous avez besoin augmente les chances d'utilisation d'un index de couverture pour satisfaire la requête, ce qui peut faire une grande différence dans le temps d'exécution d'une requête.

+0

Bon de savoir qu'il n'y a pas plus d'une opinion à ce sujet. Merci! –

1

, Puisque vous spécifiez que ce soit pour 10 dossiers, les changements de réponse de « Il dépend » à « Ne passez pas même une seconde se soucier de ce ».

Sauf si votre serveur se trouve dans un autre pays via une connexion à distance, le délai d'attente pour 10 enregistrements sera de zéro, quel que soit le nombre d'octets que vous raserez chaque ligne. Ce n'est simplement pas quelque chose qui vaut la peine d'être optimisé. Donc, dans ce cas, vous pouvez configurer votre ORM gratuitement pour saisir ces enregistrements de la manière la moins efficace possible. Si votre situation change, et que vous avez soudainement besoin de plus de, disons, 1000 enregistrements à la fois, vous pouvez revenir et nous nous moquerons de vous pour ne pas spécifier de colonnes, mais pour l'instant vous obtenez un laissez-passer gratuit. Pour obtenir un crédit supplémentaire, une fois que vous lancez l'interrogation de cette page d'accueil à plus de 10x par seconde, vous pouvez ajouter une mise en cache sur le serveur pour éviter de toucher plusieurs fois la base de données. Cela vous rapportera beaucoup plus pour votre argent que l'optimisation de la requête.

+0

Ahh, donc le seul vrai coup de performance est l'heure du réseau entre la base de données et le serveur web. Bon à savoir: D –

Questions connexes