J'ai une idée que je n'ai pas encore mise en place, parce que j'ai peur que j'aboie le mauvais arbre ... principalement parce que googler sur le sujet renvoie si peu de résultats.Memoization dans la base de données - une bonne idée? Des expériences?
Fondamentalement, j'ai certaines requêtes SQL qui sont lentes, en grande partie parce qu'ils ont des sous-requêtes qui prennent du temps. Par exemple, ils pourraient faire des choses comme «donnez-moi le compte de toutes les bicyclettes qui sont rouges et montées par des garçons âgés de 10 à 15 ans». Ceci est cher car il glisse à travers tous les vélos, mais le résultat final est un seul numéro. Et, dans mon cas, je n'ai pas vraiment besoin que ce numéro soit 100% à jour.
La solution ultime pour les problèmes de ce genre semble être d'appliquer un moteur basé sur OLAP pour pré-mettre en cache ces permutations. Cependant, dans mon cas, je ne cherche pas vraiment à découper et à découper les données autour d'une tonne de métriques, et j'aimerais ne pas avoir à compliquer mon architecture avec un autre processus/datastore en cours d'exécution. Donc ... mon idée était de mémoriser ces sous-requêtes dans la base de données. Je pourrais avoir une table appelée "BicycleStatistics" et il pourrait stocker la sortie de cette sous-requête ci-dessus comme une paire de valeurs de nom de ses entrées et sorties.
Nom Ex: valeur « c_red_g_male_a_10-15 »: 235
et un mécanisme qui memoizes ces valeurs à cette table que les requêtes sont exécutées.
Est-ce que quelqu'un a été dans cette situation et a essayé quelque chose de similaire? La raison pour laquelle je pense qu'une solution comme celle-ci est précieuse par rapport à la base de données est que: (A) ma base de données est plus grande que la quantité de RAM que je peux facilement y jeter, et (B) la base de données va s'assurer que je reçois exactement le bon numéro pour ces statistiques, et ma grande victoire, ci-dessus, est que je suis d'accord avec les chiffres étant un jour ou deux périmés.
Merci pour vos commentaires/suggestions.
Tom
Avez-vous regardé les plans de requête pour voir pourquoi vos requêtes sont si lentes? Il se peut que vous utilisiez une méthode inefficace, par exemple une sous-requête corrélée au lieu d'une jointure, ou que vous manquiez un index quelque part. –
"La solution ultime pour les problèmes de ce genre" - est d'abord vérifier que vous avez les bons index pour votre charge de travail de requête –
En effet, j'ai passé une tonne de temps à s'assurer que les requêtes utilisent pleinement les index. L'exemple que j'utilise ci-dessus est un peu artificiel, mais dans mon cas, c'est comme si j'avais quelques millions de bicyclettes ... et je travaille à le mettre à l'échelle pour qu'il puisse être exécuté plusieurs fois par seconde. –