{"id":451,"date":"2008-02-13T01:00:01","date_gmt":"2008-02-13T00:00:01","guid":{"rendered":"http:\/\/soci.hu\/blog\/index.php\/2008\/02\/13\/sql-server-2008-ujdonsagok-20-terbeli-adattipusok-7\/"},"modified":"2008-02-14T09:34:46","modified_gmt":"2008-02-14T08:34:46","slug":"sql-server-2008-ujdonsagok-20-terbeli-adattipusok-7","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2008\/02\/13\/sql-server-2008-ujdonsagok-20-terbeli-adattipusok-7\/","title":{"rendered":"SQL Server 2008 \u00fajdons\u00e1gok 20. &#8211; t\u00e9rbeli adatt\u00edpusok 7."},"content":{"rendered":"<p>N\u00e9mi kihagy\u00e1s ut\u00e1n (d\u00f3gozni is kell, meg a gyerekeknek gy\u00f3gyulni) kicsit foglalkozzunk m\u00e9g a spatial adatokkal. Az eddigi r\u00e9szekben elj\u00e1tszadoztunk vel\u00fck, sz\u00e9p volt, csak arr\u00f3l nem volt sz\u00f3, hogy m\u0171k\u00f6dik ez az eg\u00e9sz, ha sok adatban kell keresg\u00e9lni? Alapban sok m\u0171velet piszok id\u0151ig\u00e9nyes, mindenk\u00e9ppen sz\u00fcks\u00e9g lenne valamilyen indexel\u00e9si m\u00f3dszerre. De ezek az adatok messze nem olyan egyszer\u0171en indexelhet\u0151k, mint mondjuk egy varchar.<\/p>\n<p>A spatial index maga most is egy B* fa, csak a kih\u00edv\u00e1s, hogyan lehet alakzatok adatait \u00fagy \u00e1tmassz\u00edrozni valami bin\u00e1ris adathalmazz\u00e1, ami azt\u00e1n meggyos\u00edthat bizonyos m\u0171veleteket, p\u00e9ld\u00e1ul t\u00e1vols\u00e1gsz\u00e1m\u00edt\u00e1st vagy metszet meghat\u00e1roz\u00e1s\u00e1t.<\/p>\n<p>Az index m\u0171k\u00f6d\u00e9s\u00e9t <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/bb964712(SQL.100).aspx\">itt r\u00e9szletezik<\/a>. A cikket olvasva meglehet\u0151sen bizarr dolog t\u00e1rul a szem\u00fcnk el\u00e9, amelyb\u0151l j\u00f3l l\u00e1tszik, hogy a spatial t\u00e1mogat\u00e1s messze t\u00f6bb, mint egy \u00faj CLR UDT.<\/p>\n<p>Az els\u0151 dolog, amit fogni kell, hogy a spatial indexek nem olyan egzaktak, mint amiket eddig l\u00e1ttunk. A r\u00e9szletek mell\u0151z\u00e9s\u00e9vel a k\u00f6vetkez\u0151r\u0151l van sz\u00f3.<br \/>\nA s\u00edkot felbontj\u00e1k cell\u00e1kra, mint amikor &#8220;kock\u00e1s&#8221; pap\u00edrra rajzolunk. Az alakzatok ezekre a n\u00e9gyzetekre vannak fektetve. Minden cell\u00e1t tov\u00e1bbi cell\u00e1kra bonthatjuk, \u00e9s ott is meghat\u00e1rozhatjuk, mely al-cell\u00e1kban van m\u00e9g benne egy alakzat, \u00e9s melyben nincs. Ez a dekompoz\u00edci\u00f3t max. 4 szinten folytatj\u00e1k, \u00edgy egyre finomabb felbont\u00e1sban gy\u0171jtenek inform\u00e1ci\u00f3t az alakzatr\u00f3l. Hogy ne szabaduljonak el az adatok, vannak szab\u00e1lyok, amelyek korl\u00e1tozz\u00e1k az adatmennyis\u00e9geket.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/technet.microsoft.com\/en-us\/library\/Bb964712.ad7b2688-8006-4926-a728-63a81ecc0ec5(en-us,SQL.100).gif\" alt=\"A s\u00edk feldarabol\u00e1sa az index l\u00e9trehoz\u00e1s\u00e1hoz\" \/><\/p>\n<p>\u00c9rezhet\u0151, hogy be kell hat\u00e1rolni a &#8220;kock\u00e1s pap\u00edr&#8221; m\u00e9ret\u00e9t, hogy v\u00e9ges m\u00e9ret\u0171 legyen az index, erre az index l\u00e9trehoz\u00e1sakor van lehet\u0151s\u00e9g. Ez azonban csak a geometry t\u00edpusra vonatkozik, a geographyn\u00e1l v\u00e9ges a ter\u00fclet\u00fcnk, hisz a F\u00f6ld felsz\u00edn\u00e9r\u0151l van sz\u00f3.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/technet.microsoft.com\/en-us\/library\/Bb964712.cc805492-1e9d-49f9-aee3-b809af503d18(en-us,SQL.100).gif\" alt=\"\" \/><\/p>\n<p>A geography t\u00edpus ellipszoid adatin\u00e1l m\u00e9g cifr\u00e1bb a helyzet, azokat levet\u00edtik s\u00edkba, \u00e9s \u00fagy dolgoznak vele.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/technet.microsoft.com\/en-us\/library\/Bb964712.57bcf264-208e-4c92-9445-d5b7b0b30d68(en-us,SQL.100).gif\" alt=\"F\u00f6ldi koordin\u00e1t\u00e1k levet\u00edt\u00e9se indexel\u00e9shez\" \/><\/p>\n<p>A val\u00f3s\u00e1g persze sokkal \u00f6sszetettebb, de nem vagyunk t\u00e9rk\u00e9p\u00e9szek, \u00edgy legyen el\u00e9g ennyi. :)<\/p>\n<p>Mire j\u00f3 ezek ut\u00e1n egy spatial index? <a href=\"http:\/\/technet.microsoft.com\/en-us\/library\/bb933796(SQL.100).aspx\">Megfelel\u0151 k\u00f6r\u00fclm\u00e9nyek k\u00f6z\u00f6tt<\/a> az STIntersects(), STEquals(), \u00e9s STDistance() met\u00f3dusokat meg tudja t\u00e1mogatni egy spatial index.<\/p>\n<p>Tegy\u00fcnk vele egy pr\u00f3b\u00e1t!<\/p>\n<p>Az el\u0151z\u0151 r\u00e9szben a Dun\u00e1hoz k\u00f6zel es\u0151 v\u00e1rosokat kerest\u00fck meg, n\u00e9zz\u00fck meg ezt index t\u00e1mogat\u00e1ssal!<\/p>\n<p>A t\u00e1bl\u00e1ban a v\u00e1rosok multi-pontk\u00e9nt vannak felv\u00e9ve, pedig mindegyik csak 1 pontb\u00f3l \u00e1ll. Konvert\u00e1ljuk \u00e1t \u0151ket igazi pontt\u00e1, hogy minden m\u0171velet rendesen menjen rajtuk:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nupdate City\r\nset geom = geom.STStartPoint()\r\n\r\nselect\r\nCITY_NAME, geom.ToString()\r\nfrom City\r\n<\/pre>\n<p>\u00cdgy az alapadataink:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nKosice                                             POINT (48.70000118311 21.2500004483)\r\nRijeka                                             POINT (45.333301183109988 14.433300448300003)\r\nLodz                                               POINT (51.778000183109988 19.4759994483)\r\nKalisz                                             POINT (51.757999183109995 18.083000448299998)\r\nSieradz                                            POINT (51.59600018311 18.732999448300006)\r\nPiotrkow Trybunalski                               POINT (51.409000183109988 19.691000448300002)\r\nRadom                                              POINT (51.39600018311 21.158000448299987)\r\nLublin                                             POINT (51.24200018311 22.577999448300005)\r\n...\r\n<\/pre>\n<p>Vegy\u00fck el\u0151 kor\u00e1bbi p\u00e9ld\u00e1nkat, a Dun\u00e1hoz 10 km-n\u00e9l k\u00f6zelebbi v\u00e1rosok list\u00e1j\u00e1t.<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\ndeclare @danube geography = geography::STPointFromText(&#039;POINT(0 0)&#039;, 4326);\r\n\r\nselect @danube = @danube.STUnion(geom)\r\nfrom River where NAME = N&#039;Danube&#039;\r\n\r\nselect CITY_NAME, \r\ngeom.ToString() &#039;A v\u00e1ros&#039;, \r\ngeom.STDistance(@danube) &#039;T\u00e1vols\u00e1g a foly\u00f3t\u00f3l&#039; \r\nfrom City\r\nwhere geom.STDistance(@danube) &lt; 10000\r\n&amp;#91;\/source&amp;#93;\r\n\r\nA v\u00e9grehajt\u00e1si terv:\r\n\r\n&lt;a href=&#039;http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/02\/spatialopwithoutindex.png&#039; title=&#039;spatialopwithoutindex.png&#039; target=&#039;_blank&#039;&gt;&lt;img src=&#039;http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/02\/spatialopwithoutindex.png&#039; alt=&#039;spatialopwithoutindex.png&#039; \/&gt;&lt;\/a&gt;\r\n\r\nNo, a Filternek kellene kiesni vagy legal\u00e1bbis a k\u00f6lts\u00e9g\u00e9nek cs\u00f6kkeni az index hat\u00e1s\u00e1ra. Az alap be\u00e1ll\u00edt\u00e1sokkal hozzunk l\u00e9tre egy spatial indexet:\r\n\r\n&#x5B;source=&#039;sql&#039;]\r\ncreate spatial index idx_City_Spatial_1\r\non City(geom)\r\n<\/pre>\n<p>Elvileg ett\u0151l m\u00e1s lehetne a kor\u00e1bbi lek\u00e9rdez\u00e9s v\u00e9grehajt\u00e1si terve. De nem lesz az. Annyira kicsit a t\u00e1bl\u00e1nk (p\u00e1r 10 sor), hogy esze \u00e1g\u00e1ban sincs haszn\u00e1lni egy mozaikos, r\u00e1csos ide-oda vet\u00edtett indexet, a sima Filter jobban meg\u00e9ri neki.<\/p>\n<p>Nagyobb adatmennyis\u00e9gre van sz\u00fcks\u00e9g\u00fcnk. Mivel szabad informatikai adatok ter\u00e9n (meg m\u00e1s t\u00e9ren is) Magyarorsz\u00e1g a b\u00e9ka segge alatt van, szedj\u00fcnk \u00f6ssze n\u00e9mi adatot Amerik\u00e1b\u00f3l. <a href=\"http:\/\/www.bts.gov\/publications\/national_transportation_atlas_database\/2006\/\">Itt let\u00f6lthet\u0151<\/a> sok izgalmas inf\u00f3. P\u00e9ld\u00e1ul a <a href=\"http:\/\/www.bts.gov\/publications\/national_transportation_atlas_database\/2006\/zip\/place2000.zip\">telep\u00fcl\u00e9sek list\u00e1ja, koordin\u00e1t\u00e1i<\/a> meg\u00e9rnek egy mis\u00e9t. Ez bet\u00f6lt\u00f6ttem a USCity t\u00e1bl\u00e1ba, 35432 sor lett.<\/p>\n<p>Keress\u00fck meg azokat a v\u00e1rosokat, amelyek Los Angeles 10 km-es k\u00f6rzet\u00e9ben vannak:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\ndeclare @la geography = (select geom\r\nfrom USCity\r\nwhere name = &#039;Los Angeles&#039; \r\nand County = &#039;Los Angeles County&#039;)\r\n\r\nselect name\r\nfrom USCity\r\nwhere geom.STDistance(@la) &lt; 10000\r\n&amp;#91;\/source&amp;#93;\r\n\r\nNem kellene lok\u00e1lis v\u00e1ltoz\u00f3t bevezetni, de \u00edgy sz\u00e9tv\u00e1lik a v\u00e9grehajt\u00e1si terv, \u00edgy jobban l\u00e1tszik az index hat\u00e1sa.\r\n\r\nA kimenet:\r\n&amp;#91;source=&#039;c&#039;&amp;#93;\r\nLos Angeles\r\nCity Terrace\r\nEast Los Angeles\r\nVernon\r\nCommerce\r\nHuntington Park\r\nMaywood\r\nFlorence\r\nBell\r\nWalnut Park\r\n&amp;#91;\/source&amp;#93;\r\n\r\nIndex n\u00e9lk\u00fcl a v\u00e9grehajt\u00e1s \u00e1tlagban 2800 ms-ot vesz ig\u00e9nybe, ebb\u0151l kb. 2000 a CPU k\u00f6lts\u00e9g, azaz igen er\u0151sen processzor intenz\u00edv a sz\u0171r\u00e9s. A lapolvas\u00e1sok sz\u00e1ma 1850.\r\n\r\nRakjunk r\u00e1 egy spatial indexet!\r\n\r\n&amp;#91;source=&#039;sql&#039;&amp;#93;\r\ncreate spatial index idx_USCity_Spatial_1\r\non USCity(geom)\r\n&amp;#91;\/source&amp;#93;\r\n\r\nA v\u00e9grehajt\u00e1si id\u0151 leesik 160ms-ra! A lapolvas\u00e1sok sz\u00e1ma 1720 lett, azaz ebben nem lett jelent\u0151s k\u00fcl\u00f6nbs\u00e9g, de a CPU id\u0151 leesett kb. 50 ms-ra, 2000-r\u0151l. Az\u00e9rt ez igen nagy nyeres\u00e9g.\r\n\r\nAz index n\u00e9lk\u00fcli v\u00e9grehajt\u00e1si terv:\r\n\r\n&lt;a href=&#039;http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/02\/spatialopwithoutindex2.png&#039; title=&#039;Spatial sz\u0171r\u00e9s index n\u00e9lk\u00fcl&#039; target=&#039;_blank&#039;&gt;&lt;img src=&#039;http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/02\/spatialopwithoutindex2.png&#039; alt=&#039;Spatial sz\u0171r\u00e9s index n\u00e9lk\u00fcl&#039; \/&gt;&lt;\/a&gt;\r\n\r\nAz el\u0151bbi index-szel:\r\n\r\n&lt;a href=&#039;http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/02\/spatialopwithdefaultindex2.png&#039; title=&#039;Spatial sz\u0171r\u00e9s alap index-szel&#039; target=&#039;_blank&#039;&gt;&lt;img src=&#039;http:\/\/soci.hu\/blog\/wp-content\/uploads\/2008\/02\/spatialopwithdefaultindex2.png&#039; alt=&#039;Spatial sz\u0171r\u00e9s alap index-szel&#039; \/&gt;&lt;\/a&gt;\r\n\r\nA jobb als\u00f3 Clustered Index Seek \u00e9rdekes. A Seek Predicate-je a k\u00f6vetkez\u0151:\r\n\r\n&#x5B;source=&#039;c&#039;]\r\nSeek Keys&#x5B;1]: Start: &#x5B;AdventureWorks].&#x5B;sys].&#x5B;extended_index_80719340_64000].Cell_Id &gt;= Scalar Operator(&#x5B;Expr1009]), \r\nEnd: &#x5B;AdventureWorks].&#x5B;sys].&#x5B;extended_index_80719340_64000].Cell_Id &lt;= Scalar Operator(&amp;#91;Expr1010&amp;#93;)\r\n&amp;#91;\/source&amp;#93;\r\n\r\nAzaz, az XML Shredinghez hasonl\u00f3an itt is fel\u00e9p\u00edtenek egy seg\u00e9dt\u00e1bl\u00e1t az index r\u00e9sz\u00e9re, \u00e9s abban keresnek. A seg\u00e9dt\u00e1bla neve: &amp;#91;sys&amp;#93;.&amp;#91;extended_index_80719340_64000&amp;#93;.\r\nAzonnal k\u00eds\u00e9rt\u00e9st \u00e9rz\u00fcnk pesze, hogy belen\u00e9zz\u00fcnk:\r\n\r\n&amp;#91;source=&#039;sql&#039;&amp;#93;\r\nselect * from &amp;#91;sys&amp;#93;.&amp;#91;extended_index_80719340_64000&amp;#93;\r\n&amp;#91;\/source&amp;#93;\r\n\r\nMeg is kapjuk a magunk\u00e9t:\r\n\r\n&amp;#91;source=&#039;c&#039;&amp;#93;\r\nMsg 208, Level 16, State 1, Line 1\r\nInvalid object name &#039;sys.extended_index_80719340_64000&#039;.\r\n&amp;#91;\/source&amp;#93;\r\n\r\nNa ne hazudjunk k\u00e9rem, menj\u00fcnk csak be a DAC kapcsolaton keresz\u00fcl (ADMIN:g\u00e9pn\u00e9v\\instance n\u00e9v):\r\n\r\n&amp;#91;source=&#039;c&#039;&amp;#93;\r\nCell_Id      Cell_Attributes SRID        pk0\r\n------------ --------------- ----------- -----------\r\n0x200A2A2C04 1               4326        34751\r\n0x200A2A3C04 1               4326        34756\r\n0x200A2B3404 1               4326        34762\r\n0x200A2B3704 1               4326        34763\r\n0x200A2B3804 1               4326        34764\r\n...\r\n&amp;#91;\/source&amp;#93;\r\n\r\nEbben az index t\u00e1bl\u00e1ban pont annyi sor van, mint az eredetiben, \u00e9s a pk0 oszlop teremt kapcsolatot a kett\u0151 k\u00f6z\u00f6tt, a v\u00e9grehajt\u00e1si tervben a bal oldali Merge Join illeszti a kett\u0151t \u00f6ssze, im\u00edgyen: \r\n\r\n&amp;#91;source=&#039;c&#039;&amp;#93;\r\n(&amp;#91;AdventureWorks&amp;#93;.&amp;#91;dbo&amp;#93;.&amp;#91;USCity&amp;#93;.ID) = \r\n(&amp;#91;AdventureWorks&amp;#93;.&amp;#91;sys&amp;#93;.&amp;#91;extended_index_80719340_64000&amp;#93;.pk0)\r\n&amp;#91;\/source&amp;#93;\r\n\r\nAz SRID oszlop ismer\u0151s lehet, az az adatunk SRID-je, volt m\u00e1r r\u00f3la sz\u00f3 az &lt;a href=&quot;http:\/\/soci.hu\/blog\/index.php\/2008\/01\/21\/sql-server-2008-ujdonsagok-14-terbeli-adattipusok-1\/&quot;&gt;els\u0151 r\u00e9szben&lt;\/a&gt;. Az els\u0151 k\u00e9t oszlop jelent\u00e9se egyel\u0151re ismeretlen.\r\n\r\nVess\u00fck \u00f6ssze amit a h\u00e1ts\u00f3 ny\u00edl\u00e1son \u00e1t felfedezt\u00fcnk a hivatalosan is l\u00e1that\u00f3 inf\u00f3val!\r\n\r\n&#x5B;source=&#039;sql&#039;]\r\nselect name, spatial_index_type_desc, tessellation_scheme\r\nfrom sys.spatial_indexes\r\nwhere object_id = object_id(&#039;USCity&#039;)\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nname                                               spatial_index_type_desc                            tessellation_scheme\r\n-------------------------------------------------- -------------------------------------------------- --------------------------------------------------\r\nidx_USCity_Spatial_1                               GEOGRAPHY                                          GEOGRAPHY_GRID\r\n<\/pre>\n<p>Az index lehet GEOGRAPHY vagy GEOMETRY, nyilv\u00e1n az oszlop t\u00edpus\u00e1t\u00f3l f\u00fcgg\u0151en. A tessellation_scheme a mozaikoz\u00e1s m\u00f3dszer\u00e9t \u00edrja le, ez az a folyamat, amiben egyre kisebb cell\u00e1kra osztj\u00e1k fel az indexelend\u0151 tartom\u00e1nyt. A GEOGRAPHY_GRID az a piramisos, kifeketet\u0151s s\u00e9ma, ami l\u00e1that\u00f3 volt a kor\u00e1bbi rajzon.<br \/>\nNo, ezekt\u0151l az adatokt\u00f3l nem lett\u00fcnk sokkal okosabbak.<\/p>\n<p>N\u00e9zz\u00fck meg a m\u00e1sik rendszer-n\u00e9zetet:<\/p>\n<pre class=\"brush: sql; title: ; notranslate\" title=\"\">\r\nselect * from sys.spatial_index_tessellations\r\nwhere object_id = object_id(&#039;USCity&#039;)\r\n<\/pre>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nobject_id   index_id    tessellation_scheme            bounding_box_xmin      bounding_box_ymin      bounding_box_xmax      bounding_box_ymax      level_1_grid level_1_grid_desc              level_2_grid level_2_grid_desc              level_3_grid level_3_grid_desc              level_4_grid level_4_grid_desc              cells_per_object\r\n----------- ----------- ------------------------------ ---------------------- ---------------------- ---------------------- ---------------------- ------------ ------------------------------ ------------ ------------------------------ ------------ ------------------------------ ------------ ------------------------------ ----------------\r\n80719340    64000       GEOGRAPHY_GRID                 NULL                   NULL                   NULL                   NULL                   64           MEDIUM                         64           MEDIUM                         64           MEDIUM                         64           MEDIUM                         16\r\n<\/pre>\n<p>Ez m\u00e1r \u00e9rdekesebb. A bounding_boxok nullok, mert mint \u00edrtam, nem kell hat\u00e1rokat adni a geography indexnek, a F\u00f6ld fel\u00fclete v\u00e9ges hat\u00e1rt alkot. A level_1_grid 64 \u00e9s a level_1_grid_desc MEDIUM ugyanazt mondja, hogy 8&#215;8-as a legdurv\u00e1bb felbont\u00e1s\u00fa r\u00e1csozat. Az\u00e9rt az el\u00e9g nagy, az eg\u00e9sz \u00e9szaki (\u00e9s d\u00e9li) f\u00e9lteke 64 r\u00e9szre van felbontva. Ok, de van m\u00e9g 3 szint. Ez azt jelenti, hogy csak sz\u00e9less\u00e9gben sz\u00e1molva 8^4-en = 4096 r\u00e9szre van osztva a F\u00f6ld. Az egyenl\u00edt\u0151 kb. 40e km hossz\u00fa, ez\u00e9rt ez az index kb. 10 km-es r\u00e9szekre v\u00e1gja fel. <\/p>\n<p>Update: egy <a href=\"http:\/\/sqlblogcasts.com\/blogs\/simons\/\">MVP koll\u00e9ga, Simon Sabin<\/a> jelezte, hogy nem 10km a default index felbont\u00e1s, hanem 2.5km. Ez az\u00e9rt van, mert az egyenl\u00edt\u0151t a fenti piramisos \u00e1bra alapj\u00e1n a r\u00e1cs ker\u00fclet\u00e9re vet\u00edtik le, ami n\u00e9gyszer olyan hossz\u00fa, mint egy oldal, \u00e9n pedig egy oldalra sz\u00e1moltam a felbont\u00e1st.<\/p>\n<p>Ez az\u00e9rt el\u00e9g durva felbont\u00e1s, f\u0151leg, mivel pont ebben a nagys\u00e1grendben sz\u0171rt\u00fcnk a seg\u00edts\u00e9g\u00e9vel. Ennek ellen\u00e9re nem lettek fals adatok a kimenetben. Mi\u00e9rt? A v\u00e9grehajt\u00e1si terv bal als\u00f3 r\u00e9sz\u00e9n van egy Filter oper\u00e1tor. Ez arra sz\u0171r, hogy:<\/p>\n<p>[AdventureWorks].[dbo].[USCity].[geom].STDistance([@la])<(1.000000000000000e+004)\n[\/source]\n\nA bal oldali Merge Join-b\u00f3l 20 sor potyog ki, val\u00f3j\u00e1ban ennyit adott vissza az index, mivel durva a felbont\u00e1sa. A Filter \u00e9s Nested Loop Join ut\u00e1n m\u00e1r csak 10 sor maradt, ami m\u00e1r a helyes kimenet. Azaz igaz, hogy az index durva felbont\u00e1sa miatt j\u00f6ttek be felesleges sorok, de nem baj, 20 sorb\u00f3l m\u00e9gis csak k\u00f6nnyeb kiv\u00e1lasztani a j\u00f3kat a lass\u00fa f\u00fcggv\u00e9ny (STDistance) t\u00e9nyleges v\u00e9grehajt\u00e1s\u00e1val, mint az eredeti 34000-b\u0151l.\n\nFinomkodjunk! Hozzuk l\u00e9tre a maxim\u00e1lis felbont\u00e1s\u00fa indexet! \n\n[source='sql']\ncreate spatial index idx_USCity_Spatial_2\non USCity(geom)\nusing geography_grid\nwith \n(\n    grids = (high, high, high, high)\n    --,cells_per_object = 64\n);\n[\/source]\n\nHa az el\u0151z\u0151, medium index is rajta van a t\u00e1bl\u00e1n, akkor a szerver nem haszn\u00e1lja ezt azt indexet, mert nem \u00e9ri meg neki. Ledobva az el\u0151z\u0151t vagy index hinttel r\u00e1er\u0151szakolva erre a v\u00e9grehajt\u00e1si id\u0151 160 ms k\u00f6r\u00fcl alakul, ami kb. azonos az el\u0151z\u0151 indexelt megold\u00e1ssal. Azonban a lapolvas\u00e1sok sz\u00e1ma az ottani 1700-r\u00f3l felugrott 4800-ra, ami nem meglep\u0151, hisz jelent\u0151sen t\u00f6bb adat t\u00e1rol az indext\u00e1bla.\n\nA v\u00e9grehajt\u00e1si tervben az index r\u00e9v\u00e9n 12 sor j\u00f6n vissza, azaz csak 2 a potya sor, k\u00f6sz\u00f6nhet\u0151 a finom felbont\u00e1s\u00fa indexnek.\nEllenpr\u00f3bak\u00e9nt csin\u00e1ltam egy low, low, low, low durva felbont\u00e1s\u00fa indexet is, ebben 4x4-esek a r\u00e1csok szintenk\u00e9nt. Ekkor az index 148 sort v\u00e1logat le, ebb\u0151l sz\u0171rik le a t\u00e9nyleges 10-et. Ennek v\u00e9grehajt\u00e1si teljes\u00edtm\u00e9nymutat\u00f3i nagyon hasonl\u00f3ak az els\u0151 index\u00e9hez. Val\u00f3sz\u00edn\u0171leg ha s\u0171r\u0171 elhelyezked\u00e9s\u0171 adatokr\u00f3l lenne sz\u00f3 (pl. nem v\u00e1rosok, hanem v\u00e1roson bel\u00fcli h\u00e1zak), akkor viszont egy finomabb index \u00e9rn\u00e9 meg, a durva miatt t\u00fal sok adatot kellene lass\u00fa m\u00f3don sz\u0171rni a szervernek.\n\n\u00d6sszegezve l\u00e1that\u00f3, hogy sz\u00e9pen lehet j\u00e1tszani, hogy az adatok eloszl\u00e1s\u00e1nak megfelel\u0151en milyen felbont\u00e1s\u00fa indexet hozunk l\u00e9tre a spatial adatainknak, \u00edgy j\u00e1tszthatunk az IO \u00e9s a CPU k\u00f6lts\u00e9g k\u00f6z\u00f6tt valamif\u00e9le optimumra. T\u00f6k sz\u00e9p otimaliz\u00e1l\u00e1si munka lehet ez.\n\n\u00c9s ezennel a spatial adatokr\u00f3l sz\u00f3l\u00f3 \u00fajdons\u00e1gokat lez\u00e1rom, eleget besz\u00e9ltem m\u00e1r r\u00f3luk. L\u00e1that\u00f3, hogy valami teljesen \u00faj, nagyon izgalmas dolog k\u00f6lt\u00f6z\u00f6tt be az SQL Serverbe, amivel olyan alkalmaz\u00e1sokat \u00edrhatunk, amit el\u0151tte nagyon neh\u00e9z lett volna hat\u00e9konyan implement\u00e1lni egy sima rel\u00e1ci\u00f3s motoron. \n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>N\u00e9mi kihagy\u00e1s ut\u00e1n (d\u00f3gozni is kell, meg a gyerekeknek gy\u00f3gyulni) kicsit foglalkozzunk m\u00e9g a spatial adatokkal. Az eddigi r\u00e9szekben elj\u00e1tszadoztunk vel\u00fck, sz\u00e9p&#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-451","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\/451","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=451"}],"version-history":[{"count":0,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/451\/revisions"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}