Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.

December 12, 2007 / by Zsolt Soczó

SQL Server 2008 újdonságok 4. – streaming adatok tárolása

No, ez alaposan más, mint amit eddig megszoktunk egy adatbázistól. Ennek elsősorban a filmeket, nagy doksikat, képeket vagy egyéb nagy tömegű, strukturálatlan adatokat tárolni kívánó fejlesztők fognak neki örülni. A VARBINARY(MAX) oszlopokban, ha megjelöljük őket a FILESTREAM attributummal, akkor az adatok NEM az adatbázisban fognak tárolódni, hanem a filerendszerben, sima fájlokként. Így még a 2 GByte-os korlát is megszűnik! Nem kell most már azon se filózni, hogy a képek adatbázisban legyenek, vagy fájlrendszerben, aggódva a tranzakcionális konzisztencia miatt. Egyszerre mindkettőben, ezzel az új megoldással. :)

Ez elég szokatlan, ha belegondolunk. Mivel ez nagyon furcsa jószág, nézzük meg egy példán keresztül.

Először engedélyezni kell az új szolgáltatást a szerver példányra:

EXEC sp_filestream_configure @enable_level = 3;

A szintek:

0 Disabled. This is the default value.
1 Enabled only for Transact-SQL access.
2 Enabled only for Transact-SQL and local file system access.
3 Enabled for Transact-SQL, local file system access, and remote file system access.

Ebből már látszik, hogy az adatokat sima filerendszeren (share) is elérhetjük majd. Plusz paraméterként a share nevét is megadhatnánk (nyilván csak a 2-es és 3-as szinthez kell csak). Mivel nem adtam meg nevet, az instance neve lesz a share neve, esetemben ez sql2008:

C:\>net share

Share name Resource Remark
—————————————————————————————————
SQL2008 \\?\GLOBALROOT\Device\RsFx0100\\SQL2008 SQL Server FILESTREAM share

Az elérési út elég érdekes, infót még nem találtam róla, de a saját gépemen találtam egy .inf fájlt, ami azt sugallja, hogy egy File System Drivert telepítenek, az érti ezt az elérési utat. Az infben van az alábbi szöveg, ami sokat segít megfejteni, mi is ez:

“RsFx 0100 driver allows Win32 user-mode applications/services to own and manage Win32 namespaces of the UNC format.” Amúgy itt van implementálva: system32\DRIVERS\RsFx0100.sys. Érzésre kicsit hasonló, mint a http.sys, csak ez nem http végpontokat, hanem UNC pathokat enged lefoglani user módú alkalmazásoknak.

Olyan WinFS (Isten nyugosztalja) utóérzésem van, amikor erről olvasok. :)

A streaming adatokat külön filegroupba kell terelni, ezért eleve így hozom létre az adatbázist:

CREATE DATABASE FSTeszt ON PRIMARY
(
NAME = FSTesztData,
FILENAME = N’C:\test\FSTeszt.mdf’
),
FILEGROUP FileStreamGroup1 CONTAINS FILESTREAM
(
NAME = FileStreamData,
FILENAME = N’C:\test\FileStreamData’
)

A CONTAINS FILESTREAM jelöli ki a speciális filegroupunkat. A FILENAME valójában ebben az esetben nem egy filenév, mint megszokhattuk, hanem egy könyvár elérési útja, itt lesznek az stream adatok tárolva, fájlokban.

Ez lesz belőle a diszken:

Directory of C:\test

12/11/2007 08:27 PM <DIR> .
12/11/2007 08:27 PM <DIR> ..
12/11/2007 08:27 PM <DIR> FileStreamData
12/11/2007 08:27 PM 2,228,224 FSTeszt.mdf
12/11/2007 08:27 PM 516,096 FSTeszt_log.LDF

Vistán LUA adminként nem láthattam a könyvtár tartalmát, de admin eszkalációval ezt találtam benne:

Directory of C:\test\FileStreamData

12/11/2007 08:27 PM <DIR> .
12/11/2007 08:27 PM <DIR> ..
12/11/2007 08:27 PM <DIR> $FSLOG
12/11/2007 08:27 PM 422 filestream.hdr

Az itt keletkező további fájlokról majd egy későbbi részben értekezek (először be kell tudni tölteni őket).

Végre eljutottunk oda, hogy létrehozzunk egy táblát, ami használ streaming adatokat.

CREATE TABLE Kepek
(
Id uniqueidentifier rowguidcol not null primary key default (newid()),
Name nvarchar(256) not null,
Photo varbinary(max) filestream null
)

Mindenképpen kell egy rowguidcol-os oszlop, ez lehet PK is, vagy csak egy sima oszlop, de kell, ezzel tudja a db összehozni a tábla sorait a fájlokkal.

Mikor érdemes használni a filestream store-t?

1. Objects that are being stored are, on average, larger than 1 MB.
2. Fast read access is important.
3. You are developing applications that use a middle tier for application logic.

(For smaller objects, storing varbinary(max) BLOBs in the database often provides better streaming performance.)

A 3. pont azért fontos, mert az adatokat tipikusan nem TDS-en érjük el, hanem SMB-vel, filemegosztáson keresztül, azaz nem a megszokott adatbázis apival. Erről holnap, a következő részben írok.

Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.