Panoramica di FILESTREAM

Molti dati che vengono creati ogni giorno sono dati non strutturati, ad esempio documenti di testo, immagini e video, che sono spesso archiviati al di fuori del database in modo separato dai dati strutturati. Questa separazione può causare difficoltà nella gestione dei dati oppure se i dati sono associati all'archiviazione strutturata, le funzionalità di flusso di file e le relative prestazioni possono essere limitate.

FILESTREAM consente di integrare Motore di database di SQL Server con un file system NTFS archiviando dati di oggetti binari di grandi dimensioni (BLOB) varbinary(max) come file nel file system. Le istruzioni Transact-SQL consentono di inserire, aggiornare, eseguire query, effettuare ricerche ed eseguire il backup dei dati FILESTREAM. Le interfacce del file system Win32 forniscono accesso di flusso ai dati.

FILESTREAM utilizza la cache di sistema NT per memorizzare nella cache i dati del file. Ciò consente di ridurre qualsiasi effetto che i dati FILESTREAM potrebbero avere sulle prestazioni del Motore di database. Il pool di buffer SQL Server non è utilizzato; pertanto questa memoria è disponibile per l'elaborazione di query.

[!NOTA]

I dati FILESTREAM non vengono crittografati anche se è abilitata la crittografia dei dati trasparenti.

Per una procedura dettagliata sulle modalità di utilizzo di FILESTREAM, vedere Introduzione all'archiviazione FILESTREAM.

Quando utilizzare FILESTREAM

In SQL Server, i BLOB possono essere dati standard varbinary(max) che archiviano i dati nelle tabelle oppure oggetti varbinary(max) di FILESTREAM che archiviano i dati nel file system. La dimensione e l'utilizzo dei dati determinano se è necessario utilizzare l'archiviazione nel database o l'archiviazione nel file system. Se le condizioni indicate di seguito vengono soddisfatte, è necessario utilizzare FILESTREAM:

  • Gli oggetti che si stanno archiviando sono, in media, più grandi di 1 MB.

  • La rapidità dell'accesso in lettura è importante.

  • Si stanno sviluppando applicazioni che utilizzano un livello intermedio per la logica dell'applicazione.

Per oggetti più piccoli, l'archiviazione di BLOB varbinary(max) nel database offre spesso migliori prestazioni di flusso.

Archiviazione FILESTREAM

L'archiviazione FILESTREAM viene implementata come una colonna varbinary(max) nella quale i dati sono archiviati come BLOB nel file system. Le dimensioni dei BLOB sono limitate solo dalle dimensioni del volume del file system. Il limite varbinary(max) standard di 2 GB delle dimensioni del file non si applica ai BLOB archiviati nel file system.

Per indicare che una colonna deve archiviare dati nel file system, specificare l'attributo FILESTREAM in una colonna varbinary(max). In questo modo Motore di database archivia tutti i dati per quella colonna nel file system, ma non nel file di database.

I dati FILESTREAM devono essere archiviati nei filegroup FILESTREAM. Un filegroup FILESTREAM è un filegroup speciale che contiene directory del file system anziché dei file stessi. Queste directory del file system vengono chiamate contenitori di dati. I contenitori di dati rappresentano l'interfaccia tra archiviazione nel Motore di database e archiviazione nel file system.

Se si utilizza l'archiviazione FILESTREAM, considerare gli aspetti indicati di seguito:

  • Se una tabella contiene una colonna FILESTREAM, ogni riga deve avere un ID riga univoco con valore diverso da Null.

  • I contenitori di dati FILESTREAM non possono essere nidificati.

  • Se si utilizza il clustering di failover, i filegroup FILESTREAM devono essere su risorse disco condivise.

  • I filegroup FILESTREAM possono essere su volumi compressi.

Protezione integrata

In SQL Server, i dati FILESTREAM sono protetti così come avviene per gli altri dati, ossia tramite la concessione di autorizzazioni ai livelli di tabella o colonna. Se un utente dispone delle autorizzazioni per la colonna FILESTREAM in una tabella, può aprire i file associati.

[!NOTA]

La crittografia non è supportata sui dati FILESTREAM.

Solo all'account con il quale viene eseguito l'account del servizio SQL Server sono concesse autorizzazioni NTFS al contenitore FILESTREAM. Si consiglia di non concedere autorizzazioni per il contenitore di dati a nessun altro account.

Gestione integrata

Dato che FILESTREAM è implementato come una colonna varbinary(max) e integrato direttamente nel Motore di database, la maggior parte degli strumenti e delle funzioni di gestione SQL Server funziona senza modificare i dati FILESTREAM. Ad esempio, è possibile utilizzare tutti i modelli di backup e di recupero con i dati FILESTREAM e per questo viene eseguito il backup con i dati strutturati nel database. Se non si desidera eseguire il backup dei dati FILESTREAM con i dati relazionali, è possibile utilizzare un backup parziale per escludere i filegroup FILESTREAM.

Modello di programmazione duplice per l'accesso ai dati BLOB

Dopo avere archiviato dati in una colonna FILESTREAM, è possibile accedere ai file utilizzando le transazioni Transact-SQL oppure le API Win32.

Accesso Transact-SQL

