Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
              Van toepassing op:SQL Server - alleen Windows
MET FILESTREAM kunnen op SQL Server gebaseerde toepassingen ongestructureerde gegevens, zoals documenten en installatiekopieën, opslaan in het bestandssysteem. Toepassingen kunnen gebruikmaken van de uitgebreide streaming-API's en prestaties van het bestandssysteem en tegelijkertijd transactionele consistentie behouden tussen de ongestructureerde gegevens en bijbehorende gestructureerde gegevens.
FILESTREAM integreert de SQL Server Database Engine met een NTFS- of ReFS-bestandssystemen door varbinary(max) binaire grote objectgegevens (BLOB) op te slaan als bestanden op het bestandssysteem. Transact-SQL instructies kunnen FILESTREAM-gegevens invoegen, bijwerken, opvragen, zoeken en er een back-up van maken. Win32-bestandssysteeminterfaces bieden streamingtoegang tot de gegevens.
FILESTREAM maakt gebruik van de NT-systeemcache voor het opslaan van bestandsgegevens in de cache. Het opslaan van bestanden in de systeemcache helpt bij het verminderen van de gevolgen die FILESTREAM-gegevens kunnen hebben voor de prestaties van de database-engine. De SQL Server-buffergroep wordt niet gebruikt; Daarom is dit geheugen beschikbaar voor het verwerken van query's.
FILESTREAM wordt niet automatisch ingeschakeld wanneer u SQL Server installeert of upgradet. U moet FILESTREAM inschakelen met BEHULP van SQL Server Configuration Manager en SQL Server Management Studio. Als u FILESTREAM wilt gebruiken, moet u een database maken of wijzigen zodat deze een speciaal type bestandsgroep bevat. Maak of wijzig vervolgens een tabel zodat deze een kolom varbinary(max) bevat met het kenmerk FILESTREAM. Nadat u deze taken hebt voltooid, kunt u Transact-SQL en Win32 gebruiken om de FILESTREAM-gegevens te beheren.
Wanneer gebruikt u FILESTREAM?
In SQL Server kunnen BLOBs standaard varbinary(max) gegevens zijn waarmee de gegevens in tabellen worden opgeslagen, of FILESTREAM varbinary(max) objecten die de gegevens opslaan in het bestandssysteem. De grootte en het gebruik van de gegevens bepalen of u databaseopslag of bestandssysteemopslag moet gebruiken. Als aan de volgende voorwaarden wordt voldaan, kunt u OVERWEGEN OM FILESTREAM te gebruiken:
- Objecten die worden opgeslagen, zijn gemiddeld groter dan 1 MB.
- Snelle leestoegang is belangrijk.
- U ontwikkelt toepassingen die gebruikmaken van een middelste laag voor toepassingslogica.
Voor kleinere objecten biedt het opslaan van varbinary(max) BLOBs in de database vaak betere streamingprestaties.
FILESTREAM Storage
FILESTREAM-opslag wordt geïmplementeerd als een varbinary(max) kolom waarin de gegevens worden opgeslagen als BLOBs in het bestandssysteem. De grootten van de BLOBs worden alleen beperkt door de volumegrootte van het bestandssysteem. De standaardbeperking varbinary(max) van 2 GB-bestandsgrootten is niet van toepassing op BLOBs die zijn opgeslagen in het bestandssysteem.
Als u wilt opgeven dat in een kolom gegevens moeten worden opgeslagen in het bestandssysteem, geeft u het kenmerk FILESTREAM op in een varbinary(max) -kolom. Dit kenmerk zorgt ervoor dat de database-engine alle gegevens voor die kolom opslaat in het bestandssysteem, maar niet in het databasebestand.
FILESTREAM-gegevens moeten worden opgeslagen in FILESTREAM-bestandsgroepen. Een FILESTREAM-bestandsgroep is een speciale bestandsgroep die bestandssysteemmappen bevat in plaats van de bestanden zelf. Deze bestandssysteemmappen worden gegevenscontainers genoemd. Gegevenscontainers zijn de interface tussen database-engineopslag en bestandssysteemopslag.
Houd rekening met het volgende wanneer u FILESTREAM-opslag gebruikt:
- Wanneer een tabel een FILESTREAM-kolom bevat, moet elke rij een unieke rij-id hebben die niet null is.
- Meerdere gegevenscontainers kunnen worden toegevoegd aan een FILESTREAM-bestandsgroep.
- FILESTREAM-gegevenscontainers kunnen niet worden genest.
- Wanneer u failoverclustering gebruikt, moeten de FILESTREAM-bestandsgroepen zich op gedeelde schijfresources bevinden.
- FILESTREAM-bestandsgroepen kunnen zich op gecomprimeerde volumes bevinden.
Geïntegreerd beheer
Omdat FILESTREAM is geïmplementeerd als een varbinary(max) kolom en rechtstreeks is geïntegreerd in de Database Engine, werken de meeste SQL Server-beheerhulpprogramma's en -functies zonder aanpassingen voor FILESTREAM-gegevens. U kunt bijvoorbeeld alle back-up- en herstelmodellen met FILESTREAM-gegevens gebruiken en er wordt een back-up gemaakt van de FILESTREAM-gegevens met de gestructureerde gegevens in de database. Als u geen back-up wilt maken van FILESTREAM-gegevens met relationele gegevens, kunt u een gedeeltelijke back-up gebruiken om FILESTREAM-bestandsgroepen uit te sluiten.
Geïntegreerde beveiliging
In SQL Server worden FILESTREAM-gegevens net als andere gegevens beveiligd: door machtigingen te verlenen op tabel- of kolomniveau. Als een gebruiker gemachtigd is voor de kolom FILESTREAM in een tabel, kan de gebruiker de bijbehorende bestanden openen.
Opmerking
Versleuteling wordt niet ondersteund voor FILESTREAM-gegevens.
Alleen het account waaronder het SQL Server-serviceaccount wordt uitgevoerd, krijgt machtigingen voor de FILESTREAM-container. U wordt aangeraden geen ander account machtigingen te verlenen voor de gegevenscontainer.
Opmerking
SQL-aanmeldingen werken niet met FILESTREAM-containers. Alleen NTFS- of ReFS-verificatie werkt met FILESTREAM-containers.
Toegang tot BLOB-gegevens met Transact-SQL- en bestandssysteemstreamingstoegang
Nadat u gegevens in een FILESTREAM-kolom hebt opgeslagen, hebt u toegang tot de bestanden met behulp van Transact-SQL transacties of met behulp van Win32-API's.
Transact-SQL Access
Met Behulp van Transact-SQL kunt u FILESTREAM-gegevens invoegen, bijwerken en verwijderen:
- U kunt een invoegbewerking gebruiken om een FILESTREAM-veld vooraf in te vullen met een null-waarde, lege waarde of relatief korte inlinegegevens. Een grote hoeveelheid gegevens wordt echter efficiënter gestreamd naar een bestand dat gebruikmaakt van Win32-interfaces.
- Wanneer u een FILESTREAM-veld bijwerkt, wijzigt u de onderliggende BLOB-gegevens in het bestandssysteem. Wanneer een FILESTREAM-veld is ingesteld op NULL, worden de BLOB-gegevens die aan het veld zijn gekoppeld, verwijderd. U kunt geen Transact-SQL gesegmenteerde update gebruiken, geïmplementeerd alsUPDATE.**Write(), om gedeeltelijke updates voor de gegevens uit te voeren.
- Wanneer u een rij verwijdert of een tabel verwijdert of afkappen die FILESTREAM-gegevens bevat, verwijdert u de onderliggende BLOB-gegevens in het bestandssysteem.
Streamingtoegang voor bestandssysteem
De Streaming-ondersteuning voor Win32 werkt in de context van een SQL Server-transactie. Binnen een transactie kunt u FILESTREAM-functies gebruiken om een logisch UNC-bestandssysteempad van een bestand te verkrijgen. Vervolgens gebruikt u de OpenSqlFilestream-API om een bestandsingang te verkrijgen. Deze ingang kan vervolgens worden gebruikt door Win32-bestandsstreaminginterfaces, zoals ReadFile() en WriteFile(), om het bestand via het bestandssysteem te openen en bij te werken.
Omdat bestandsbewerkingen transactioneel zijn, kunt u FILESTREAM-bestanden niet verwijderen of hernoemen via het bestandssysteem.
Waarschuwing
De FILESTREAM-container is een map die wordt beheerd door SQL Server. Voeg geen bestanden toe aan of verwijder ze niet handmatig in de map FILESTREAM of via andere toepassingen. Als u dit doet, resulteert dit in back-up- en inconsistentiefouten. Zie MSSQLSERVER_3056, MSSQLSERVER_7908 en MSSQLSERVER_7906 voor meer informatie.
Instructiemodel
Het FILESTREAM-bestandssysteem gebruikt een Transact-SQL instructie met behulp van bestand openen en sluiten. De instructie begint wanneer een bestandsgreep wordt geopend en eindigt wanneer de ingang wordt gesloten. Wanneer een schrijfgreep bijvoorbeeld wordt gesloten, wordt elke mogelijke AFTER trigger die in de tabel is geregistreerd, geactiveerd alsof een UPDATE instructie is voltooid.
Opslagnaamruimte
In FILESTREAM bepaalt de database-engine de naamruimte van het fysieke BLOB-bestandssysteem. Een nieuwe intrinsieke functie, PathName, biedt het logische UNC-pad van de BLOB die overeenkomt met elke FILESTREAM-cel in de tabel. De toepassing gebruikt dit logische pad om de Win32-ingang te verkrijgen en te werken op de BLOB-gegevens met behulp van reguliere Win32-bestandssysteeminterfaces. De functie retourneert NULL als de waarde van de kolom FILESTREAM is NULL.
Toegang tot transacted bestandssysteem
Een nieuwe intrinsieke functie, GET_FILESTREAM_TRANSACTION_CONTEXT, biedt het token dat de huidige transactie vertegenwoordigt waaraan de sessie is gekoppeld. De transactie moet zijn gestart en nog niet afgebroken of vastgelegd. Door een token te verkrijgen, verbindt de toepassing de streamingbewerkingen van het FILESTREAM-bestandssysteem met een gestarte transactie. De functie retourneert NULL in het geval van geen expliciet gestarte transactie.
Alle bestandsingangen moeten worden gesloten voordat de transactie wordt doorgevoerd of afgebroken. Als een ingang buiten het transactiebereik wordt geopend, veroorzaken aanvullende leesbewerkingen op basis van de ingang een fout; extra schrijfbewerkingen op basis van de ingang slagen, maar de werkelijke gegevens worden niet naar de schijf geschreven. Als de database of het exemplaar van de database-engine wordt afgesloten, worden alle geopende ingangen ongeldig.
Transactionele duurzaamheid
Bij het doorvoeren van transacties zorgt de database-engine voor de duurzaamheid van transacties voor FILESTREAM-BLOB-gegevens die worden gewijzigd vanuit de streamingtoegang van het bestandssysteem.
Isolatiesemantiek
De isolatiesemantiek wordt bepaald door de isolatieniveaus van de database-engine. Isolatieniveau voor lezen wordt ondersteund voor toegang tot Transact-SQL en bestandssysteem. Herhaalbare leesbewerkingen, serialiseerbare en isolatieniveaus voor momentopnamen worden ondersteund. Vuile leesbewerkingen worden niet ondersteund.
Open bewerkingen voor toegang tot het bestandssysteem wachten niet op vergrendelingen. In plaats daarvan mislukken de open bewerkingen onmiddellijk als ze geen toegang hebben tot de gegevens vanwege transactieisolatie. De streaming-API-aanroepen mislukken met ERROR_SHARING_VIOLATION als de open bewerking niet kan worden voortgezet vanwege een schending van de isolatie.
Als u wilt toestaan dat gedeeltelijke updates worden uitgevoerd, kan de toepassing een FS-besturingselement van het apparaat (FSCTL_SQL_FILESTREAM_FETCH_OLD_CONTENT) uitgeven om de oude inhoud op te halen in het bestand dat door de geopende handleverwijzingen wordt verzonden. Hiermee wordt een oude inhoudskopie aan de serverzijde geactiveerd. Voor betere prestaties van toepassingen en om te voorkomen dat er potentiële time-outs optreden wanneer u met zeer grote bestanden werkt, raden we u aan asynchrone I/O te gebruiken.
Als de FSCTL wordt uitgegeven nadat de handle naar is geschreven, blijft de laatste schrijfbewerking behouden en gaan eerdere schrijfbewerkingen die in de ingang zijn aangebracht verloren.
Bestandssysteem-API's en ondersteunde isolatieniveaus
Wanneer een bestandssysteem-API een bestand niet kan openen vanwege een isolatiefout, wordt er een ERROR_SHARING_VIOLATION uitzondering geretourneerd. Deze isolatiefout treedt op wanneer twee transacties proberen toegang te krijgen tot hetzelfde bestand. Het resultaat van de toegangsbewerking is afhankelijk van de modus waarin het bestand is geopend en de versie van SQL Server waarop de transactie wordt uitgevoerd. De volgende tabel bevat een overzicht van de mogelijke resultaten voor twee transacties die toegang hebben tot hetzelfde bestand.
| Transactie 1 | Transactie 2 | Resultaat op SQL Server 2008 (10.0.x) | Resultaat op SQL Server 2008 R2 (10.50.x) en latere versies | 
|---|---|---|---|
| Open voor lezen. | Open voor lezen. | Beide slagen. | Beide slagen. | 
| Open voor lezen. | Open voor schrijven. | Beide slagen. Schrijfbewerkingen onder transactie 2 zijn niet van invloed op leesbewerkingen die worden uitgevoerd in transactie 1. | Beide slagen. Schrijfbewerkingen onder transactie 2 zijn niet van invloed op leesbewerkingen die worden uitgevoerd in transactie 1. | 
| Open voor schrijven. | Open voor lezen. | Openen voor transactie 2 mislukt met een ERROR_SHARING_VIOLATION uitzondering. | Beide slagen. | 
| Open voor schrijven. | Open voor schrijven. | Openen voor transactie 2 mislukt met een ERROR_SHARING_VIOLATION uitzondering. | Openen voor transactie 2 mislukt met een ERROR_SHARING_VIOLATION uitzondering. | 
| Open voor lezen. | Open voor SELECT. | Beide slagen. | Beide slagen. | 
| Open voor lezen. | Open voor UPDATEofDELETE. | Beide slagen. Schrijfbewerkingen onder transactie 2 zijn niet van invloed op leesbewerkingen die worden uitgevoerd in transactie 1. | Beide slagen. Schrijfbewerkingen onder transactie 2 zijn niet van invloed op leesbewerkingen die worden uitgevoerd in transactie 1. | 
| Open voor schrijven. | open voor SELECT. | Transactie 2 blokkeert totdat transactie 1 doorvoert of de transactie beëindigt, of er treedt een time-out op voor de transactievergrendeling. | Beide slagen. | 
| Open voor schrijven. | Open voor UPDATEofDELETE. | Transactie 2 blokkeert totdat transactie 1 doorvoert of de transactie beëindigt, of er treedt een time-out op voor de transactievergrendeling. | Transactie 2 blokkeert totdat transactie 1 doorvoert of de transactie beëindigt, of er treedt een time-out op voor de transactievergrendeling. | 
| Open voor SELECT. | Open voor lezen. | Beide slagen. | Beide slagen. | 
| Open voor SELECT. | Open voor schrijven. | Beide slagen. Schrijfbewerkingen onder transactie 2 hebben geen invloed op transactie 1. | Beide slagen. Schrijfbewerkingen onder transactie 2 hebben geen invloed op transactie 1. | 
| Open voor UPDATEofDELETE. | Open voor lezen. | De open bewerking voor transactie 2 mislukt met een ERROR_SHARING_VIOLATION uitzondering. | Beide slagen. | 
| Open voor UPDATEofDELETE. | Open voor schrijven. | De open bewerking voor transactie 2 mislukt met een ERROR_SHARING_VIOLATION uitzondering. | De open bewerking voor transactie 2 mislukt met een ERROR_SHARING_VIOLATION uitzondering. | 
| Open voor SELECTherhaalbare leesbewerkingen. | Open voor lezen. | Beide slagen. | Beide slagen. | 
| Open voor SELECTherhaalbare leesbewerkingen. | Open voor schrijven. | De open bewerking voor transactie 2 mislukt met een ERROR_SHARING_VIOLATION uitzondering. | De open bewerking voor transactie 2 mislukt met een ERROR_SHARING_VIOLATION uitzondering. | 
Write-through van externe clients
Externe bestandssysteemtoegang tot FILESTREAM-gegevens is ingeschakeld via het SMB-protocol (Server Message Block). Als de client extern is, worden er geen schrijfbewerkingen in de cache opgeslagen aan de clientzijde. De schrijfbewerkingen worden altijd naar de server verzonden. De gegevens kunnen worden opgeslagen in de cache aan de serverzijde. We raden u aan toepassingen die worden uitgevoerd op externe clients kleine schrijfbewerkingen samen te voegen in grotere bewerkingen. Het doel is om minder schrijfbewerkingen uit te voeren.
Het maken van geheugen toegewezen weergaven (geheugen toegewezen I/O) met behulp van een FILESTREAM-handle wordt niet ondersteund. Als geheugentoewijzing wordt gebruikt voor FILESTREAM-gegevens, kan de database-engine geen consistentie en duurzaamheid van de gegevens of de integriteit van de database garanderen.
Aanbevelingen en richtlijnen voor het verbeteren van FILESTREAM-prestaties
Met de functie SQL Server FILESTREAM kunt u varbinary(max) binaire gegevens van grote objecten opslaan als bestanden in het bestandssysteem. Wanneer u een groot aantal rijen in FILESTREAM-containers hebt, wat de onderliggende opslag is voor zowel FILESTREAM-kolommen als FileTables, kunt u uiteindelijk een bestandssysteemvolume bevatten dat een groot aantal bestanden bevat. Om de beste prestaties te bereiken bij het verwerken van de geïntegreerde gegevens uit de database en het bestandssysteem, is het belangrijk om ervoor te zorgen dat het bestandssysteem optimaal is afgestemd. Hier volgen enkele van de afstemmingsopties die vanuit het perspectief van een bestandssysteem beschikbaar zijn:
- Hoogtecontrole voor het SQL Server FILESTREAM-filterstuurprogramma (bijvoorbeeld - rsfx0100.sys). Evalueer alle filterstuurprogramma's die zijn geladen voor de opslagstack die is gekoppeld aan een volume waarin de FILESTREAM-functie bestanden opslaat en zorg ervoor dat het rsfx-stuurprogramma zich onder aan de stack bevindt. U kunt het FLTMC.EXE controleprogramma gebruiken om de filterstuurprogramma's voor een specifiek volume op te sommen. Hier volgt een voorbeelduitvoer van het HULPPROGRAMMA FLTMC:- C:\Windows\System32>fltMC.exefilters- Filternaam - Aantal exemplaren - Hoogte - Kader - Sftredir - 1 - 406000 - 0 - MpFilter - 9 - 328000 - 0 - luafv - 1 - 135000 - 0 - FileInfo - 9 - 45000 - 0 - RsFx0103 - 1 - 41001.03 - 0 
- Controleer of de server de eigenschap 'Laatste toegangstijd' heeft uitgeschakeld voor de bestanden. Dit bestandssysteemkenmerk wordt onderhouden in het register: Sleutelnaam: - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemNaam: NtfsDisableLastAccessUpdate Type: REG_DWORD waarde: 1
- Controleer of de server 8.3-naamgeving heeft uitgeschakeld. Dit bestandssysteemkenmerk wordt onderhouden in het register: Sleutelnaam: - HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemNaam: NtfsDisable8dot3NameCreation Type: REG_DWORD waarde: 1
- Controleer of de FILESTREAM-mapcontainers geen bestandssysteemversleuteling of compressie van het bestandssysteem hebben ingeschakeld, omdat dit een overheadniveau kan veroorzaken bij het openen van deze bestanden. 
- Voer fltmc-exemplaren uit vanaf een opdrachtprompt met verhoogde bevoegdheid en zorg ervoor dat er geen filterstuurprogramma's zijn gekoppeld aan het volume waarop u wilt herstellen. 
- Controleer of filestream-mapcontainers niet meer dan 300.000 bestanden hebben. U kunt de informatie uit - sys.database_filesde catalogusweergave gebruiken om erachter te komen welke mappen in het bestandssysteem bestanden bevatten- FILESTREAM-related. Dit kan worden voorkomen door meerdere containers te gebruiken. (Zie het volgende opsommingsteken voor meer informatie.)
- Met slechts één FILESTREAM-bestandsgroep worden alle gegevensbestanden gemaakt onder dezelfde map. Het maken van bestanden van zeer grote aantallen bestanden kan worden beïnvloed door grote NTFS-indexen, die ook kunnen worden gefragmenteerd. - Het gebruik van meerdere bestandsgroepen moet u hierbij helpen (de toepassing maakt gebruik van partitionering of heeft meerdere tabellen, die elk naar een eigen bestandsgroep gaan). 
- Met SQL Server 2012 (11.x) en latere versies kunt u meerdere containers of bestanden hebben onder een FILESTREAM-bestandsgroep. Een round robin-toewijzingsschema is van toepassing. Daarom wordt het aantal NTFS-bestanden per map kleiner. 
 
