7
votes

Quand la taille de la base de données appelle-t-elle plus cher que la fréquence des appels?

Quelqu'un peut-il me donner une idée relative de quand il est plus logique de frapper la base de données à plusieurs reprises pour que de petites questions de requête vs cache un grand nombre de rangées et interrogez cela?

Par exemple, si j'ai une requête renvoyant 2 000 résultats. Et ensuite, j'ai des questions supplémentaires sur ces résultats qui prennent peut-être 10-20 articles, seraient-ils mieux de mettre en cache les résultats de 2000 ou de toucher la base de données à chaque fois pour chaque ensemble de 10 ou 20 résultats?


1 commentaires

Je m'attendrais à ce que cela dépend de la question de savoir si la base de données est sur la même machine ou sur une autre machine. Une façon, vous devez vous contenter de la lenteur de la communication interprocessée. L'inverse, vous devez faire face à un réseau. Le rapport de vitesse est probablement de l'ordre d'une à des milliards ou d'une à des millions de personnes.


7 Réponses :


4
votes

Cela varie probablement de SMDBMS aux SGBDM, mais mon expérience a été que tirer en vrac est presque toujours meilleure. Après tout, vous allez devoir tirer de toute façon les enregistrements de 2000, afin que vous puissiez aussi bien le faire à la fois. Et 2000 enregistrements n'est pas vraiment une grande quantité, mais cela dépend en grande partie de ce que vous faites.

Mon conseil est de profiler et de voir ce qui fonctionne mieux. Les RDBMSES peuvent être des bêtes difficilement difficiles et la mise en cache de la performance et la mise en cache peuvent être aussi difficiles.


0 commentaires

2
votes

Le type de données que vous rameniez affecte également la décision. Vous ne voulez pas mettre en cache des données ou des données volatiles pour des mises à jour potentielles pouvant être rassisées.


0 commentaires

9
votes

Autres réponses ici sont correctes - les SGBDM et vos données sont des facteurs clés. Cependant, un autre facteur clé est de combien de temps il faudra pour trier et / ou indexer vos données dans la mémoire par rapport à la base de données. Nous avons une application où, pour la performance, nous avons ajouté du code pour saisir environ 10 000 enregistrements dans un en mémoire , puis effectuez des sous-candidats à ce sujet. Comme il s'avère, gardez les données à jour et la sélection des sous-ensembles est effectivement plus lente que de laisser toutes les données de la base de données.

Donc, mon conseil est le suivant: Faites-le d'abord le moyen le plus simple possible, puis de profilez-le si vous devez optimiser pour la performance.


0 commentaires

5
votes

Cela dépend d'une variété de choses. Je vais énumérer des points qui me viennent à l'esprit:

  • Si vous avez une application Web .NET qui met en cache des données dans le client, vous ne souhaitez pas tirer des lignes 2K.

  • Si vous avez un service Web, ils sont presque toujours mieux vêtus que bavardant en raison des frais généraux supplémentaires de XML sur le transport.

  • Dans une base de données assez normalisée et optimisée, il faut vraiment très peu de fois que vous devez tirer des rangées 2K à une époque, sauf si vous faites des rapports.

  • Si les données sous-jacentes changent à un rythme rapide, vous devriez vraiment faire attention à la mettre en cache sur le niveau moyen ou la couche de présentation, car ce que vous présentez allez être obsolète. < / li>

  • rapports (n'importe quel DSS) tire et chantera à travers des ensembles de données beaucoup plus importants, mais comme ils ne sont pas interactifs, nous vous dénormalisons et laissons leur amusement.

  • Dans les cas de rédaction en cascade et telles, les techniques AJAX se révèleront être plus efficaces et plus efficaces.

    Je suppose que je ne vous donne pas vraiment une réponse à votre question. "Cela dépend" est le meilleur que je puisse faire.


0 commentaires

5
votes

En général, la latence du retour du réseau est de plusieurs ordres de grandeur supérieurs à la capacité d'une base de données pour générer et alimenter des données sur le réseau et la capacité d'une boîte cliente de la consommer à partir d'une connexion réseau.

Mais regardez la largeur de votre bus de réseau (BITS / SEC) et comparez-la à la durée moyenne du retour pour une base de données ...

sur 100Baset Ethernet, par exemple, vous avez une vitesse de transfert de données de 12 Mo / SEC. Si votre temps d'aller-retour moyen est dit, 200 ms, votre bus réseau peut livrer 3 Mo dans chaque appel aller-retour de 200 ms.

Si vous êtes sur Gigabit Ethernet, ce numéro saute à 30 Mo par tour ...

Donc, si vous séparez une demande de données en deux voyages rondes, c'est bien 400 ms, et chaque requête devrait être supérieure à 3 Mo (ou 30 Mo de gigibit) avant que cela ne soit plus rapide ...


0 commentaires

3
votes

"Je suppose que je ne vous donne pas vraiment une réponse à votre question." Cela dépend "est le meilleur que je puisse faire."

Oui, "ça dépend". Cela dépend de la volatilité des données que vous avez l'intention de mettre en cache, et cela dépend du niveau de "précision" et de la fiabilité dont vous avez besoin pour les réponses que vous générez des données que vous avez l'intention de cache.

Si la volatilité de vos données "base" est faible, toute mise en cache que vous faites sur ces données a une probabilité plus élevée de rester valide et correcte pendant une période plus longue.

Si "la mise en cache-erreur-tolérance" sur les résultats que vous revenez sur vos utilisateurs est de zéro pour cent, vous n'avez aucune option.


0 commentaires

5
votes

sauf s'il y a un gros problème de performance (par exemple une connexion DB hautement latente), je vous entamerais avec de laisser les données dans la base de données et de laisser la base de données à prendre soin des choses pour vous. Beaucoup de choses sont effectuées efficacement sur le niveau de la base de données, par exemple

  • Niveaux d'isolation (que se passe-t-il si d'autres transactions mettent à jour les données que vous cache)
  • Accès rapide à l'aide d'index (DB peut être plus rapide d'accéder à quelques lignes que de rechercher dans vos éléments mis en cache, surtout si ces données sont déjà dans le cache DB, comme dans votre scénario)
  • mises à jour dans votre transaction vers les données en cache (souhaitez-vous faire face à la mise à jour de vos données en cache également ou faites-vous "rafraîchir" tout de la DB)

    Il y a beaucoup de problèmes potentiels que vous pourriez rencontrer si vous faites votre propre mise en cache. Vous devez avoir une très bonne raison de performance avant de commencer à prendre soin de toute cette complexité.

    Donc, la réponse courte: cela dépend, mais à moins que vous n'ayez de bonnes raisons, cela sent une optimisation prématurée pour moi.


0 commentaires