2012-04-02 12 views
0

Ich habe eine Tabelle, die wir gerade aktiviert FileStreams. Wir haben eine neue varbinary-Spalte erstellt und sie so eingerichtet, dass sie in einem Filestream gespeichert wird. Dann kopierten wir alles aus der bestehenden Spalte in die neue, um die Dateidaten in das Dateisystem zu übertragen.Abfrage für Null Datensätze, wo Filestream aktiviert ist

So weit so gut.

Allerdings konnten wir die Datenbank nicht offline nehmen (uptime SLA) und es gab 2 Datensätze von 7400, die in kamen, nachdem die Update-Anweisung lief, aber bevor wir die Spalten umbenannten. Wir haben derzeit 2 Spalten: FileData und FileDataOld. Dabei steht FileData für den Filestream.

Die durchschnittliche Dateigröße beträgt etwas mehr als 2 MB. So entschied ich mich, eine sehr einfache select-Anweisung ausführen, um die Datensätze zu finden, die nicht gehen habe:

select DocumentId, FileName 
from docslist 
where FileData is null 

Wenn ich diese Abfrage ausgeführt, die CPU zu 80% versetzt und setzte sich dort für eine ganze Weile. Letztendlich tötete ich den Auserwählten nach 2 Minuten, weil das nur verrückt war.

Wenn ich laufen so etwas wie:

select DocumentId, FileName from docslist 

Es ist fast sofort zurückgibt.

Jedoch, sobald ich versuche, abzufragen, wo FileData oder FileDataOld ist null es spinnt für immer landen.

Wenn ich den Ressourcenmonitor benutze und nach 'FileData is null' frage, kann ich sehen, wie jedes Byte aus jedem einzelnen Dokument aus dem Dateisystem gezogen wird. Was ziemlich merkwürdig ist; Sie würden denken, dass Informationen in der Tabelle selbst gespeichert werden.

Wenn ich nach FileDataOld is null abfrage, sieht es so aus, als ob es versucht, die gesamte Tabelle (16 GB) im Speicher zu laden.

Wie kann ich das verbessern? Ich brauche nur die 2 Datensätze, die nach der Update-Anweisung passiert sind und erzwinge die Verschiebung dieser Dokumente.

Antwort

1

Können Sie nicht tun:

select DocumentId, FileName from docslist WHERE DATALENGTH(FileData)>0 

Auf MDSN heißt es:

DATALENGTH besonders nützlich ist, mit varchar, varbinary, Text, Bild, nvarchar und ntext-Datentypen, da diese Datentypen können Daten variabler Länge speichern.

Die DATALENGTH von NULL ist NULL.

Referenz here

+0

Es macht das Gleiche mit dem Filestream: öffnet alle Dateien auf dem System. Es lief sehr schnell auf der alten Spalte, so löst dies die Hälfte des Problems. – NotMe

+0

Ich gebe dir das, weil es das halbe Problem gelöst hat und ich mich vor langer Zeit anderen Themen zugewandt habe. – NotMe

+0

Okey. Ich hoffe, ich konnte dir bei deinen Problemen ein wenig helfen. Danke Kumpel: P – Arion

Verwandte Themen