web-dev-qa-db-fra.com

Évolutivité: des millions de tables vs une grande table principale et des millions de vues

Nous devons migrer un ancien système (million LOC) de SAP Ads (autrefois Sybase) ISAM Basé (ainsi appelé tables libres) à une base de données PostgreSQL.

Le système implémente le type de multitenancy concernant la mise en place de quelques informations de base (ID de chancellerie, ID client, exercice, etc.) Juste dans les chemins de dossiers Windows et Les instructions SQL utilisent celles-ci pour créer des adresses de table avec les chemins appropriés pour la table spécifique (-Files).

Étant donné que SAP a décidé d'arrêter la prise en charge du serveur de base de données Advantage, nous sommes obligés de migrer le système vers un autre RDBM (réel).
[.

Grandes choses à noter

Pendant que j'utilise le terme multiténancy ici, ce n'est pas vraiment comme ça:

  1. Les espaces d'information du locataire partagent certaines données principales qui sont maintenues en permanence.
  2. L'ensemble du modèle de méta-de données est lié à une version logicielle spécifique déployée vers les systèmes de nos clients.
  3. Nous avons beaucoup de systèmes clients variables sur le terrain (c'est-à-dire que nous avons un peu perdu la trace de tous les cas d'utilisation servis au fil du temps)
  4. Les changements dans le code factuel sont sujets aux erreurs concernant les effets secondaires inattendus
  5. Dans l'ensemble, nous avons une grande boule de boue , qui ne nous laissait pas beaucoup de place pour avoir refactorisé en raison d'efforts excessives, mais nécessite toujours des fonctionnalités appliquées en permanence, que ce soit pour les exigences légales (les lois fiscales changeant etc.), ou client (gestion du produit) exigent.

Donc les choses ci-dessus indiquées devraient préciser que nous

  • je ne veux pas refroidir la base de données d'une manière qu'il frappe les applications factuelles existantes
  • devrait prendre un chemin pour la conception de la base de données qui fonctionne bien pour toutes nos installations de système de nos clients (à partir de l'installation unique de l'ordinateur portable Windows, jusqu'au système de serveur de fichiers Windows).

Les principales façons de rome

ATM Nous discutons de deux approches majeures comment faire cela:

  1. Migration des tables d'annonces existantes sur des objets de table PostgreSQL car ils apparaissent dans chacun des dossiers aux instances de table résidant dans des instances spécifiques postgressql SCHEMA.
  2. Migration des tables d'annonces existantes sur PostgreSQL Objets de la table principale et créez des vues pour eux une table de mappage comprenant une table de mappage et une clé de référence incluse avec la table principale et Une autre table où ces noms SCHEMA sont mappés en utilisant un identifiant unique.

Les deux approches sont déjà techniquement presque résolues et nous sommes en mesure de migrer les systèmes existants de toute façon.

Bien qu'il y ait toujours des points pour considérer quel chemin nous devrions prendre.

  • Certains de nos architectes disent de leurs tripes qui ayant des milliards de lignes dans un seul maître-table auraient probablement un impact significatif sur la performance avec les déclarations SQL.
  • D'autres (comme moi) font valoir qu'un modèle de vue/maître-table aurait plusieurs avantages concernant l'efficacité globale de la conception de la DB.

Nous faisons déjà des mesures, mais j'aimerais entendre des conseils, peut-être des expériences, voire d'autres choix d'idées de conception de la DB, pour lesquelles des approches pourrait améliorer mieux.

Quelques données de bord:

  • Le système global maintient actuellement ~ 1000 structures de base de base (certaines avec des champs de colonne de +400).
  • Nous avons des clients avec multistenance jusqu'à 10 000.
  • Certaines de ces tables (maîtrise) peuvent avoir besoin de suivre les lignes de la gamme de milliards.
  • Étant donné que les index sont (apparemment) bon marché dans les publicités, il y a parfois beaucoup d'entre elles utilisées avec les tables existantes ISAM Tables.

Ce que nous avons déjà remarqué:

  • L'impact de la performance appréhendé pour les instructions SQL appliquées à Les tableaux maîtres via Vues VS Les objets de table unique sont issus de la mise à l'échelle linéaire passant avec la quantité de lignes de données (I ' VE fait mesurer cela en utilisant des exemples EXPLAIN ANALYZE du côté serveur).
  • Utiliser des tables par SCHEMA le pg_catalog a tendance à grandir grand, surtout le pg_catalog.pg_attributes tableau. Toute opérations effectuées avec celles-ci (y compris l'optimiseur de requêtes PostgreSQL) pourraient être touchées par le contenu BIER Big Data.
  • Actuellement, nous utilisons un seul espace de table pour toutes les tables. Bien que nous puissions organiser des espaces de table pour chaque Chemin de répertoire virtuel , cela semble surcharger la conception de la DB cependant et pourrait même augmenter d'autres problèmes.
  • Comme mentionné précédemment, des espaces de table unique pour une telle quantité de relations ne semblent pas bien augmenter avec PostgreSQL et un système de fichiers Windows NTFS sous-jacent.
  • En ce qui concerne le système NTFS sous-jacent, nous devrions considérer qu'il y aura une taille de bloc minimum réservée à chaque fichier créé et PostgreSQL crée plusieurs fichiers pour n'importe quel pg_class objet , qui comprend des tables, des index, des champs de blob, etc.

Peut-être que ce que j'ai offert avec mes observations ici est un peu biaisé, mais j'aimerais poser des questions sur les alternatives, ou absolue novice pour l'un de ces modèles dont nous discutons.


Étant donné que mon patron est un gars sage, et il sait que je suis l'un des architectes qui soutiennent le modèle de vue, il m'a donné des devoirs, pour leur donner des informations sur les inconvénients.

6

Ok heres mon vague conseil architectif.

Je pense que vous avez raison d'assimiler les dossiers à des index sur une seule table plutôt que des schémas.

Mais l'accès à une seule table à travers des vues peut parfois être problématique. Je vous conseillerais toujours de simplement modifier l'instruction SQL plutôt que d'exécuter votre SQL sur une vue.

Deuxièmement, le volume de cisaillement de données pourrait également poser problème. Vous trouverez peut-être que vous devez vous diviser en quelque sorte pour rester performant.

Je suggérerais de le diviser en créant plus d'une base de données avec le même schéma et en divisant les données par locataire et/ou de date.

Cela présente l'avantage de pouvoir déplacer les données sur du matériel physiquement différent si nécessaire. Le désavantage est bien sûr que vous ne serez pas en mesure d'interroger les diviseurs aussi efficacement.

3
Ewan