J'ai une table en SQL contenant datatables d'alarme d'un système iFix SCADA conçu comme suit:
CREATE TABLE [dbo].[FIXALARMS]( [ALM_ID] [int] IDENTITY(1,1) NOT NULL, [ALM_NATIVETIMEIN] [datetime] NOT NULL, [ALM_PHYSLNODE] [char](8) NOT NULL, [ALM_TAGNAME] [varchar](32) NOT NULL, [ALM_VALUE] [varchar](16) NOT NULL, [ALM_MSGTYPE] [varchar](8) NOT NULL, [ALM_DESCR] [varchar](128) NOT NULL, [ALM_ALMSTATUS] [varchar](4) NOT NULL, [ALM_ALMPRIORITY] [varchar](8) NOT NULL, [ALM_ALMAREA] [varchar](32) NOT NULL, )
Le SCADA désigne ce que les colonnes doivent être nommées et les types de données et ne donne aucune autre option pour split datatables en plusieurs tables. À peu près, je serai obligé de prendre des informations dans ce format et c'est devenu très pénible car beaucoup de mes requêtes utilisent des comparaisons de type et de strings multiples sur des données qui devraient vraiment être identifiées.
Maintenant, je voudrais normaliser cette table et la split en plusieurs tables avec des relations clavées afin que je puisse sauvegarder l'espace de database, interroger les performances, et append un peu de flexibilité.
Cela serait-il mieux réalisé en utilisant des triggersurs de database? La database est en croissance à environ 40 Mo / jour (~ 300k lignes) et mon manque d'expérience SQL me fait craindre d'append une charge supplémentaire au server lors de l'ajout d'une input. Au lieu de cela devrais-je utiliser un agent pour nettoyer la table de time en time? Quelles seraient les autres options que je ne connais peut-être pas?
Si vous n'avez pas besoin de données en time réel, utilisez SSIS pour configurer un process ETl afin de transformer datatables en votre forme normalisée.
Si vous devez disposer des données en time réel, utilisez des triggersurs, mais utilisez-les très soigneusement et assurez-vous qu'ils traitent des sets de données. Les triggersurs de server Sql ne devraient jamais être supposés manipuler seulement une rangée de données. Vous voudrez vous assurer que votre code de triggersment est aussi performant que possible car vous avez une table de saisie de données élevée dont vous saisissez datatables. Cela signifie que vous devez lire un bon livre sur les techniques d'optimization des performances, de sorte que vous sachiez quelles forms de requête éviter d'utiliser telles que les sous-requêtes corrélées, les clauses non-sargable where, les sliders. Vous voudrez aussi tester à charge pour les problèmes de blocage.
Les triggersurs vont append une surcharge de traitement et éventuellement introduire des verrous de contention et de transaction. Si les requêtes complexes ne sont pas exécutées avec des données complètes à la minute près, vous pouvez vous en sortir avec un process ETL régulièrement planifié qui extrait datatables et les convertit en un formulaire plus utilisable. Vous pouvez programmer l'ETL pour qu'il s'exécute tous les jours ou toutes les quelques heures, selon les besoins.
En supposant que vous allez avec un triggersur, très probablement, il va briser datatables entrantes dans plusieurs tables, non? C'est une approche viable. Si datatables entrantes correspondent au schéma de cette table, vous effectuez un sortinggger "régulier". Considérez les triggersurs INSTEAD OF, si le schéma de données entrant ne correspond pas parfaitement à votre schéma.
Dans tous les cas, dans votre triggersur, vous devrez générer des keys pendant certains INSERT et les réutiliser dans d'autres. Quelques bonnes pratiques sont de garder votre triggersur logique de l'entreprise libre – seulement faire des choses RDBMS dedans. Tenez également count de la manière dont vous générez et relisez les keys – méfiez-vous de la contamination de la scope. Enfin, tenez count de vos niveaux d'isolation des transactions et gardez les choses aussi rapidement que possible pour contrôler votre débit.