{"id":358,"date":"2007-12-12T14:09:00","date_gmt":"2007-12-12T13:09:00","guid":{"rendered":"http:\/\/soci.hu\/blog\/index.php\/2007\/12\/12\/sql-server-2008-ujdonsagok-4-streaming-adatok-tarolasa\/"},"modified":"2007-12-12T14:23:44","modified_gmt":"2007-12-12T13:23:44","slug":"sql-server-2008-ujdonsagok-4-streaming-adatok-tarolasa","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2007\/12\/12\/sql-server-2008-ujdonsagok-4-streaming-adatok-tarolasa\/","title":{"rendered":"SQL Server 2008 \u00fajdons\u00e1gok 4. &#8211; streaming adatok t\u00e1rol\u00e1sa"},"content":{"rendered":"<p>No, ez alaposan m\u00e1s, mint amit eddig megszoktunk egy adatb\u00e1zist\u00f3l. Ennek els\u0151sorban a filmeket, nagy doksikat, k\u00e9peket vagy egy\u00e9b nagy t\u00f6meg\u0171, struktur\u00e1latlan adatokat t\u00e1rolni k\u00edv\u00e1n\u00f3 fejleszt\u0151k fognak neki \u00f6r\u00fclni. A VARBINARY(MAX) oszlopokban, ha megjel\u00f6lj\u00fck \u0151ket a FILESTREAM attributummal, akkor az adatok NEM az adatb\u00e1zisban fognak t\u00e1rol\u00f3dni, hanem a filerendszerben, sima f\u00e1jlokk\u00e9nt. \u00cdgy m\u00e9g a 2 GByte-os korl\u00e1t is megsz\u0171nik! Nem kell most m\u00e1r azon se fil\u00f3zni, hogy a k\u00e9pek adatb\u00e1zisban legyenek, vagy f\u00e1jlrendszerben, agg\u00f3dva a tranzakcion\u00e1lis konzisztencia miatt. Egyszerre mindkett\u0151ben, ezzel az \u00faj megold\u00e1ssal. :)<\/p>\n<p>Ez el\u00e9g szokatlan, ha belegondolunk. Mivel ez nagyon furcsa j\u00f3sz\u00e1g, n\u00e9zz\u00fck meg egy p\u00e9ld\u00e1n kereszt\u00fcl.<\/p>\n<p>El\u0151sz\u00f6r enged\u00e9lyezni kell az \u00faj szolg\u00e1ltat\u00e1st a szerver p\u00e9ld\u00e1nyra:<\/p>\n<p>EXEC sp_filestream_configure @enable_level = 3;<\/p>\n<p>A szintek:<\/p>\n<p>0 Disabled. This is the default value.<br \/>\n1 Enabled only for Transact-SQL access.<br \/>\n2 Enabled only for Transact-SQL and local file system access.<br \/>\n3 Enabled for Transact-SQL, local file system access, and remote file system access.<\/p>\n<p>Ebb\u0151l m\u00e1r l\u00e1tszik, hogy az adatokat sima filerendszeren (share) is el\u00e9rhetj\u00fck majd. Plusz param\u00e9terk\u00e9nt a share nev\u00e9t is megadhatn\u00e1nk (nyilv\u00e1n csak a 2-es \u00e9s 3-as szinthez kell csak). Mivel nem adtam meg nevet, az instance neve lesz a share neve, esetemben ez sql2008:<\/p>\n<p>C:\\>net share<\/p>\n<p>Share name   Resource                                                                     Remark<br \/>\n&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br \/>\nSQL2008      \\\\?\\GLOBALROOT\\Device\\RsFx0100\\<localmachine>\\SQL2008 SQL Server FILESTREAM share<\/p>\n<p>Az el\u00e9r\u00e9si \u00fat el\u00e9g \u00e9rdekes, inf\u00f3t m\u00e9g nem tal\u00e1ltam r\u00f3la, de a saj\u00e1t g\u00e9pemen tal\u00e1ltam egy .inf f\u00e1jlt, ami azt sugallja, hogy egy File System Drivert telep\u00edtenek, az \u00e9rti ezt az el\u00e9r\u00e9si utat. Az infben van az al\u00e1bbi sz\u00f6veg, ami sokat seg\u00edt megfejteni, mi is ez:<\/p>\n<p>&#8220;RsFx 0100 driver allows Win32 user-mode applications\/services to own and manage Win32 namespaces of the UNC format.&#8221; Am\u00fagy itt van implement\u00e1lva: system32\\DRIVERS\\RsFx0100.sys. \u00c9rz\u00e9sre kicsit hasonl\u00f3, mint a http.sys, csak ez nem http v\u00e9gpontokat, hanem UNC pathokat enged lefoglani user m\u00f3d\u00fa alkalmaz\u00e1soknak.<\/p>\n<p>Olyan WinFS (Isten nyugosztalja) ut\u00f3\u00e9rz\u00e9sem van, amikor err\u0151l olvasok. :)<\/p>\n<p>A streaming adatokat k\u00fcl\u00f6n filegroupba kell terelni, ez\u00e9rt eleve \u00edgy hozom l\u00e9tre az adatb\u00e1zist:<\/p>\n<p>CREATE DATABASE FSTeszt ON PRIMARY<br \/>\n(<br \/>\n    NAME = FSTesztData,<br \/>\n    FILENAME = N&#8217;C:\\test\\FSTeszt.mdf&#8217;<br \/>\n),<br \/>\nFILEGROUP FileStreamGroup1 <strong>CONTAINS FILESTREAM<\/strong><br \/>\n(<br \/>\n    NAME = FileStreamData,<br \/>\n    FILENAME = N&#8217;C:\\test\\FileStreamData&#8217;<br \/>\n)<\/p>\n<p>A CONTAINS FILESTREAM jel\u00f6li ki a speci\u00e1lis filegroupunkat. A FILENAME val\u00f3j\u00e1ban ebben az esetben nem egy filen\u00e9v, mint megszokhattuk, hanem egy k\u00f6nyv\u00e1r el\u00e9r\u00e9si \u00fatja, itt lesznek az stream adatok t\u00e1rolva, f\u00e1jlokban.<\/p>\n<p>Ez lesz bel\u0151le a diszken:<\/p>\n<p> Directory of C:\\test<\/p>\n<p>12\/11\/2007  08:27 PM    &lt;DIR&gt;          .<br \/>\n12\/11\/2007  08:27 PM    &lt;DIR&gt;          ..<br \/>\n12\/11\/2007  08:27 PM    &lt;DIR&gt;          FileStreamData<br \/>\n12\/11\/2007  08:27 PM         2,228,224 FSTeszt.mdf<br \/>\n12\/11\/2007  08:27 PM           516,096 FSTeszt_log.LDF<\/p>\n<p>Vist\u00e1n LUA admink\u00e9nt nem l\u00e1thattam a k\u00f6nyvt\u00e1r tartalm\u00e1t, de admin eszkal\u00e1ci\u00f3val ezt tal\u00e1ltam benne:<\/p>\n<p> Directory of C:\\test\\FileStreamData<\/p>\n<p>12\/11\/2007  08:27 PM    &lt;DIR&gt;          .<br \/>\n12\/11\/2007  08:27 PM    &lt;DIR&gt;          ..<br \/>\n12\/11\/2007  08:27 PM    &lt;DIR&gt;          $FSLOG<br \/>\n12\/11\/2007  08:27 PM               422 filestream.hdr<\/p>\n<p>Az itt keletkez\u0151 tov\u00e1bbi f\u00e1jlokr\u00f3l majd egy k\u00e9s\u0151bbi r\u00e9szben \u00e9rtekezek (el\u0151sz\u00f6r be kell tudni t\u00f6lteni \u0151ket).<\/p>\n<p>V\u00e9gre eljutottunk oda, hogy l\u00e9trehozzunk egy t\u00e1bl\u00e1t, ami haszn\u00e1l streaming adatokat.<\/p>\n<p>CREATE TABLE Kepek<br \/>\n(<br \/>\n  Id uniqueidentifier rowguidcol not null primary key default (newid()),<br \/>\n  Name nvarchar(256) not null,<br \/>\n  Photo varbinary(max) <strong>filestream<\/strong> null<br \/>\n)<\/p>\n<p>Mindenk\u00e9ppen kell egy rowguidcol-os oszlop, ez lehet PK is, vagy csak egy sima oszlop, de kell, ezzel tudja a db \u00f6sszehozni a t\u00e1bla sorait a f\u00e1jlokkal.<\/p>\n<p>Mikor \u00e9rdemes haszn\u00e1lni a filestream store-t?<\/p>\n<p>1. Objects that are being stored are, on average, larger than 1 MB.<br \/>\n2. Fast read access is important.<br \/>\n3. You are developing applications that use a middle tier for application logic.<\/p>\n<p>(For smaller objects, storing varbinary(max) BLOBs in the database often provides better streaming performance.)<\/p>\n<p>A 3. pont az\u00e9rt fontos, mert az adatokat tipikusan nem <a href=\"http:\/\/en.wikipedia.org\/wiki\/Tabular_Data_Stream\">TDS<\/a>-en \u00e9rj\u00fck el, hanem <a href=\"http:\/\/en.wikipedia.org\/wiki\/Server_Message_Block\">SMB<\/a>-vel, filemegoszt\u00e1son kereszt\u00fcl, azaz nem a megszokott adatb\u00e1zis apival. Err\u0151l holnap, a k\u00f6vetkez\u0151 r\u00e9szben \u00edrok.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>No, ez alaposan m\u00e1s, mint amit eddig megszoktunk egy adatb\u00e1zist\u00f3l. Ennek els\u0151sorban a filmeket, nagy doksikat, k\u00e9peket vagy egy\u00e9b nagy t\u00f6meg\u0171, struktur\u00e1latlan&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,4,30,58],"tags":[],"class_list":["post-358","post","type-post","status-publish","format-standard","hentry","category-adatbazisok","category-szakmai-elet","category-sql-server","category-sql-server-2008"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/358","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=358"}],"version-history":[{"count":0,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/358\/revisions"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=358"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=358"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=358"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}