Utilizzando Transact-SQL, è possibile inserire, aggiornare ed eliminare i dati FILESTREAM:

  • È possibile utilizzare un'operazione di inserimento per il popolamento preliminare di un campo FILESTREAM con un valore null, un valore vuoto, o dati inline relativamente brevi. Tuttavia, una grande quantità di dati viene trasmessa in modo più efficace in un file che utilizza interfacce Win32.

  • Quando si aggiorna un campo FILESTREAM, si modificano i dati BLOB sottostanti nel file system. Quando un campo FILESTREAM viene impostato su NULL, i dati BLOB associati al campo vengono eliminati. Non è possibile utilizzare un aggiornamento ChunkedTransact-SQL, implementato come UPDATE**.**Write () per eseguire aggiornamenti parziali dei dati.

  • Quando si elimina una riga oppure si elimina o si tronca una tabella che contiene i dati FILESTREAM, si eliminano i dati BLOB sottostanti nel file system.

Accesso di flusso al file system

Il supporto di flusso di Win32 funziona nel contesto di una transazione SQL Server. All'interno di una transazione, è possibile utilizzare funzioni FILESTREAM per ottenere un percorso di file system UNC logico di un file. Si utilizza quindi l'API OpenSqlFilestream per ottenere un handle di file. Questo handle può essere utilizzato quindi dalle interfacce di flusso dei file Win32, ad esempio ReadFile() e WriteFile() per accedere e aggiornare il file mediante il file system.

Dato che le operazioni con i file sono transazionali, non è possibile eliminare o rinominare i file FILESTREAM tramite il file system.

Modello istruzione

L'accesso al file system di FILESTREAM consente di modellare un'istruzione Transact-SQL utilizzando le operazioni di apertura e chiusura dei file. L'istruzione si avvia quando un handle di file è aperto e termina quando l'handle è chiuso. Ad esempio, se un handle di scrittura è chiuso, qualsiasi possibile trigger AFTER registrato nella tabella si attiva come se un'istruzione UPDATE fosse completata.

Spazio dei nomi dell'archiviazione

In FILESTREAM, Motore di database consente di controllare lo spazio dei nomi del file system fisico di BLOB. Una nuova funzione intrinseca PathName fornisce il percorso UNC logico di BLOB che corrisponde a ogni cella di FILESTREAM nella tabella. L'applicazione utilizza questo percorso logico per ottenere l'handle Win32 e operare sui dati BLOB mediante interfacce del file system Win32 normali. La funzione restituisce NULL se il valore della colonna FILESTREAM è NULL.

Accesso al file system transazionale

Una nuova funzione intrinseca GET_FILESTREAM_TRANSACTION_CONTEXT () fornisce il token che rappresenta la transazione corrente alla quale è associata la sessione. È necessario che la transazione sia stata avviata e non sia stata ancora interrotta o non ne sia stato ancora eseguito il commit. Ottenendo un token, l'applicazione associa le operazioni di flusso del file system di FILESTREAM con una transazione avviata. La funzione restituisce NULL se non esistono transazioni esplicitamente avviate.

Tutti gli handle di file devono essere chiusi prima che la transazione venga interrotta o ne venga eseguito il commit. Se un handle viene lasciato aperto oltre l'ambito della transazione, le letture aggiuntive sull'handle causeranno un errore, mentre le scritture aggiuntive sull'handle riusciranno, ma in realtà i dati non saranno scritti su disco. Allo stesso modo, se il database o l'istanza del Motore di database si chiude, tutti gli handle aperti non sono più validi.

Durevolezza delle transazioni

Con FILESTREAM, su commit della transazione, viene assicurata nel Motore di database la durevolezza delle transazioni per i dati BLOB di FILESTREAM modificati dall'accesso di flusso al file system.

Semantica dell'isolamento

La semantica dell'isolamento è governata dai livelli di isolamento delle transazioni del Motore di database. Solo il livello di isolamento Read Committed è supportato per l'accesso al file system. Le operazioni di lettura ripetibili e gli isolamenti dello snapshot e serializzabili sono supportati quando si accede ai dati FILESTREAM utilizzando Transact-SQL. La lettura dirty non è supportata.

Le operazioni aperte di accesso al file system non aspettano alcun blocco, ma non riescono immediatamente se non possono accedere ai dati a causa dell'isolamento della transazione. Le chiamate API di flusso non riescono con ERROR_SHARING_VIOLATION se l'operazione aperta non può continuare a causa della violazione dell'isolamento.

Aggiornamenti parziali

Per effettuare aggiornamenti parziali, l'applicazione consente di eseguire un controllo del dispositivo FS (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) per recuperare il contenuto obsoleto nel file a cui fa riferimento l'handle aperto. In questo modo verrà attivata una copia del contenuto obsoleto sul lato server. Per ottenere migliori prestazioni dell'applicazione ed evitare di causare timeout potenziali quando si utilizzano file molto grandi, si consiglia di utilizzare I/O asincroni.

Se FSCTL viene eseguito dopo la scrittura sull'handle, l'ultima operazione di scrittura verrà salvata in modo permanente e le scritture precedenti eseguite sull'handle andranno perse.

Write-through da client remoti

L'accesso del file system remoto ai dati FILESTREAM è attivato sul protocollo Server Message Block (SMB). Se il client è remoto, nella cache non vengono memorizzate operazioni di scrittura lato client. Le operazioni di scrittura saranno inviate sempre al server. I dati possono essere memorizzati nella cache sul lato server. Si consiglia di far consolidare alle applicazioni eseguite sui client remoti piccole operazioni di scrittura per effettuarne un numero minore con dati di dimensioni superiori.

La creazione di viste mappate alla memoria (I/O mappato alla memoria) utilizzando handle FILESTREAM non è supportata. Se il mapping di memoria viene utilizzato per i dati FILESTREAM, il Motore di database non può garantire coerenza e durevolezza dei dati o l'integrità del database.