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: p> 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: p> puis recherchez à l'aide de: p> < Pré> xxx pré> 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? P> p>
3 Réponses :
Vous pouvez construire la table en imputant la table d'origine: 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. P> p>
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 retours strong> p> edit - si 2016+ ... JSON STRUT> P> , éléments xsinil code> 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
Une autre option juste pour le plaisir si 2016+ utilisez JSON strud> p> si P> EmpID EmpName Salary Location
2 Jane 120 New York
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/...
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.