2009-03-02 7 views
2

Ich betreibe eine Online-Fotografie-Community und es scheint, dass die Website zu einem Crawl auf Datenbankzugriff zieht, manchmal trifft Timeouts.SQL Server Wartungsvorschläge?

Ich betrachte mich als ziemlich kompetent schreiben SQL-Abfragen und Tabellen zu entwerfen, aber bin auf keinen Fall ein DBA ... daher das Problem.

Einige Hintergrundinformationen:

  1. Meine Website und SQL Server auf einem Remote-Host ausgeführt wird. Ich aktualisiere den ASP.NET-Code von Visual Studio und SQL über SQL Server Mgmt. Studio Express. Ich habe keinen physischen Zugriff auf den Server.

  2. Alle meine gespeicherten Procs (ich glaube, ich habe sie alle) sind in Transaktionen verpackt.

  3. Die Haupttabelle ist nur 9400 Datensätze zu dieser Zeit. Ich füge dieser Tabelle 12 neue Einträge hinzu.

  4. Es gibt eine Sicht auf diese Haupttabelle, die Daten aus mehreren anderen Tabellen in einer einzigen Ansicht zusammenfasst.

  5. sekundäre Tabellen sind kleinere Datensätze, aber mehr von ihnen. 70.000 in einem, 115.000 in einem anderen. Dies sind Kommentare und Bewertungen für die Elemente in # 3.

  6. Indizes sind auf den am meisten benötigten Feldern. Und ich habe sie an den großen Tischen auf Automatische Neuberechnung von Statistiken eingestellt.

Wenn die Seite zum Stillstand kommt, wenn ich Code ausführen, das Transaktionsprotokoll zu löschen, aktualisieren Statistik, den Wiederaufbau der Hauptansicht sowie den Wiederaufbau der gespeicherten Prozedur, um die Kommentare zu erhalten, die Geschwindigkeit zurückkehrt. Ich muss das aber manuell machen.

Leider sind meine Benutzer frustriert über diese Probleme und ihre Beteiligung schwindet.

Also meine Frage ist ... in einer entfernten Umgebung, was ist der beste Weg, um einen Wartungsplan einzurichten und zu planen, um meine SQL-Datenbank auf dem Höhepunkt zu halten ???

Vielen Dank! KLK

Antwort

0

Sie müssen Ihre Wartungsaufgaben nicht als Wartungsplan einrichten.

einfach eine gespeicherte Prozedur erstellen, die die Wartungsaufgaben ausführen möchten ausführt, Index neu erstellt, Statistiken Updates usw.

dann einen Job erstellen, die gespeicherte Prozedur/s aufruft. Der Job kann so konfiguriert werden, dass er nach dem von Ihnen gewünschten Zeitplan ausgeführt wird.

Verwenden Sie zum Erstellen eines Jobs die Prozedur sp_add_job.

Um einen Zeitplan zu erstellen, verwenden Sie die Prozedur sp_add_schedule.

Ich hoffe, was ich detailliert habe, ist klar und verständlich, aber fühlen Sie sich frei, mich eine Linie zu setzen, wenn Sie weitere Hilfe benötigen.

Cheers, John

+0

Warum in einer gespeicherten Prozedur anstelle einer Wartungsstelle? –

+0

Ich nehme an, das ursprüngliche Poster verwendet SQL Server Express, vorausgesetzt, sie verwenden SQL Server Mgmt Studio Express. SQL Server Express unterstützt keine Wartungspläne, da auch Integration Services installiert werden müssen. –

+0

Eigentlich ist die Datenbank SQL Server 2005. Mgmt Studio Express ist nur das Werkzeug, das ich verwende, um eine Verbindung zu meiner Remote-DB herzustellen. – klkitchens

2

Mein Bauch sagt man etwas falsch machen.Es klingt ein bisschen wie diese Geschichten, die man hören kann, wenn ein System nicht nachts hochfahren kann:

Etwas stimmt nicht mit Ihren Abfragen, die Anzahl der Zeilen ist fast immer irrelevant für die Performance und Ihre Datenbank ist sowieso sehr klein. Ich bin mit dem SQL-Server nicht sehr vertraut, aber ich kann mir vorstellen, dass es einige ziemlich nützliche Abfrageanalyse-Tools gibt. Ich stelle mir auch vor, dass es eine Möglichkeit gibt, langsame Abfragen zu protokollieren.

Ich höre wirklich, dass du einen fehlenden Index hast. Sicher, Sie denken vielleicht, Sie hätten die richtigen Indizes hinzugefügt, aber bis Sie die verwendeten Indizes überprüft haben, ist das egal. Vielleicht denken Sie, Sie haben die richtigen, aber Ihre Fragen deuten auf etwas anderes hin.

Zuerst, herauszufinden, wie Sie Ihre Abfragen protokollieren. Die Chancen stehen gut, dass Sie einen Killer haben, der einen sequenziellen Scan durchführt, den ein Index beheben würde.

Zweitens könnten Sie eine Reihe von kleinen Abfragen haben, die es stattdessen töten. Beispielsweise könnten Sie ein Objekt "Benutzer" haben, das die Datenbank jedes Mal trifft, wenn Sie einen Benutzernamen von einer Benutzer-ID nachschlagen. Suchen Sie nach Stellen, an denen Sie die Datenbank hundert Mal abfragen und durch einen Cache ersetzen - selbst wenn dieser "Cache" nichts anderes ist als eine private Variable, die am Ende einer Anfrage gelöscht wird.

Fazit ist, ich bezweifle wirklich, es ist etwas falsch in SQL Server konfiguriert. Ich meine, wenn Sie Ihren Server jede Nacht neu starten müssten, weil das System zum Stillstand kommt, würden Sie das System oder Ihren Code beschuldigen? Gleicher Deal hier ... lernen Sie die von SQL Server bereitgestellten Tools, ich wette, sie sind ziemlich glatt :-)

Das alles gesagt, sobald Sie akzeptieren, dass Sie etwas falsch machen, genießen Sie den Prozess. Nichts ist für mich besser, als langsame Datenbankabfragen zu optimieren. Es ist einfach erstaunlich, dass Sie eine Abfrage mit einer 10-Sekunden-Laufzeit erstellen und sie in eine mit einer 50 ms-Laufzeit mit einem einzigen, gut platzierten Index verwandeln können.

+0

Leider glaube ich nicht, dass das der Fall ist. Der Code läuft absolut gut und dann läuft der EXAKTAME CODE im Laufe der Zeit langsam. Es wird erst behoben, wenn ich die Indizes neu erstellt habe usw. Dann läuft es wieder blitzschnell ... – klkitchens

+0

Qualifizieren Sie sich im Laufe der Zeit, reden wir Wochen? Es ist nicht ungewöhnlich, bestimmte Tabellenindizes täglich neu zu indizieren. Die Art der Aktivität, die von Ihrer Anwendung generiert wird, bestimmt, wie schnell Ihre Indizes fragmentieren. –

+0

seltsam. Für welche Art von Aktivität muss der Index neu erstellt werden? Ich habe nie ein solches Problem gesehen, aber ich habe davon gehört. Eine Menge Updates für den Tisch? –