2016-04-05 13 views
4

Gestern hatte ich diese seltsame (nie zuvor gesehen) Situation, wenn Sie einen Patch auf mehrere Datenbanken von SQL Server Management Studio anwenden. Ich musste eine große Tabelle (5 Millionen Datensätze) über mehrere Datenbanken aktualisieren. Die Anweisung, die ich pro Datenbank abgab, war etwas wie:SQL Server gibt Ergebnis sofort zurück

set rowcount 100000 
select 1 
while @@rowcount > 1 
    update table 
    set column = newval 
    where column is null 

Diese Anweisungen liefen für einige Sekunden (irgendwo zwischen 2 und 30 Sekunden). Auf einer zweiten Registerkarte habe ich diese Abfrage ausgeführt:

select count(*) 
    from table 
    where column is null 

Nur um zu überprüfen, wie viele Zeilen bereits verarbeitet wurden. Ungeduldig wie ich bin, habe ich F5 für die Anzahl (*) Aussagen alle 20 Sekunden oder so gedrückt. Und das - erwartete Verhalten - war, dass ich auf etwas im Bereich von 0 bis 30 Sekunden warten musste, bevor der Count (*) berechnet wurde. Ich erwartete dieses Verhalten, da die update-Anweisung ausgeführt wurde, so dass der count (*) als nächstes in der Zeile war.

Aber dann nach einer Datenbank oder 10 ist diese seltsame Sache passiert. Ich öffnete die nächste Datenbank (änderte die Datenbank über USE) und nach Drücken von F5 reagierte die Zählung (*) sofort. Und nach erneutem Drücken von F5, direktes Ergebnis, aber ohne Fortschritt, und immer wieder hat sich die Zählung (*) nicht geändert. Das Update wurde jedoch ausgeführt.

Und dann nach n-ten drücken, die Anzahl (*) sank mit genau 100K Datensätze. Ich habe F5 erneut gedrückt, sofortiges Ergebnis ... und so weiter und so weiter ... WARUM? war nicht die Zählung (*) warten ... Ich durfte nicht schmutzig lesen oder ....

Nur diese Datenbank gab mir dieses Verhalten. Und ich habe wirklich keine Ahnung, was das verursacht.

Zwischen Switching-Datenbank habe ich keine andere Registerkarte geschlossen oder geöffnet, so dass das einzige, was ich mir vorstellen kann, ist, dass die Verbindungsparameter für diese eine Datenbank unterschiedlich sind. Aber ich übersehe diese ... aber ich finde keinen Unterschied.

+0

Vielleicht hat diese Datenbank eine andere Isolationsstufe? –

+2

Überprüfen Sie die Datenbankeinstellungen. Vielleicht ist das Read Committed Snapshot oder/Snapshot Isolation Level aktiviert? – Jeffrey

+0

Um ehrlich zu sein: Was du machst ist etwas was du nicht tun solltest, ungeduldig oder nicht ... Vor allem: Schleifen sind * böse, langsam und böse * und ich bezweifle, dass du sie wirklich brauchst (könnte deine tatsächliche Aussage zeigen) . Zweitens ist das Überprüfen des Fortschritts mit einer zweiten Verbindung wie - ähm - Ziehen von Gras, um es schneller wachsen zu lassen :-) Deine Anrufe sind nichts anderes als störend und Dinge langsamer zu machen. Besser gehen Sie auf einen Kaffee :-) – Shnugo

Antwort

0

was ich aus Ihrer Beschreibung oben verstanden habe, ist, dass Sie das Ergebnis von count () nicht richtig auf einer bestimmten Datenbank erhalten haben. Wenn das der Fall ist, dann, bitte das folgende Skript verwenden, statt Ihrer Zählung ()

SELECT 
COUNT(1) 
FROM Table WITH(NOLOCK) 
WHERE Column IS NULL 

Da count (*) nimmt mehr Zeit auszuführen. und als Ihre Anforderung ist, nur die Anzahl zu wissen Verwenden Sie Anzahl (1) statt

Auch gibt es eine Möglichkeit der Sperre in der Datenbank, wenn Sie Transaktionen verwenden. Verwenden Sie also WITH (NOLOCK), um eine solche Blockierung zu vermeiden und das Ergebnis schneller zu erhalten.

Verwandte Themen