Die SQL Express-Client-memoryverwendung unterscheidet sich von der Verwendung von SQL Enterprise-Client-memory

Ich erlebe einen großen Unterschied in .Net Anwendung memory Nutzung mit der gleichen App gegen zwei Kopien der gleichen database. Der einzige Unterschied ist, dass in Szenario 1 Ich bin mit einer lokalen Kopie der database registriert, um eine Instanz von SQL server 2005 Express – und in Szenario 2 Ich verwende eine Remote-Kopie der database registriert in einer Instanz von SQL server 2008 Enterprise .

Meines Wissens würde ich nur einen Unterschied in der SQL-Performance und SQL-memory-Nutzung erwarten (seit Express hat eine 1GB-Grenze).

Aber – was ich sehe, ist ein enormer Unterschied (1GB) memorybedarf zwischen ihnen – also das SQL Express Szenario mit 1GB mehr memory meistens. SQL Express scheint auch viel langsamer zu sein, besonders mit großen Tischen und großen Abfragen zu arbeiten – aber ich würde erwarten, dass dieser Gedächtnisschlag in SQL und nicht auf meiner verbrauchenden / Client-Anwendung ist ???

Die App verbindet sich mit dem SQL server unter System.Data.SqlClient.SqlConnection und führt häufig SqlCommand und SqlBulkCopy Operationen aus.

Irgendwelche hilfreichen Gedanken würden sehr geschätzt!

Für Sie zweite Frage über langsame Express auf große Tische und Abfragen, das ist normal, weil Express-Version verbraucht mehr memory und Festplatte als Enterprise-Version. Die Enterprise-Version verwendet eine function namens Enhanched-Read-ahead und Scan (aka Merry-go-round-Scans), die einen enormen Unterschied in der performance von großen Abfragen hat.

Beispielsweise:

Angenommen, UserA und UserB geben beide den Befehl SELECT * FROM Customer , der zu einem Tabellenscan führt. UserA gibt zuerst den Befehl aus. UserB gibt den Befehl 20 Sekunden später aus. Der Tisch hat 100 Millionen Zeilen (es ist ein sehr großer Tisch), und der Scan läuft auf einer Maschine, auf der keine Enterprise Edition installiert ist. Der Tabellenscan für UserA beginnt, die Kundentabelle auf der ersten Seite der Tabelle zu lesen. Zwanzig Sekunden später beginnt der Scan für UserB, Seiten zu lesen, die UserA bereits gelesen hat, obwohl einige der Seiten bereits aus dem Cache zurückgespült wurden. Manchmal schafft dieser process enorme Scheibenkonflikte und zieht auf Gedächtnis.

Die Enterprise Edition führt eine erweiterte Read-Ahead und Scan ein wenig anders. Anders als bei den nicht Enterprise Edition-Versionen, wenn UserA den Befehl SELECT * FROM Customer ausgibt, beginnt die Enterprise Edition mit dem Scannen der Kundentabelle. Wenn UserB denselben Befehl 20 Sekunden später ausgibt, startet der Tabellenscan für UserB genau dort, wo UserA gerade liest. UserA und UserBs Abfragen lesen die letzte Seite der Customers-Tabelle etwa zur gleichen time, aber dann wird der Scan von UserB an den Anfang der Kundentabelle zurückkehren, um die Seiten zu scannen, die UserA gescannt hatte, bevor UserB seine Abfrage begann. Dieser process reduziert drastisch die Disk-Konkurrenz und die Auslosung des Gedächtnisses.