Cache Leerung bei Neustart verhindern

gerpara

Benutzer
Beiträge
7
Hallo zusammen,

es handelt sich bei mir um eine relativ kleine Datenbank (<200 MB, MSSQL 2005) welche immer nur von einem User (Monteursanwendung im Feld mit lokaler Datenbank auf Notebook) verwendet wird.

Dort ist nun aufgefallen, dass nach einem Systemneustart bzw.
CHECKPOINT; GO DBCC DROPCLEANBUFFERS; GO
die Ladezeiten überproportional hoch sind (statt <1 Sekunde schnell mal 20 Sekunden), bis sich das System nach einigen Abfragen wieder normalisiert hat.

In anderen Quellen habe ich bereits gelesen, dass bei jedem Neustart der Cache geleert wird (http://ask.sqlservercentral.com/questions/97279/performance-issue-after-restart.html, 2. Antwort).

Das Problem ist nun, dass an der Gegebenheit, dass das System neu gestartet wird, nichts zu ändern ist. Mein Gedanke war daher, das Leeren des Caches zu verhinden. Gute Idee, schlechte Idee?

Könnt ihr mir dabei helfen, diese Ladezeiten zu dezimieren? Gerne gebe ich euch noch weitere Infos.
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.520
Das Problem ist nun, dass an der Gegebenheit, dass das System neu gestartet wird, nichts zu ändern ist. Mein Gedanke war daher, das Leeren des Caches zu verhinden. Gute Idee, schlechte Idee?

Dir ist schon bekannt, was ein Cache ist? Falls nein: der liegt im RAM, und RAM ist auf der Flucht, ähm, flüchtig. Du verstehst?
 

gerpara

Benutzer
Beiträge
7
Mir geht es darum, die bereits kompilierten Queries etc. nicht durch einen Neustart zu verlieren. Mir ist allerdings (auch nach Recherche) kein Weg bekannt dies zu bewerkstelligen.

Das mit dem Cache ist mir bewusst, die Frage war nur falsch gestellt. Es geht mir darum oben genannte Daten zu erhalten. Ist das irgendwie möglich?
 

akretschmer

Datenbank-Guru
Beiträge
9.520
Mir geht es darum, die bereits kompilierten Queries etc. nicht durch einen Neustart zu verlieren. Mir ist allerdings (auch nach Recherche) kein Weg bekannt dies zu bewerkstelligen.

Das mit dem Cache ist mir bewusst, die Frage war nur falsch gestellt. Es geht mir darum oben genannte Daten zu erhalten. Ist das irgendwie möglich?

Okay ;-)

Ähm, für unter 200MB 20 Sekunden?

Code:
kretschmer@tux:~$ time dd if=testfile_200mb of=/dev/null
409600+0 Datensätze ein
409600+0 Datensätze aus
209715200 Bytes (210 MB) kopiert, 0,473096 s, 443 MB/s

real    0m0.475s
user    0m0.104s
sys     0m0.376s
kretschmer@tux:~$

Gut, das ist jetzt natürlich sequentielles und hochgradig dummes lesen am Block, aber das sollte auch bei random read nicht 20 sekunden dauern. Vielleicht mal bei Windoof-Experten nachfragen, woran das liegen kann.
 

gerpara

Benutzer
Beiträge
7
Dann würdest du die Datenbank als Ursache der zu Beginn höheren Ladezeiten und später niedrigeren Ladezeiten ausschließen? (Wenn möglich mit guter Begründung :)
 

Margit

Fleissiger Benutzer
Teammitglied
Beiträge
56
Dann würdest du die Datenbank als Ursache der zu Beginn höheren Ladezeiten und später niedrigeren Ladezeiten ausschließen? (Wenn möglich mit guter Begründung :)

Oft ist es eine schlecht designte Applikation, 20 Sekunden bei so einer kleinen Datenmenge klingt nach viel - zu viel.
 

akretschmer

Datenbank-Guru
Beiträge
9.520
Oft ist es eine schlecht designte Applikation, 20 Sekunden bei so einer kleinen Datenmenge klingt nach viel - zu viel.

Möglich, erklärt aber nicht zwingend, warum es erst lahmt und dann flott geht. Die Applikation hat i.d.R. keinen Einfluß auf das Cache-Verhalten der Datenbank und des OS. Ich denke, man sollte schauen, was in den 20 Sekunden nach dem Kaltstart passiert und wo es klemmt. Dauert das Laden von Pladde so lange oder erstellt die Applikation vielleicht erst einmal komplexe Abfragen. Aber, wie gesagt, bin ich nicht genug in der Materie (Windows, M$SQL)
 

Tommi

Datenbank-Guru
Beiträge
285
Hi,

mir ist ehrlich gesagt nicht so ganz klar, was mit "Ladezeit" gemeint ist. Wann tritt diese Verzögerung auf? Beim Anmelden, beim ersten Start der Applikation oder bei einer ersten echten Abfrage von Daten?

VG,
Tommi
 

gerpara

Benutzer
Beiträge
7
Zum Thema Anwendung: Bei einer größeren Auswertung über mehrere Datensätze hat die Anwendung insgesamt 250 Sekunden benötigt. Die teuersten Queries ergeben in der Summe 184 Sekunden. Von daher fallen über 70% der Ladezeit auf den SQL Server.

Jeder Datensatz besteht dabei aus mehreren Objekten. Das reicht von 19 bis hin zu 6700 Objekten pro Datensatz. Auffällig war nun, dass die Ladezeit pro Objekt (nicht pro Datensatz) im Laufe der Zeit (also nach dem Ausführen mehrerer Queries) kontinuierlich (fast linear) abnimmt. Habt ihr Ideen woran das liegen könnte?
 
Werbung:

gerpara

Benutzer
Beiträge
7
mir ist ehrlich gesagt nicht so ganz klar, was mit "Ladezeit" gemeint ist. Wann tritt diese Verzögerung auf? Beim Anmelden, beim ersten Start der Applikation oder bei einer ersten echten Abfrage von Daten?

Gut, dass du nachfrägst. Ladezeit habe ich folgendermaßen definiert: Die Anwendung ist bereits gestartet und der Nutzer hat eine Übersicht über alle Datensätze. Er kann nun per Rechts-Klick einen Datensatz öffnen. Ab dem Klick beginnt die Ladezeit. Im Hintergrund werden nun Daten vom SQL Server abgefragt und an die Anwendung übertragen (>=70 %) welche diese dann aufbereitet und dem Nutzer darstellt. Ist dieser Prozess beendet und kann der Nutzer wieder mit der Anwendung interagieren, so ist die Messung der Ladezeit beendet.

Ich sollte nochmal erwähnen, dass Netzwerke hier keine Rolle spielen sollten, da sich Server und Anwendung auf dem gleichen Notebook befinden.
 
Oben