Berechnete Spalten fehlen manchmal in SELECT *

9

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:

%Vor%

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?

    
Mike Asdf 01.08.2013, 15:23
quelle

2 Antworten

0

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.

    
Mike Asdf 05.04.2016, 21:20
quelle
1

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:

  1. So erhalten Sie SQL Azure Query-Leistungsdaten
  2. Abfrage-Leistung
  3. Erste Schritte mit den Windows Azure-Tools für Visual Studio
  4. Erste Schritte mit der SQL Azure-Entwicklung
  5. Verbessern der I / O-Leistung
  6. Analysieren der Abfrageleistung ist mit SQL Azure jetzt einfacher geworden.

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.

    
Maciej Los 30.12.2013 08:09
quelle

Tags und Links