100 Joindre une requête SQL

Je cherche à avoir essentiellement une table centralisée avec un certain nombre de tables de search qui l'entourent. La table centrale va être utilisée pour stocker 'Utilisateurs' et les tables de search seront des attributes user, comme 'Religion'. La table centrale va stocker un Id, comme ReligionId, et la table de search contiendra une list de religions.

Maintenant, j'ai beaucoup creusé dans ce domaine et j'ai vu beaucoup de gens commenter en disant qu'une table UserAtsortingbute pourrait être la meilleure façon de procéder, en utilisant essentiellement un model EAV. Je ne cherche pas à faire ça. Je me rends count que ma stratégie sera lourde et c'est pourquoi je pose cette question ici. Je cherche un moyen d'optimiser ces jointures.

Si la table a 100 tables de search, comment pourrait-elle être optimisée pour être plus rapide que de simplement faire une énorme jonction interne de 100 tables? Certaines idées viennent à l'esprit comme l'utilisation de nombreuses petites jointures, sous-sélections et vues. Je suis ouvert à tout, y compris une combinaison de ces stratégies. Encore une fois, juste pour noter, je ne cherche pas à faire quelque chose qui est liée à l'EAV. J'ai besoin des tables de search pour d'autres raisons et j'aime datatables normalisées.

Toutes les suggestions considérées!

Voici un aperçu visuel:

entrez la description de l'image ici

Edit: Est-ce fou?

Les techniques d'optimization dépendront probablement de la taille de la table centrale et des templates de requête prévus. Ceci est très similaire à ce que vous obtenez dans les schémas d'écanvass d'entreposage de données, donc les approches de ce paradigme peuvent aider.

Pour un, s'assurer que la taille de chaque rangée est absolument aussi petite que possible. L'espace disque peut être bon marché, mais le débit de disque, la memory et les ressources du processeur sont des goulots d'étranglement potentiels. Vous voulez des petites lignes afin qu'il puisse les lire rapidement et mettre en cache autant que possible en memory.

Une vue matérialisée / indexée avec les jointures déjà exécutées permet essentiellement de précalculer les jointures. Cela peut ne pas fonctionner correctement si vous travaillez avec une table centrale qui est écrite pour beaucoup ou est très grande.

Tout ce que vous pouvez faire pour optimiser une seule jointure doit être fait pour tous les 100. Indices appropriés basés sur la sélectivité de la colonne, etc.

Selon le type de requêtes que vous effectuez, d'autres techniques de l'entrepôt de données ou OLAP peuvent s'appliquer. Si vous faites beaucoup de groupes, alors c'est probablement un domaine à regarder. Les techniques d'entreposage de données peuvent être appliquées dans SQL Server sans outil supplémentaire.

Demandez-vous pourquoi tant d'attributes sont interrogés et comment ils sont présentés? Pour la plupart des parsings, il n'est pas nécessaire de se joindre aux tables de search avant la dernière étape où vous matérialisez un rapport, auquel cas vous ne pouvez vous être groupé que sur un sous-set de colonnes et n'avez besoin que de certaines tables de search.

Group By doit généralement pouvoir regrouper les ID de search sans avoir besoin du text / description de la table de search, de sorte qu'une jointure n'est pas nécessaire. Si vos searchs ont d'autres informations pertinentes pour la requête en cours, pensez à la dénormaliser dans la table centrale pour éliminer la jointure et / ou faire de cette valeur discrète sa propre search, en divisant l'identifiant de search existant en un autre ID.

Vous pouvez implémenter une table de code maître qui combine les tables de codes dans une seule table avec une colonne CodeType. Ce n'est pas la même chose que EAV parce que vous avez toujours une colonne dans la table centrale pour chaque type de code et une jointure pour chacun, où EAV est habituellement utilisé pour normaliser un nombre arbitraire d'attributes. ( Note : Je déteste personnellement les tables de code maître.)

Enfin, pensez à normaliser la table centrale si vous ne faites pas d'entreposage de données.

Y a-t-il beaucoup de valeurs nulles dans certaines colonnes lookupId? La table est-elle clairsemée? C'est une indication que vous pouvez tirer certaines colonnes dans une relation 1 à 1/0 pour réduire la taille de la table centrale. Par exemple, une table Person qui inclut des informations d'adresse peut être extraite d'une table PersonAddress.

Partitionner la table peut améliorer les performances s'il y a un grand nombre de lignes et vous pouvez déterminer que certaines lignes, peut-être avec un certain ancien datetime de quelques années dans le passé, seraient rarement interrogées.

Mise à jour: Voir "Demandez-vous pourquoi tant d'attributes sont interrogés et comment ils sont présentés?" au dessus. Considérons qu'un user veut connaître le nombre de ventes groupées par année, département et produit. Vous devez avoir des identifiants pour chacun d'entre eux afin que vous puissiez simplement les regrouper par ces ID sur la table centrale et dans une requête externe, searchr des jointures pour seulement les colonnes qui restnt. Cela garantit que l'agrégation n'a pas besoin d'extraire des informations inutiles des searchs qui ne sont pas nécessaires de toute façon.

Si vous n'effectuez pas d'agrégations, vous n'interrogez probablement pas un grand nombre d'loggings à la fois. Les performances de la jointure sont donc less importantes et doivent être sockets en charge avec les index appropriés.

Si vous interrogez un grand nombre de documents à la fois en y intégrant toutes les informations, j'examinerai attentivement l'parsing de rentabilisation. Personne ne s'assied à son bureau et ouvre un rapport contenant un million de lignes et 100 colonnes et il fait quelque chose de significatif avec toutes ces données, qui ne pourrait pas être accompli d'une meilleure manière.

Le seul cas d'une telle requête est un vidage de toutes datatables destinées à être exscopes vers un autre système, auquel cas les performances ne devraient pas être aussi préoccupantes qu'elles peuvent l'être du jour au lendemain.

Puisque vous êtes sur votre path. vous pouvez envisager de dupliquer des données afin de joindre less de time de la même manière que ce qui est fait dans la database olap.

http://en.wikipedia.org/wiki/OLAP_cube

Cela dit, je ne pense pas que ce soit la meilleure façon de le faire si vous avez 100 propriétés.

Avez-vous essayé de l'exporter vers Microsoft Excel Power Pivot avec Power Query? vous pouvez faire une parsing de données rapide avec des moyens assez printingnants pour l'afficher avec Power view