Question

Je travaille avec une équipe qui tente de mettre en œuvre un système de EAV. Ils ont décidé de diviser les tables de valeur d'attribut par type et ils débattent en utilisant des tables différentes pour des gammes de tailles différentes de varchar.

EX:

  • table_1 - jusqu'à varchar (10)
  • table_2 - varchar (11) VARCHAR (500)
  • table_3 - varchar (501) VARCHAR (MAX)

Je l'ai toujours été sous l'impression que varchar a été ne va utiliser la taille qu'il avait besoin.

Savez-vous si cela va avoir des gains en performance et serait-il en vaut la supplémentaire de codage / logique qui serait nécessaire?

Était-ce utile?

La solution

Mon instinct dit que tout gain de performance que vous obtenez est peu susceptible d'être vaut le tracas supplémentaire (et le potentiel de bugs) résultant de devoir appliquer la séparation et effectuer des recherches multiples dans votre logique d'application.

Si vous avez beaucoup de petites valeurs et étaient que les interroger et pas du reste vous voir gain de performance en plus de lignes cadrerait dans chaque page afin pages globalement moins devront être traitées dans la RAM ou lire à partir du disque pour une requête donnée. Dès que vous avez besoin de toutes les propriétés en une seule fois (ou tout simplement un mélange) cet avantage va être soufflé hors de l'eau soit besoin de requête plusieurs tables séparément ou via une UNION.

La seule façon d'être sûr est bien sûr de truquer un jeu de données à grande raisonnablement réaliste et exécuter des tests de performance contre les dispositions que vous envisagez. Mais je doute fort que vous verrez une valeur de changement de la complexité supplémentaire. Si vous les données peuvent être divisés de façon plus logique (à savoir des façons implicites par votre logique métier) que je vous suggère de regarder dans le partitionnement des données, en particulier si vous pouvez diviser les partitions sur des disques différents. Chaque fois que vous vous trouvez en contemplant une optimisation chargée potentiellement complexe (y compris le partitionnement) toujours revenir en arrière et revoir votre structure de données globale et assurez-vous qu'il ne fonctionne pas contre votre logique métier et vérifier votre matériel est suffisant pour la charge que vous attendez - alors qu'il n'est pas la garantie que vous êtes susceptible de trouver beaucoup plus importants gains grâce à la recherche dans ces domaines clés à la place.

Autres conseils

Vous aurez aucun gain de performance du tout.

pensées rapides, pas du tout une analyse exhaustive:

  • À un certain moment, vous aurez besoin de ces UNION pour obtenir une vue unique et tout devient varchar (max)
  • Comment décider de la longueur à l'avant?
  • L'indexation des valeurs de recherche? Vous ne pouvez indexer> 900 octets
  • vos propres modèles « uniques » contraintes dans un EAV serait assez mauvais, sans répartie sur plusieurs tables

Rechercher EAV modèle contre: il y a plusieurs articles sur la façon dont éviter EAV

On dirait qu'ils essaient d'optimiser l'EAV pour les recherches. Cependant, cela semble clairement comme ils ne sont pas en essayant d'optimiser un système de profilés lacunes, mais ils essaient d'optimiser par des suppositions vaudous.

Rappelez-leur que la première règle d'optimisation est profilage, donc comme David Spillett dit, jusqu'à ce que vous avez quelques centaines de millions de lignes dans le EAV (compte tenu de la plupart des entités que je connais sont au moins 15 attributs en-toto donc vous ne obtenez comme quelques dizaines de millions d'entités) et le profil, vous ne pouvez pas savoir que cela aura un impact.

Je vais aller avec « non, cela ne profitera pas comme ils pensent qu'il va » et que la meilleure répartition serait probablement quelque chose de l'ordre de 50 caractères et 100 caractères au lieu de 10 et 500. Mais c'est juste un deviner.


Mais remarquez qu'il aura l'effet qu'ils veulent en ce qu'elle permettra une meilleure performance de l'indice (tous le partitionnement des données devrait donner de meilleures performances d'indexation sur la non-séparation en règle générale)

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top