Ich habe eine Tabelle in SQL Server, die Dateien im Binärformat speichert. Jede Zeile ist durchschnittlich ~ 3 MB und es gibt Zehntausende von Zeilen. Was ich tun möchte (da ich diese Tabellen behalten muss), ist jede Zeile abzufragen, dann die Binärdaten etwas zu komprimieren und dann die Daten wieder einzufügen (durch Aktualisieren jeder Zeile).
Meine derzeitige naive Implementierung macht einfach etwas ähnliches (mit Dapper ):
var files = con.QueryAsync<MyClass>("SELECT ID, Content from Files");
foreach (var file in files)
{
... compress file.Content here
con.ExecuteAsync("UPDATE Files SET Content = @NewContent WHERE ID = @ID", { ... });
}
Offensichtlich ist dies sehr ineffizient, weil es zuerst alle Dateien in den Speicher lädt, etc ... Ich hatte gehofft, kann irgendwie eine Abfrage / Aktualisierung in "Batches", und IDEAL Ich möchte in der Lage sein, jeden Stapel asynchron auszuführen (wenn das ist überhaupt möglich).
Irgendwelche Vorschläge würden geschätzt werden (mit SQL Server BTW).
Die gesamte Operation kann auf der db-Instanz ausgeführt werden, ohne Daten über das Netzwerk in die Anwendung und zurück zu verschieben. Dazu wird die integrierte Funktion COMPRESS verwendet :
Diese Funktion komprimiert den Eingabeausdruck mit dem GZIP-Algorithmus. Die Funktion gibt ein Bytearray vom Typ varbinary (max) zurück.
UPDATE Files
SET Content = COMPRESS(Content)
WHERE ID IN (range); -- for example 1k rows per batch
Wenn Sie die SQL Server-Version niedriger als 2016 verwenden oder einen benutzerdefinierten Komprimierungsalgorithmus benötigen, können Sie die benutzerdefinierte CLR-Funktion verwenden .