2012-11-16 9 views
64

È una vecchia domanda che conosco, ma con SQL Server 2012 è finalmente possibile archiviare i file nel database o dovrebbero essere effettivamente mantenuti nel file system con solo riferimenti a essi nel database?Archiviazione di file in SQL Server

Se la memorizzazione nel database è considerata accettabile in questi giorni, qual è il modo più efficace per farlo? Ho intenzione di applicare la crittografia, quindi apprezzo che l'elaborazione non sia velocissima.

Grazie

+6

Non so se lo faccio. Voglio solo sapere se è un'opzione valida ora. – CompanyDroneFromSector7G

risposta

88

C'è un ottimo documento di Microsoft Research chiamato To Blob or Not To Blob.

La loro conclusione dopo un gran numero di test di performance e analisi è questa:

  • se le tue immagini o documenti sono in genere al di sotto di 256 K in termini di dimensioni, la loro memorizzazione in un database di colonna VARBINARY è più efficiente

  • se le immagini o il documento sono in genere di dimensioni superiori a 1 MB, la memorizzazione nel filesystem è più efficiente (e con l'attributo FILESTREAM di SQL Server 2008, sono ancora sotto controllo transazionale e parte del database)

  • in tra i due, è un po 'di un lancio-up a seconda del vostro uso

Se si decide di mettere le immagini in una tabella SQL Server, consiglio vivamente usando un tavolo separato per la memorizzazione di quelli immagini - non conservare la foto dei dipendenti nella tabella dei dipendenti - tenerli in una tabella separata. In questo modo, la tabella Employee può rimanere snella, media e molto efficiente, assumendo che non sia sempre necessario selezionare anche la foto del dipendente come parte delle query.

Per i filegroup, consultare Files and Filegroup Architecture per un'introduzione. Fondamentalmente, dovresti creare il tuo database con un filegroup separato per grandi strutture di dati fin dall'inizio o aggiungere un filegroup aggiuntivo in seguito. Chiamiamolo "LARGE_DATA".

Ora, ogni volta che avete una nuova tabella per creare, che ha bisogno di memorizzare VARCHAR (MAX) o VARBINARY colonne (MAX), è possibile specificare il gruppo di file per la grande dati:

CREATE TABLE dbo.YourTable 
    (....... define the fields here ......) 
    ON Data     -- the basic "Data" filegroup for the regular data 
    TEXTIMAGE_ON LARGE_DATA -- the filegroup for large chunks of data 

Scopri i Introduzione MSDN sui filegroup e giocarci!

+1

Ben detto. Tutto dipende ovviamente dal caso d'uso, ma il filestream è spesso una buona opzione. – TimothyAWiseman

+2

L'articolo di ricerca che hai citato è dell'aprile 2006. Sicuramente molte cose sono cambiate da allora. – Oxon

+2

@ 1576573987: no, non proprio - queste conclusioni sono ancora valide, per quanto posso dire –

10

Si potrebbe leggere su FILESTREAM. Ecco alcune informazioni dalla documentazione che dovrebbero aiutare a decidere:

Se le seguenti condizioni sono vere, è consigliabile utilizzare FILESTREAM:

  • oggetti che vengono memorizzati sono, in media, più grande di 1 MB.
  • L'accesso rapido alla lettura è importante.
  • Si stanno sviluppando applicazioni che utilizzano un livello intermedio per la logica dell'applicazione.

Per oggetti di piccole dimensioni, la memorizzazione di BLOB varbinary (max) nel database spesso offre prestazioni di streaming migliori.

+0

In realtà, potrei fare entrambe le cose, in base alle dimensioni del file. Grazie! – CompanyDroneFromSector7G

22

C'è ancora risposta semplice. Dipende dal tuo scenario. MSDN has documentation to help you decide.

Ci sono altre opzioni coperte qui. Invece di memorizzare nel file system direttamente o in un BLOB, è possibile utilizzare FileStream o File Table in SQL Server 2012. I vantaggi di File Table sembrano una no-brainier (ma devo ammettere che non ho un'esperienza personale di prima mano con loro .)

L'articolo merita sicuramente una lettura.

+0

+1, collegamento ancora migliore per il 2012. –

+0

Buone informazioni, grazie! – CompanyDroneFromSector7G