In SQL Azure habe ich eine Tabelle mehr oder weniger so eingerichtet, mit zwei berechneten Spalten ( IsExpired
und IsDeadlineExpired
), die einfach nicht-nullable datetime Spalten mit der aktuellen Zeit vergleichen:
Ich habe eine gespeicherte Prozedur mit mehreren Resultsets, von denen eines zieht:
%Vor% Ich habe kürzlich Fehlerprotokolle bemerkt, die anzeigen, dass manchmal, wenn die Ergebnismenge mit SqlDataReader
gelesen wird, SqlDataReader.GetOrdinal("IsExpired")
mit IndexOutOfRangeException
fehlschlägt. Ich weiß, dass die vorhergehenden Spalten auch in diesen Fällen gut funktionieren, da sie in den vorhergehenden Codezeilen ohne Fehler gelesen werden. Ich glaube auch, dass die Ergebnismengen der Prozedur in der richtigen Reihenfolge sind, da sie keine Spaltennamen teilen (andernfalls würde das Lesen der früheren Spalten in ähnlicher Weise fehlschlagen).
Außerdem: die meiste Zeit scheint alles perfekt zu funktionieren.
Kann das irgendwie auf vorübergehende Azure-Fehler zurückgeführt werden?
Wenn wir uns einige alte Protokolle ansehen, haben wir uns auf die Schlussfolgerung geeinigt, dass dieser Fehler nur dann auftritt, wenn die Abfragen während der Bereitstellung eines DACPAC gleichzeitig ausgeführt wurden (als Teil unserer automatisierten Bereitstellungen für diese spezielle Testumgebung).
Ich nehme an, dass das Schema während der DACPAC-Bereitstellung nicht unbedingt in einem zuverlässigen Zustand ist.
Seitdem haben wir Code hinzugefügt, um die App während der Bereitstellung in einen "Wartungsmodus" zu versetzen (selbst diese automatisierten). Dies scheint das Problem zu mildern.
Bitte lesen Sie diesen Artikel: SELECT * UND SQL Azure .
Der Autor empfiehlt dringend,
zu ersetzen %Vor%mit
%Vor%weil Die Verwendung von SELECT * kann zu einem zusätzlichen Paging, RFID-Lookups und nicht benötigten Tabellensperren führen und verhindert zukünftige Versuche, einen Covered Index zu erstellen. Zusammenfassend ist es schlecht für die Leistung .
Übrigens: Hier haben Sie eine Reihe interessanter Artikel:
Ich vermute, dass GetOrdinary ("IsExpired") System.IndexOutOfRangeException wegen des obigen Verhaltens von MS SQL Azure Framework.
Fazit? Verwenden Sie die SELECT -Anweisung mit einer definierten Liste von Spalten, um die Leistung der SQL Azure-Datenbank zu verbessern und die IndexOutOfRange-Ausnahme zu vermeiden.
Tags und Links sql azure azure-sql-database