- Back-up en herstel kan sneller worden met meerdere FILESTREAM-containers als er meerdere volumes worden gebruikt die containers opslaan. - SQL Server 2012 (11.x) ondersteunt meerdere containers per bestandsgroep en kan het eenvoudiger maken. Er zijn mogelijk geen ingewikkelde partitioneringsschema's nodig om een groter aantal bestanden te beheren. 
- Wanneer er een zeer groot aantal FILESTREAM-containers in een SQL-exemplaar aanwezig is, kan het lang duren voordat de databases met veel FILESTREAM-containers worden gestart om ze te registreren in het FILESTREAM-filterstuurprogramma. Het verspreiden ervan in meerdere verschillende volumes helpt bij het verbeteren van de opstarttijd van de database. 
- De NTFS MFT kan worden gefragmenteerd en kan prestatieproblemen veroorzaken. De gereserveerde MFT-grootte is afhankelijk van de volumegrootte, dus u kunt dit wel of niet tegenkomen. - U kunt de MFT-fragmentatie controleren met - defrag /A /V C:(wijzig C: in de werkelijke volumenaam).
- U kunt meer MFT-ruimte reserveren met behulp van fsutil gedrag set mftzone 2. 
- FILESTREAM-gegevensbestanden moeten worden uitgesloten van het scannen van antivirussoftware. - Opmerking - Windows Server 2016 schakelt Windows Defender automatisch in. Zorg ervoor dat Windows Defender is geconfigureerd om Filestream-bestanden uit te sluiten. Als u dit niet doet, kunnen de prestaties voor back-up- en herstelbewerkingen afnemen. - Zie Uitsluitingen configureren en valideren voor Scans van Windows Defender Antivirus voor meer informatie. 
 
Gerelateerde taken
- FILESTREAM- inschakelen en configureren
- Een FILESTREAM-Enabled-database maken
- Een tabel maken voor het opslaan van FILESTREAM-gegevens
- Filestream-gegevens openen met Transact-SQL
- Clienttoepassingen maken voor FILESTREAM-gegevens
- Access FILESTREAM-gegevens met OpenSqlFilestream
- Gedeeltelijke updates uitvoeren voor FILESTREAM-gegevens
- Conflicten voorkomen met databasebewerkingen in FILESTREAM-toepassingen
- Een database met FILESTREAM verplaatsen
- FILESTREAM instellen op een failovercluster
- Een firewall configureren voor FILESTREAM-toegang