SQL Server 2005-Blocking Problem (ASYNC_NETWORK_IO)

Ich bin verantwortlich für die Anwendung eines Drittanbieters (kein Zugriff auf Quellcode), auf dem IIS ausgeführt wird und SQL Server 2005 (500 gleichzeitige Nutzer, 1-TB-Daten, 8-IIS-Server). Wir haben vor kurzem damit begonnen, um zu sehen, signifikante blockieren auf der Datenbank (nach Monaten läuft diese Anwendung in der Produktion mit keine Probleme). Dies geschieht in zufälligen Abständen während des Tages, etwa alle 30 Minuten, und betrifft zwischen 20 und 100 Sitzungen jedes mal. Alle Sitzungen, die dann auf die Anwendung time-out und die Sitzungen abzubrechen.

Verschwindet das problem und dann nach und nach wieder auftaucht. Die SPID verantwortlich für die Sperrung immer hat die folgenden Besonderheiten:

  • WARTEN TYPE = ASYNC_NETWORK_IO
  • Der SQL ausgeführt wird, “(@claimid
    varchar(15))WÄHLEN Sie claimid, enrollid,
    status, orgclaimid, resubclaimid,
    primaryclaimid VON Anspruch WO
    primaryclaimid = @claimid UND
    primaryclaimid <> claimid)". Dies ist
    relativ Harmlose SQL sollte
    nur ein oder zwei Sätze, nicht einer
    für große datasets.
  • KEINE ANDERE SQL-Anweisungen wurden
    Verwicklung in die Sperrung, die nur diese
    SQL-Anweisung.
  • Dies ist die parametrisierte SQL für die
    ein Ausführungsplan im Cache
    sys.dm_exec_cached_plans.
  • Diese SPID hat eine Objekt-Ebene S-Sperre auf die Tabelle behaupten, also alle UPDATEs/INSERTs zu der Behauptung Tabelle sind auch gesperrt werden.
  • HOST-ID variiert. Verschiedene web-Server sind verantwortlich für die Sperrung Sitzungen. E. g., manchmal Folgen wir zurück zum web-server 1, manchmal web-server 2.

Wenn wir zurückverfolgen, um den web-server Verwicklung in die Sperrung, sehen wir das folgende:

  • Es gibt immer irgendeine Art von
    Anwendungs-bezogene Fehler in der
    Ereignis-Protokoll auf dem web-server verknüpft
    die Host-ID und Host-Prozess-ID
    aus der SQL-Sitzung.
  • Die Fehlermeldungen variieren, in der Regel einige
    Art SystemOutofMemory. (Diese
    Fehlermeldungen scheinen ähnlich zu sein
    Fehlermeldungen, die wir gesehen haben
    der Vergangenheit ohne solche dramatischen
    Folgen. Wir denken, war passiert
    vor, aber nicht dazu führen, zu blockieren.
    Warum jetzt?)
  • Keine bekannten Probleme mit dem Netzwerk
    Adapter, die entweder auf dem Webserver oder
    der SQL-server.

(In jedem Fall der Datensatz zurückgegeben, die durch die problematische Abfrage wäre klein.)

Dinge ausgeschlossen:

  • Indizes werden regelmäßig defragmentiert.
  • Statistik regelmäßig aktualisiert werden.
  • Erhöhten Stichprobenumfang von Statistiken
    auf Anspruch.primaryclaimid.
  • Erzwungene Neukompilierung des zwischengespeicherten
    Ausführungsplan.
  • Erstellt einen zusammengesetzten index mit
    primaryclaimid, claimid.
  • Keine Netzwerkprobleme.
  • Keine Probleme bekannt, die auf den web-server.
  • Keine änderungen an Anwendungs-software auf
    web-Servern.

Wir vermuten, dass die Kette von Ereignissen geht so etwas wie dieses:

  1. Web-server-Prozess sendet SQL
    oben.
  2. SQL server führt die SQL -, während
    das es eine Sperre auf der
    Forderung Tisch.
  3. Web-server-Prozess einen Fehler erhält, und
    stirbt.
  4. SQL server-Sitzung reagiert, warten
    für die web-server-Prozess zu Lesen
    die Daten gesetzt werden.
  5. SQL-Server-Sitzungen, die erforderlich zu erhalten
    X-sperren auf Teile der Forderung in der Tabelle
    (jeder, der Verarbeitung Ansprüche)
    blockiert durch die Sperre auf die Forderung
    Tabelle und bleiben gesperrt, bis Sie
    alle Treffer der Anwendung time-out.

Anregungen für die Fehlersuche während der Wartezeit für den Verkäufer-Hilfe wäre sehr willkommen.

Gibt es eine Möglichkeit zu zwingen, die SQL Server sperren auf Zeilen - /Seiten-Ebene für diese bestimmten SQL-Anweisung nur?
Gibt es eine Möglichkeit, einen Schwellenwert festlegen auf ASYNC_NETWORK_IO wartet nur?

InformationsquelleAutor ivankolo | 2010-03-12

Schreibe einen Kommentar