Question

Ma base de données a une table: TABLEx.

Task1 rend INSERTs intensifs (1000 enregistrements par minute) sous forme d'enregistrements à traiter et très rarement mises à jour (1-2 enregistrements par minute) sous forme d'enregistrements à recalculer.

En même temps, autre Task2 SELECTs non traitées enregistrements (inséré par Task1), puis insère de nouveaux enregistrements (comme traité) au même TABLEx une transaction (il est trop long calcul, jusqu'à 10 secondes).

Task3 recalcule MISE À JOUR (dossiers par Task1). UPDATEs juste TABLEx

Quelqu'un pourrait-il recommander la conception pour éviter les longs verrouillage et pour ce scénario blocages. Il est très important de traiter tous les dossiers INSÉRÉES afin que son ont été insérés!

1) Devrais-je séparer (créer un nouveau tableX2) traitées et les dossiers non traités?

2) Si je transaction séparée Task1 et faire CHOISISSE INSERTs dans deux séparés transactions?

3) l'utilisation Devrais-je tolet, readpast ... conseils et où (peut-il me aider)?

Était-ce utile?

La solution

Simple celui-ci.

Task1 ne doit pas insérer dans la table principale, mais une table de mise en scène, par exemple tableXstaging. Ce tableau doit soit inclure une colonne d'identité ou d'une colonne row_processed (TINYINT ou BIT).

Task1 garde d'insérer tout le temps dans tableXstaging. Je suis d'avis des mises à jour de mettre à jour la table principale directement comme ils sont rares.

Une autre tâche qui se déroule une fois par minute sera soit: régler la maxid = max (colonne d'identité) de tableXstaging, ou si vous plutôt utilisé row_processed, set row_processed = 1. Cela vous donne le lot à travailler avec. Cette tâche insérera dans TABLEx tous les dossiers où l'identité <= maxid, ou si vous utilisez row_processed, OU row_processed = 1. simple insérer dans votre TABLEx primaire est très rapide. Ensuite, supprimez de tableXstaging où row_processed = 1, ou où l'identité <= maxid. Je voudrais aller à l'identité que vous ne avez pas besoin de mise à jour row_processed = 1 où row_processed = 0, et sera donc plus rapide.

TABLEx est maintenant seulement inséré dans une fois par minute.

re-lecture En fait, votre question, je partirais avec row_processed, ensemble row_processed = 1 pour votre premier lot.

Tâche 2 ouvrages sur la table de mise en scène OU row_processed = 1. Ensuite ensembles row_processed = 2.

Tâche 3 travaux sur la table de mise en scène OU row_processed = 2. définit ensuite row_processed = 3.

Enfin, SET XACT_ABORT ON; BEGIN TRAN, vous insérez les enregistrements dans TABLEx en un seul coup (row_processed = 3). Ceci est très efficace que la table de mise en scène est minuscule, et TABLEx sera assez grand et lent (par des termes relatifs à la table de mise en scène). Ensuite, supprimer de la mise en scène où row_processed = 3. COMMIT;

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top