SQL Server-Verfügbarkeitsproblem: Große Abfrage verhindert die Verbindung anderer Verbindungen

SQL Server-Verfügbarkeitsproblem: Große Abfrage verhindert die Verbindung anderer Verbindungen

Ich habe einen High-Spec-Server (Multicore, RAID), auf dem MS SQL 2008 läuft und auf dem sich mehrere Datenbanken befinden. Ich habe einen Prozess mit geringem Durchsatz, der regelmäßig eine kleine Menge an Informationen von einer der Datenbanken benötigt, und der Code scheint einwandfrei zu funktionieren.

Wenn jedoch einer meiner Kollegen manchmal eine umfangreiche Abfrage an eine der anderen Datenbanken stellt, wird die CPU des Computers voll ausgelastet und es kommt zu Zeitüberschreitungen bei den Verbindungen meiner App.

Warum passiert das? Ich hätte gedacht, dass die vielen Kerne und Festplatten irgendwie (zusammen mit einem clever geschriebenen DB-Server) in der Lage wären, zumindest einen Teil der Ressourcen für andere Anwendungen freizuhalten? Ich bin ziemlich sicher, dass er für seine Abfrage nicht mehrere Verbindungen verwendet.

Was kann ich tun, um dies zu verhindern?

BEARBEITEN

Ich weiß nicht viel über die Hardware. Es werden normale Festplatten verwendet, RAID-gestützt, mit Server 2k3. Es ist ein HP, der vielleicht ein paar Jahre alt ist. Im Grunde ergibt es für mich keinen Sinn, dass die Hardware das Problem ist, also dachte ich, ich hätte vielleicht etwas falsch konfiguriert?

Antwort1

Das bedeutet, dass Ihre Abfrage weit unter dem Optimum liegt. Die üblichen Verdächtigen:

  • keine oder fehlerhafte Indizes
  • Funktionen auf Spalten in WHERE-Klausel (= ignorierte Indizes)
  • Datentypkonvertierungen/Priorität (= ignorierte Indizes)
  • Skalare UDFs mit Tabellenzugriff in SELECT-Klauseln (= CURSOR-Effekt)
  • Ansichten abfragen/verbinden mit Ansichten (Eine Ansicht ist ein Makro, das erweitert wird)

Es könnte sich auch um ein einfaches Ressourcenproblem handeln: Berühren die zurückgegebenen Daten die gesamte Datenbank, sodass zu viel Speicher verwendet wird, sodass es zu Paging kommt? Oder kommt es zu ASYNC_NETWORK_IO-Wartezeiten, was bedeuten kann, dass der Client die Ergebnisse nicht so schnell akzeptiert, wie er sollte?

Wenn Sie einen Server voll auslasten, liegt das im Allgemeinen an schlechtem Code und/oder Design und nicht an der DB-Engine.

Antwort2

Wenn Sie sicher sind, dass Sie alles so weit wie möglich optimiert haben, sollten Sie sich Ihre Einstellungen für Parallelität ansehen. Standardmäßig werden alle Prozessoren für parallele Abfragen verwendet. Sie können die Einstellung je nach Anzahl Ihrer Prozessoren auf eine niedrigere Zahl ändern. Die Ausführung der Abfrage kann etwas länger dauern, sollte aber noch genügend Rechenleistung übrig lassen, um Anmeldeanforderungen zu bearbeiten. Wenn das Problem auf diese eine Abfrage beschränkt ist, können Sie, anstatt eine systemweite Einstellungsänderung vorzunehmen, Ihren Kollegen bitten, seine Abfrage zu ändern, indem er eine MAXDOP-Option hinzufügt, um zu sehen, ob das hilft.

verwandte Informationen