0
votes

Créer un format différent pour une table

J'ai une table avec plus de 500 colonnes, créée de manière dynamique et nommée par l'utilisateur. Les nouvelles colonnes peuvent être créées par l'utilisateur, mais aucune ne peut être supprimée.

On m'a donné la tâche pour programmer une recherche par mot-clé qui recherche dans toutes les colonnes pour une chaîne spécifique et renvoie l'identifiant de cet enregistrement. Comme vous pouvez l'imaginer, la requête ressemble actuellement à quelque chose comme: xxx

Il est incroyablement lent. Pour lutter contre cela, j'essaie de créer une autre table, où ces données sont stockées dans un format différent, comme celui-ci: xxx

puis recherchez à l'aide de: < Pré> xxx

Je peux exporter toutes les données et le formater et l'insérer dans la nouvelle table. Mais comment puis-je continuer à garder la nouvelle table mise à jour? Est-il possible d'avoir des déclencheurs qui insérer / mettre à jour automatiquement la nouvelle table lorsque l'original est modifié? Même si je ne connais pas les noms de colonne avant la main?


2 commentaires

Avez-vous envisagé un index de texte complet?


@Dalek cela fonctionnerait-il même s'il existe de nombreuses colonnes que je veux effectuer une recherche à travers? J'ai supposé qu'un indice de tout type ne serait pas une bonne solution, car il y a des centaines de colonnes, et plus sont ajoutées au fil du temps par l'utilisateur.


3 Réponses :


1
votes

Vous pouvez construire la table en imputant la table d'origine: xxx

Vous pouvez alors le garder à jour avec insertion et supprimer des déclencheurs pour les données existantes. Ensuite, vous aurez besoin de déclencheurs DDL pour gérer les utilisateurs ajoutant de nouvelles colonnes.


0 commentaires

1
votes

On dirait que vous recherchez un modèle EAV.

Voici une approche qui ne vous oblige pas à répertorier les 500 colonnes. P>

Divulgation complète: Ceci n'est pas recommandé pour d'énormes tables. L'impublisme est plus performant fort>. p>

Notez également que si vous ne voulez pas que les valeurs nullules retirent , éléments xsinil code> p>

Exemple strong> p> xxx pré>

retours strong> p> xxx pré>

edit - si 2016+ ... JSON STRUT> P>

Select A.[EmpID]
      ,Attribute = B.[Key]
      ,Value     = B.[Value]
 From  @YourTable A
 Cross Apply ( Select * From OpenJson((Select A.* For JSON Path,Without_Array_Wrapper )) ) B


0 commentaires

2
votes

Une autre option juste pour le plaisir xxx pré>

si 2016+ utilisez JSON strud> p> xxx pré>

si P>

EmpID   EmpName Salary  Location
2       Jane    120     New York


6 commentaires

Les deux déclarations de sélection ont effectivement fonctionné assez bien et n'ont pas pris trop de temps pour exécuter. Jusqu'à présent, c'est la solution idéale car elle ne nécessite aucune tables supplémentaire ni rien. Cependant, j'ai aussi besoin de trouver une méthode compatible avec Oracle. Y a-t-il un moyen de le faire à Oracle aussi?


@ Essamal-mansouri n'est pas un oracle. Si cela aide, les XML et JSON ne sont que des chaînes formatées de l'enregistrement.


La version JSON est-elle plus rapide que XML? Pourquoi l'utiliserai-je au lieu de la version XML si la version XML est compatible avec les anciens serveurs SQL aussi?


@ Essamal-mansouri Le Json est un coup de pouce plus rapide, mais qui s'appliquera à 2016+ pendant que le XML prendra en charge la 2005+


Est-il possible de ne pas inclure les noms de colonne dans la recherche? Par exemple, si l'une des colonnes est nommée Jane, les lignes avec n'importe quelle valeur dans cette colonne finissent par apparaître dans les résultats. Je veux seulement rechercher les valeurs. Comment allais-je aller à ce sujet?


@ Essamal-mansouri Il est possible (je pense), mais la performance souffrirait de façon spectaculaire. Les deux méthodes devraient analyser le JSON ou XML et une sorte de chaîne_agg () La fonction suivante créera une chaîne de l'enregistrement (délimité ou non) Stackoverflow.com/Questtions/60130261/...