{"id":1516,"date":"2014-04-28T10:20:16","date_gmt":"2014-04-28T08:20:16","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=1516"},"modified":"2014-04-28T12:27:26","modified_gmt":"2014-04-28T10:27:26","slug":"sql-server-2014-ujdonsagok-3-in-memory-oltp-a-hash-indexek-belso-kezelese","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2014\/04\/28\/sql-server-2014-ujdonsagok-3-in-memory-oltp-a-hash-indexek-belso-kezelese\/","title":{"rendered":"SQL Server 2014 \u00fajdons\u00e1gok &#8211; 3. In-Memory OLTP &#8211; hash indexek bels\u0151 kezel\u00e9se"},"content":{"rendered":"<p>Az el\u0151z\u0151 r\u00e9sz index\u00e9re alapozva n\u00e9zz\u00fcnk meg k\u00e9t lek\u00e9rdez\u00e9st, hogyan tudja t\u00e1mogatni a hash index.<br \/>\nEl\u0151sz\u00f6r egy pontszer\u0171 lek\u00e9rdez\u00e9s, egyenl\u0151 oper\u00e1torral:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect * from Person.Person_InMem\r\nwhere ModifiedDate = '20120112'\r\n<\/pre>\n<p>V\u00e9grehajt\u00e1si terv:<br \/>\n<a href=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndeSeek.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndeSeek-300x230.png\" alt=\"HashIndeSeek\" width=\"300\" height=\"230\" class=\"alignnone size-medium wp-image-1510\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndeSeek-300x230.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndeSeek.png 529w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Sz\u00e9pen haszn\u00e1lja az indexet, seekel.<\/p>\n<p>Kisebb oper\u00e1tor eset\u00e9n:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect * from Person.Person_InMem\r\nwhere ModifiedDate &lt; '20120112'\r\n<\/pre>\n<p><a href=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndexScan.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndexScan-300x230.png\" alt=\"HashIndexScan\" width=\"300\" height=\"230\" class=\"alignnone size-medium wp-image-1511\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndexScan-300x230.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndexScan.png 529w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>K\u00e9nytelen v\u00e9gign\u00e9zni az \u00f6sszes sort, mivel a hash indexekkel nem lehet csak egyenl\u0151s\u00e9gre keresni, ez\u00e9rt a scan oper\u00e1tor a tervben.<\/p>\n<p>Az \u00f6sszetett hash indexek nem haszn\u00e1lhat\u00f3k kevesebb oszlopra sz\u0171r\u00e9sre, m\u00e9g akkor sem, ha az els\u0151 oszlopokb\u00f3l v\u00e1logatunk. Azaz egy FirstName, LastName \u00f6sszetett hash index csak egyszerre erre a k\u00e9t oszlopra k\u00e9pes seekelve sz\u0171rni, csak a FirstName-re nem, mivel a hash a k\u00e9t \u00e9rt\u00e9kre egy\u00fctt ker\u00fclt kisz\u00e1m\u00edt\u00e1sa, k\u00fcl\u00f6n nem \u00e9rtelmezhet\u0151.<\/p>\n<p>Hogyan t\u00e1rolja a szerver a hash indexeket?<\/p>\n<p><a href=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/InMemoryTableRow.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/InMemoryTableRow-300x133.png\" alt=\"InMemoryTableRow\" width=\"300\" height=\"133\" class=\"alignnone size-medium wp-image-1498\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/InMemoryTableRow-300x133.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/InMemoryTableRow-600x268.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/InMemoryTableRow-1024x457.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/InMemoryTableRow.png 1138w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Az \u00e1br\u00e1b\u00f3l l\u00e1tszik, hogy minden sor tartalmaz n * 8 byte-os pointert, minden egyes ilyen pointer egy indexehez tartozik.<br \/>\nA hash f\u00fcggv\u00e9ny alapj\u00e1n kiad\u00f3dik egy hash \u00e9rt\u00e9k, ezzel beleindexelnek a hash indexbe, ami egy sima line\u00e1ris t\u00f6mb. A t\u00f6mb adott eleme azaz egy v\u00f6dre r\u00e1mutat egy sorra. De mivel t\u00f6bb sornak is lehet azonos a hash-e az adott index kulcsa alapj\u00e1n, ezeket l\u00e1ncolj\u00e1k hozz\u00e1 az el\u0151z\u0151 sorhoz az index pointeren kereszt\u00fcl. N\u00e9zz\u00fck ezt meg egy \u00e1br\u00e1n:<\/p>\n<p><a href=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndices.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndices-300x113.png\" alt=\"HashIndices\" width=\"300\" height=\"113\" class=\"alignnone size-medium wp-image-1512\" srcset=\"https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndices-300x113.png 300w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndices-600x226.png 600w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndices-1024x386.png 1024w, https:\/\/soci.hu\/blog\/wp-content\/uploads\/2014\/04\/HashIndices.png 1447w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>A bogotai Susannak \u00e9s a b\u00e9csi Susannak is ugyanaz a hash-e, hisz azonos az \u00e9rt\u00e9k\u00fck. Az 5-\u00f6s v\u00f6d\u00f6r r\u00e1mutat az egyik sorra, majd onnan a sorb\u00f3l az els\u0151 index mutat\u00f3 kereszt\u00fcl lehet tov\u00e1bbmenni a k\u00f6vetkez\u0151 sorra (l\u00e1ncolt lista).<br \/>\nA 4-es Name hash eset\u00e9n a k\u00e9t Gregnek \u00e9s Jane-nek azonos a hashe, az\u00e9rt \u0151k h\u00e1rman lesznek \u00f6sszel\u00e1ncolva.<br \/>\nA City oszlopon l\u00e9trehozott hash index 6-ot rendelt hozz\u00e1 Liszabonhoz, Bogot\u00e1hoz \u00e9s B\u00e9cshez is, ez\u00e9rt \u0151k h\u00e1rman vannak \u00f6sszel\u00e1ncolva.<\/p>\n<p>Az \u00e1br\u00e1b\u00f3l l\u00e1that\u00f3, hogy a hash indexek nagyon hat\u00e9konyak, ha r\u00f6vid a l\u00e1ncolt list\u00e1juk, de mi a helyzet a m\u00f3dos\u00edt\u00e1ssal? Mi\u00e9rt nem akadnak \u00f6ssze a sz\u00e1lak, amikor pl. t\u00f6r\u00f6lnek egy sort a l\u00e1ncolt list\u00e1b\u00f3l? Hogyan oldj\u00e1k ezt meg lock n\u00e9lk\u00fcl? <\/p>\n<p>Minden m\u0171veletet a kor\u00e1bban m\u00e1r eml\u00edtett Compare Exchange-zsel oldanak meg. Ez egy 3 argumentum\u00fa m\u0171velet, a .NET doksib\u00f3l:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\npublic static T CompareExchange&lt;T&gt;(\r\n\tref T location1,\r\n\tT value,\r\n\tT comparand\r\n)\r\n<\/pre>\n<p>\u00d6sszehasonl\u00edtja a location1-et a comparanddal, \u00e9s ha egyeznek, akkor value-t belerakja location1-be. A visszat\u00e9r\u00e9si \u00e9rt\u00e9k a location1 eredeti \u00e9rt\u00e9ke, ez az\u00e9rt kell, hogy tudjuk, siker\u00fcl-e berakni value-t location1-be. Mindezt atomi m\u00f3don, a processzor t\u00e1mogat\u00e1s\u00e1val v\u00e9gzi a g\u00e9p.<\/p>\n<p>A k\u00f6vetkez\u0151 r\u00e9sz nat\u00edv spekul\u00e1ci\u00f3, doksiban nem l\u00e1ttam kir\u00e9szletezve.<\/p>\n<p>Tegy\u00fck fel k\u00e9t verseng\u0151 folyamat is be akar sz\u00farni egy-egy sort \u00fagy, hogy mindk\u00e9t sor ugyanabba a v\u00f6d\u00f6rbe esik. Tegy\u00fck fel a v\u00f6d\u00f6rben m\u00e1r van egy sor. Akkor ennek a sornak a k\u00f6vetkez\u0151 sorra mutat\u00f3 pointere null lesz.<br \/>\nBej\u00f6n az els\u0151 folyamat. L\u00e9trehozza az \u00faj sort a leveg\u0151ben. R\u00e1navig\u00e1l a hash index v\u00f6d\u00f6rb\u0151l az els\u0151 sorra, majd v\u00e9grehajt kb. egy ilyen k\u00f3dot:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\r\nCompareExchange(ref els\u0151 sor k\u00f6vetkez\u0151 pointere, a besz\u00farand\u00f3 sor c\u00edme, null)\r\n<\/pre>\n<p>Ha ez a folyamat volt a gyorsabb, akkor az els\u0151 sor k\u00f6vetkez\u0151 pointer\u00e9t nullk\u00e9nt l\u00e1tta, teh\u00e1t \u0151 tudja hozz\u00e1rendelni a sor\u00e1t a next pointerbe, \u0151 tudta mag\u00e1t bel\u00e1ncolni a sorba.<br \/>\nA lassabb folyamatnak m\u00e1r nem nullt l\u00e1t localtion1-ben, azaz az els\u0151 sor next pointer\u00e9ben, ezt \u00e9szreveszi abb\u00f3l, hogy a CompareExchange visszat\u00e9r\u00e9si \u00e9rt\u00e9ke nem null. Ilyenkor mit kell tennie? R\u00e1navig\u00e1lni a k\u00f6vetkez\u0151 (a m\u00e1sik \u00e1ltal az el\u0151bb besz\u00fart sorra), \u00e9s ott \u00fajra bepr\u00f3b\u00e1lkozni. El\u0151bb-ut\u00f3bb csak \u0151 is els\u0151 lesz.<br \/>\nMi\u00e9rt nagyon gyors ez a folyamat? Mert egy\u00e1ltal\u00e1n nincs z\u00e1rol\u00e1s nem hogy nagyobb felbont\u00e1ssal, lap szinten, de m\u00e9g sor szinten sem.<br \/>\nA t\u00f6rl\u00e9sek kezel\u00e9se m\u00e1r macer\u00e1sabb lenne, ha \u00edgy akarn\u00e1k megoldani. Csakhogy a t\u00f6rl\u00e9sek teljesen m\u00e1sk\u00e9pp mennek, mivel a snapshot izol\u00e1ci\u00f3s szint miatt meg kell tartani a sor kor\u00e1bbi verzi\u00f3j\u00e1t is, nem lehet csak \u00fagy kit\u00f6r\u00f6lni. Ennek megval\u00f3s\u00edt\u00e1s\u00e1r\u00f3l is lesz sz\u00f3 a p\u00e1rhuzamoss\u00e1gr\u00f3l sz\u00f3l\u00f3 r\u00e9szben, de el\u0151tte m\u00e9g megn\u00e9zz\u00fck a norm\u00e1l indexek hogyan m\u0171k\u00f6dnek, a k\u00f6vetkez\u0151 r\u00e9szben.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Az el\u0151z\u0151 r\u00e9sz index\u00e9re alapozva n\u00e9zz\u00fcnk meg k\u00e9t lek\u00e9rdez\u00e9st, hogyan tudja t\u00e1mogatni a hash index. El\u0151sz\u00f6r egy pontszer\u0171 lek\u00e9rdez\u00e9s, egyenl\u0151 oper\u00e1torral: select&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,4,30,87],"tags":[],"class_list":["post-1516","post","type-post","status-publish","format-standard","hentry","category-adatbazisok","category-szakmai-elet","category-sql-server","category-sql-server-2014"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1516","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=1516"}],"version-history":[{"count":7,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1516\/revisions"}],"predecessor-version":[{"id":1571,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1516\/revisions\/1571"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=1516"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=1516"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=1516"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}