Jaki jest najszybszy sposób na eksport plików (obiektów typu blobs) przechowywanych w tabeli programu SQL Server do pliku na dysku twardym? Mam ponad 2,5 TB plików (90 kb avg) przechowywanych jako pliki varbinary i muszę wyodrębnić każdy z nich na lokalny dysk twardy tak szybko jak to możliwe. Wydaje się, że BCP działa, ale zajmie mi to 45 dni z prędkością, jaką widzę, i obawiam się, że mój skrypt w pewnym momencie się nie powiedzie, ponieważ w Management Studio zabraknie pamięci.najszybszy sposób eksportowania obiektów typu blob z tabeli do pojedynczych plików
Odpowiedz
Próbowałem użyć funkcji CLR i było ponad dwa razy szybsze niż BCP. Oto mój kod.
Oryginalna metoda:
SET @bcpCommand = 'bcp "SELECT blobcolumn FROM blobtable WHERE ID = ' + CAST(@FileID AS VARCHAR(20)) + '" queryout "' + @FileName + '" -T -c'
EXEC master..xp_cmdshell @bcpCommand
CLR Metoda:
declare @file varbinary(max) = (select blobcolumn from blobtable WHERE ID = @fileid)
declare @filepath nvarchar(4000) = N'c:\temp\' + @FileName
SELECT Master.dbo.WriteToFile(@file, @filepath, 0)
C# kod dla funkcji CLR
using System;
using System.Data;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;
namespace BlobExport
{
public class Functions
{
[SqlFunction]
public static SqlString WriteToFile(SqlBytes binary, SqlString path, SqlBoolean append)
{
try
{
if (!binary.IsNull && !path.IsNull && !append.IsNull)
{
var dir = Path.GetDirectoryName(path.Value);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
using (var fs = new FileStream(path.Value, append ? FileMode.Append : FileMode.OpenOrCreate))
{
byte[] byteArr = binary.Value;
for (int i = 0; i < byteArr.Length; i++)
{
fs.WriteByte(byteArr[i]);
};
}
return "SUCCESS";
}
else
"NULL INPUT";
}
catch (Exception ex)
{
return ex.Message;
}
}
}
}
Podwajałem wydajność ponownie, używając opcji SET NOCOUNT ON i wysyłając tekst wyniku do tabeli zamiast do okna Wiadomości w systemie SSMS. – influent
Byłoby miło, gdyby T-SQL po prostu zawierało polecenie SELECT z pola MYŚLI W poleceniu DUMPFILE. – Patrick
To robi. Nazywa się BULK INSERT. – Marian
Korzystanie z rozwiązania programującego jest jednym ze sposobów, ale problem z pierwotnym pytaniem, że skrypt może się nie powieść, jeśli SSMS wyczerpie się z pamięci, można również rozwiązać, tworząc zadanie agenta SQL dla tego zadania. To oczywiście całkowicie ignoruje część pytania dotyczącą wydajności.
Proszę podać przykład proponowanego rozwiązania zamiast mówić, jak inne rozwiązania nie będą działać. –
Lub po prostu usuń odpowiedź - odzyska także negatywną reputację poniesione ... –
@PeterB To wszystko w porządku. To wyraźnie pokazuje, jak mentalność stadna dominuje nad SE i że nikt tak naprawdę nie rozumie pierwotnego pytania. Dbać. – ajeh
Przybyłem tutaj, szukając eksportu bloba do pliku przy najmniejszym wysiłku. Funkcje CLR nie są czymś, co nazwałbym najmniejszym wysiłkiem. Here opisane Lazier jeden, używając OLE Automation:
declare @init int
declare @file varbinary(max) = CONVERT(varbinary(max), N'your blob here')
declare @filepath nvarchar(4000) = N'c:\temp\you file name here.txt'
EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
EXEC sp_OASetProperty @init, 'Type', 1;
EXEC sp_OAMethod @init, 'Open'; -- Calling a method
EXEC sp_OAMethod @init, 'Write', NULL, @file; -- Calling a method
EXEC sp_OAMethod @init, 'SaveToFile', NULL, @filepath, 2; -- Calling a method
EXEC sp_OAMethod @init, 'Close'; -- Calling a method
EXEC sp_OADestroy @init; -- Closed the resources
Będziesz potencjalnie potrzebne, aby umożliwić uruchamianie procedur przechowywanych na serwerze OA (a następnie go wyłączyć, gdy skończysz):
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
Po prostu użyłem tej metody do wygenerowania 979 jpegów z varbinary kolumna identyfikatora zdjęcia identyfikacyjne do dysku sieciowego. Utworzenie obrazów (łącznie 12 MB) trwało około 16 sekund, a 5 minut - napisanie kursora i nieznaczne zmodyfikowanie dostarczonego kodu. Metody innych odpowiedzi zajęłyby znacznie więcej czasu, ale mogą być bardziej efektywne. To podejście było idealne dla moich potrzeb. – ubercam
- 1. Usuwanie obiektów typu blob z obrazu binarnego
- 2. Najszybszy sposób importowania plików CSV do MATLAB
- 3. Układanie pojedynczych obiektów JSON-LD
- 4. sposób wysyłania pojedynczych plików do określonego katalogu dla cljsbuild
- 5. Wyjaśnienie pojedynczych obiektów w Scali
- 6. Otrzymywanie pojedynczych plików Github
- 7. Używanie jQuery do edycji pojedynczych komórek tabeli
- 8. python opencv - wykrywanie obiektów typu blob lub wykrywanie kolejek
- 9. Czy iniekcja zależności dotyczy tylko obiektów typu usługi i pojedynczych obiektów? (a NIE dla GUI?)
- 10. Przechowywanie dużych obiektów typu blob za pomocą Objectify Appengine
- 11. Uzyskiwanie listy nazw plików obiektów blob Azure w kontenerze?
- 12. Wydajność narzut dodanie pola BLOB do tabeli
- 13. Najszybszy sposób zapisu do pliku?
- 14. może cljc definicje pojedynczych plików makro do pracy z clojurescript?
- 15. Używanie Excel VBA do eksportowania danych do tabeli MS Access
- 16. Przesyłanie wielu plików do magazynu Azure Blob
- 17. Synchronizacja bez skanowania pojedynczych plików?
- 18. Konwertowanie pojedynczych plików na łuk?
- 19. Kopiowanie danych blob z jednej tabeli do drugiej na MySQL
- 20. Najszybszy sposób kasowania kaskady wielu obiektów w trybie hibernacji
- 21. Przesyłanie strumieniowe plików zdalnych do obiektów plików
- 22. Najszybszy sposób odczytu długiego [] z pliku?
- 23. W jaki sposób kolumna typu blob jest opisana w Hibernacja?
- 24. Kodowanie UTF-8 podczas eksportowania tabeli HTML do Excela
- 25. Najszybszy sposób odczytywania stosunkowo dużych plików bajtowych w Javie
- 26. SharpSvn: Pobieranie struktury repozytorium i pojedynczych plików
- 27. Obiekty typu BLOB w SQL przechowujące plik wideo
- 28. Odzyskiwanie plików z obiektów Git
- 29. Najszybszy sposób wstawienia do tabeli programu SQL Server z kodu .NET?
- 30. Najszybszy sposób na tworzenie plików w języku C#
Jest mało prawdopodobne, aby był to problem z wydajnością BCP. Jak wyglądają twoje wykorzystanie dysków? – RBarryYoung
Średnia długość kolejki dysku jest mniejsza niż jedna dziesiąta sekundy, a średni czas odpowiedzi jest poniżej 5 ms podczas moich testów, co wydaje mi się dobre. W każdym razie wydaje się to rozsądnym osiągnięciem BCP, miałem tylko nadzieję, że może być szybszy sposób. – influent
Może chcesz przeczytać następujące pytanie na DBA.SE: [Optymalizacja wydajności BCP dla danych BLOB] (http://dba.stackexchange.com/questions/5025/optimising-bcp-performance-for-blob-data/). Traktuje przypadek bcp i blob. – Marian