2017-10-03 1 views
0

Ich habe sucht ein Tisch wie:Aktualisieren von Spalten in derselben Tabelle mit parallel laufenden Stored Procedures

Key Customer Attr1 Attr2 Attr3 Attr4 Attr5 ...  Attr70 
123 Smith  NULL NULL NULL NULL NULL ...  NULL 
456 Wesson NULL NULL NULL NULL NULL ...  NULL 
.... 

Diese Tabelle einige (ca. 3) Millionen von Zeilen.
Jedes Attribut verfügt über eine eigene gespeicherte Prozedur mit einer Berechnungslogik zum Füllen dieser Spalte.

Derzeit diese gespeicherten Prozeduren ausgeführt werden serielle und eine ganze Weile dauern. Sie sind ausgeführt wie: EXEC dbo.fill_Attr1 @Customer = 'Smith'

ich diese gespeicherten Prozeduren hatte laufen parallel (gestartet von einem Job-Scheduling-Tool), aber leider hin und wieder DEADLOCKS passiert ist.

Was ist die beste Praxis alle (oder zumindest einige) dieser SPs parallel zu machen?
Ich dachte darüber nach WITH (NOLOCK) hinzuzufügen - was ich lese ist keine gute Praxis.
Da dies jedoch in einem Batch-Prozess geschieht, konnte ich garantieren, dass kein anderer Prozess Daten ändert oder Daten einfügt, während diese SPs laufen.

Zusätzliche Informationen, um die Frage klarer zu machen.
Derzeit diese SPs laufen Serien wie:

EXEC dbo.fill_Attr1 @Customer = 'Smith' 
EXEC dbo.fill_Attr1 @Customer = 'Wesson' 
EXEC dbo.fill_Attr2 @Customer = 'Smith' 
EXEC dbo.fill_Attr2 @Customer = 'Wesson' 
EXEC dbo.fill_Attr3 @Customer = 'Smith' 
EXEC dbo.fill_Attr3 @Customer = 'Wesson' 

Jede gespeicherte Prozedur aktualisiert immer alle Aufzeichnungen eines Kunden.
Abhängig von der Logik, wie das Attribut berechnet wird, kann dies in einem einzelnen Update oder - falls komplexere Logik - in mehreren Aktualisierungen innerhalb der gespeicherten Prozedur erfolgen.

Gibt es eine bessere Idee, wie man es löst?

Vielen Dank im Voraus
Stefan

+0

ich nicht bekommen, wie es funktioniert: EXEC dbo.fill_Attr1 @Customer = ‚Smith‘, die Pflege von attr1 für Smith nimmt, und das ist es. Also dauert es 70 * 3.000.000 oder 210.000.000 Aufrufe, um die Tabelle zu aktualisieren? –

+0

Können Sie die Logik so ändern, dass nur eine Prozedur verwendet wird und die Aktualisierung für alle Spalten auf einmal angewendet wird? –

+0

@LeeEverest: Nein, für jedes Attribut gibt es eine gespeicherte Prozedur. Insgesamt gibt es 70 SPs –

Antwort

0

ich proc umschreiben würde ganze Spalte, nicht nur einen Benutzer/Person/Kunden 'Smith' zu aktualisieren.

+0

Dies ist ein Kommentar, keine Lösung. Die gespeicherte Prozedur aktualisiert bereits ALLE Datensätze eines Kunden, wie in einem Kommentar oben erwähnt. nicht nur ein einziger Datensatz. –

+0

Ich bin nicht sicher, dass Sie mir folgen - Sie sagen ALLE Datensätze eines Kunden. Ich sage alle Datensätze von allen Kunden in der Spalte. Wir auf der gleichen Seite? –

+0

Ich bekomme dich. Aber das ist nicht möglich. Wenn die Daten was benötigt wird, um die Attribute zu schätzen, ist für einen Kunden bereit, es ist möglicherweise nicht für einen anderen Kunden bereit, da sie von verschiedenen Vorsystemen kommen und nicht gleichzeitig geliefert werden, deshalb haben die gespeicherten Prozeduren die Parameter Kunde: Also: Kunde A ist bereit, die Kette der 70 SPs beginnt bereits, vielleicht sind ein paar Minuten später die Daten für Kunde B schon fertig, jetzt wird 'seine' Kette von 70 SPs starten, wenn diese mehr als eine SP haben Kunden laufen zur gleichen Zeit, es wird Deadlocks produzieren. –