{"id":116,"date":"2013-03-29T15:54:01","date_gmt":"2013-03-29T14:54:01","guid":{"rendered":"http:\/\/explainit.pl\/blog\/?p=116"},"modified":"2016-08-14T10:08:49","modified_gmt":"2016-08-14T08:08:49","slug":"eksperymenty-z-cursor_sharing","status":"publish","type":"post","link":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/","title":{"rendered":"Eksperymenty z CURSOR_SHARING"},"content":{"rendered":"<p>Jednym z bardziej popularnych parametr\u00f3w konfiguracyjnych jest CURSOR_SHARING, umo\u017cliwiaj\u0105cy sterowanie wsp\u00f3\u0142dzieleniem kursor\u00f3w i plan\u00f3w wykonania zapyta\u0144 (pojawi\u0142 si\u0119 w 8.1.6). Mo\u017ce przyj\u0105\u0107 jedn\u0105 z trzech warto\u015bci: EXACT (domy\u015blna), SIMILAR, FORCE, przy czym Oracle zapowiedzia\u0142 wycofanie opcji SIMILAR (ju\u017c nawet w wersji 11g [og\u0142oszenie ID 1169017.1], jednak jest nadal dost\u0119pna). Parametr CURSOR_SHARING jest reklamowany jako lekarstwo na problemy wydajno\u015bciowe powodowane przez niesfornych programist\u00f3w, kt\u00f3rzy w cz\u0119sto wykonywanych zapytaniach SQL stosuj\u0105 litera\u0142y zamiast zmiennych wi\u0105zanych (bind variables). \u00a0Proponuj\u0119 bli\u017csze przyjrzenie si\u0119 skutkom r\u00f3\u017cnych ustawie\u0144 tego parametru. B\u0119dziemy korzysta\u0107 z tabeli ARMIA pochodz\u0105cej z mojego wcze\u015bniejszego wpisu [<a title=\"Dlaczego 99 ze 100 to 1%?\" href=\"https:\/\/explainit.pl\/blog\/?p=17\">Dlaczego 99 ze 100 to 1%?<\/a>], z dodatkowym indeksem na kolumnie PLEC \u00a0licz\u0105cej 12800 rekord\u00f3w.<\/p>\n<p><strong>CURSOR_SHARING=EXACT<\/strong><\/p>\n<p>Takie ustawienie oznacza, \u017ce dla polece\u0144 SQL r\u00f3\u017cni\u0105cych si\u0119 litera\u0142ami tworzone b\u0119d\u0105 w Library Cache oddzielne kursory i oddzielne plany wykonania zapytania. To znaczy, \u017ce gdy programista wykona nast\u0119puj\u0105ce dwa polecenia SQL:<\/p>\n<p><code>select count(*) from armia where plec = \u2019M\u2019;<br \/>\nselect count(*) from armia where plec = \u2019K\u2019;<br \/>\n<\/code><\/p>\n<p>to serwer potraktuje je jako zupe\u0142nie r\u00f3\u017cne, co spowoduje utworzenie dw\u00f3ch kursor\u00f3w w Library Cache i dwukrotn\u0105 kompilacj\u0119 (optymalizacj\u0119). Z ka\u017cdym kursorem zwi\u0105zany b\u0119dzie oddzielny plan wykonania zapytania. Przeanalizujmy poni\u017cszy eksperyment:<\/p>\n<p><code>SQL&gt; alter session set cursor_sharing=exact;<br \/>\nSQL&gt; select count(*) from armia where plec = \u2019M\u2019;<br \/>\n...<br \/>\nSQL&gt; select * from table (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));<br \/>\n...<br \/>\n---------------------------------------------<br \/>\n| Id\u00a0 | Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Name\u00a0 | E-Rows |<br \/>\n---------------------------------------------<br \/>\n|\u00a0\u00a0 0 | SELECT STATEMENT\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|\u00a0\u00a0 1 |\u00a0 SORT AGGREGATE\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0 1 |<br \/>\n|*\u00a0 2 |\u00a0\u00a0 TABLE ACCESS FULL| ARMIA |\u00a0 12672 |<br \/>\n---------------------------------------------<br \/>\n...<br \/>\nSQL&gt; select count(*) from armia where plec = \u2018K\u2019;<br \/>\n...<br \/>\nSQL&gt; select * from table (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));<br \/>\n...<br \/>\n------------------------------------------------<br \/>\n| Id\u00a0 | Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Name\u00a0\u00a0\u00a0\u00a0\u00a0 | E-Rows |<br \/>\n------------------------------------------------<br \/>\n|\u00a0\u00a0 0 | SELECT STATEMENT\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|\u00a0\u00a0 1 |\u00a0 SORT AGGREGATE\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0 1 |<br \/>\n|*\u00a0 2 |\u00a0\u00a0 INDEX RANGE SCAN| ARMIA_IDX |\u00a0\u00a0\u00a0 128 |<br \/>\n------------------------------------------------<br \/>\n...<br \/>\nSQL&gt; select SQL_TEXT , SQL_ID, VERSION_COUNT,<br \/>\nHASH_VALUE,PLAN_HASH_VALUE\u00a0\u00a0 from V$SQLAREA<br \/>\nwhere LOWER(SQL_TEXT) like \u2018select count(*) from armia%';<\/code><\/p>\n<p><code>SQL_TEXT \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0SQL_ID \u00a0 \u00a0 \u00a0 \u00a0VERSION_COUNT HASH_VALUE PLAN_HASH_VALUE<br \/>\n------------------------------------------- ------------- ------------- ---------- ---------------<br \/>\nselect count(*) from armia where plec = 'M' 4q6wz57b6khpk\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1 3597222578\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 348857963<br \/>\nselect count(*) from armia where plec = 'K' bk29hwbdjvy0p\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1 3676174357\u00a0\u00a0\u00a0\u00a0\u00a0 2060897835<\/code><\/p>\n<p>Wynik ostatniego zapytania pokazuje, \u017ce ka\u017cde z dw\u00f3ch polece\u0144 SQL to oddzielny kursor i ka\u017cdy kursor posiada oddzielny plan.<\/p>\n<p><strong>CURSOR_SHARING=FORCE<\/strong><\/p>\n<p>Takie ustawienie oznacza, \u017ce polecenia\u00a0 SQL zawieraj\u0105ce litera\u0142y zostan\u0105 automatycznie przetransformowane do postaci wykorzystuj\u0105cej zmienne wi\u0105zane (zmienne te otrzymaj\u0105 automatycznie generowane nazwy: SYS_B_0, SYS_B_1, itd.). W rezultacie, polecenia SQL r\u00f3\u017cni\u0105ce si\u0119 wy\u0142\u0105cznie litera\u0142ami zostan\u0105 potraktowane przez serwer jako to samo polecenie \u2013 w Library Cache pojawi si\u0119 jeden kursor. To znaczy, \u017ce gdy programista wykona nast\u0119puj\u0105ce dwa polecenia SQL:<\/p>\n<p><code>select count(*) from armia where plec = \u2019M\u2019;<br \/>\nselect count(*) from armia where plec = \u2019K\u2019;<br \/>\n<\/code><\/p>\n<p>to serwer przetransformuje je do postaci:<\/p>\n<p><code>select count(*) from armia where plec = :zmienna_wi\u0105zana;<\/code><\/p>\n<p>Przeanalizujmy poni\u017cszy eksperyment:<\/p>\n<p><code>SQL&gt; alter system flush shared_pool;<br \/>\nSQL&gt; alter session set cursor_sharing=force;<br \/>\nSQL&gt; select count(*) from armia where plec = 'K';<br \/>\n...<br \/>\nSQL&gt; select * from table (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));<br \/>\n...<br \/>\n------------------------------------------------<br \/>\n| Id\u00a0 | Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Name\u00a0\u00a0\u00a0\u00a0\u00a0 | E-Rows |<br \/>\n------------------------------------------------<br \/>\n|\u00a0\u00a0 0 | SELECT STATEMENT\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|\u00a0\u00a0 1 |\u00a0 SORT AGGREGATE\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0 1 |<br \/>\n|*\u00a0 2 |\u00a0\u00a0 INDEX RANGE SCAN| ARMIA_IDX |\u00a0\u00a0\u00a0 128 |<br \/>\n------------------------------------------------<br \/>\n...<br \/>\nSQL&gt; select count(*) from armia where plec = 'M';<br \/>\n...<br \/>\nSQL&gt; select * from table (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));<br \/>\n...<br \/>\n------------------------------------------------<br \/>\n| Id\u00a0 | Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Name\u00a0\u00a0\u00a0\u00a0\u00a0 | E-Rows |<br \/>\n------------------------------------------------<br \/>\n|\u00a0\u00a0 0 | SELECT STATEMENT\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|\u00a0\u00a0 1 |\u00a0 SORT AGGREGATE\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0 1 |<br \/>\n|*\u00a0 2 |\u00a0\u00a0 INDEX RANGE SCAN| ARMIA_IDX |\u00a0\u00a0\u00a0 128 |<br \/>\n------------------------------------------------<br \/>\n...<br \/>\nSQL&gt; select SQL_TEXT , SQL_ID, VERSION_COUNT,<br \/>\nHASH_VALUE,PLAN_HASH_VALUE\u00a0\u00a0 from V$SQLAREA where<br \/>\nLOWER(SQL_TEXT) like \u2018select count(*) from armia %';<\/code><\/p>\n<p><code>SQL_TEXT \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 SQL_ID\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 VERSION_COUNT HASH_VALUE PLAN_HASH_VALUE<br \/>\n-------------------------------------------------- ------------- ------------- ---------- ---------------<br \/>\nselect count(*) from armia where plec = :\"SYS_B_0\" curfd6mhrpd0u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 1 3782915098\u00a0\u00a0\u00a0\u00a0\u00a0 2060897835<\/code><\/p>\n<p>Wynik ostatniego zapytania pokazuje, \u017ce oba polecenia SQL korzystaj\u0105 z jednego kursora, kt\u00f3ry posiada jeden plan wykonania. Niestety jeden plan wykonania! Plan ten powsta\u0142 w oparciu o pierwsz\u0105 warto\u015b\u0107 podstawion\u0105 do zmiennej wi\u0105zanej \u2013 w moim eksperymencie to \u2018K\u2019, st\u0105d u\u017cycie indeksu. Tak po prostu dzia\u0142a Bind Variable Peeking pochodz\u0105cy z wersji 10g. Gdybym najpierw szuka\u0142 rekord\u00f3w z PLEC=\u2019M\u2019, to oba zapytania wykona\u0142yby si\u0119 z krokiem Full Table Scan.<\/p>\n<p><strong>Uwaga!<\/strong><br \/>\nA gdzie podzia\u0142 si\u0119 s\u0142ynny w 11g mechanizm Adaptive Cursor Sharing, kt\u00f3ry powinien doprowadzi\u0107 do powstania dw\u00f3ch wersji planu wykonania dla tego kursora? Jak pokazali\u015bmy wcze\u015bniej, optymalny plan wykonania dla PLEC=\u2019M\u2019 jest inny ni\u017c optymalny plan wykonania dla PLEC=\u2019K\u2019! Ja nie wiem, gdzie sie podzia\u0142, ale gdy pos\u0142u\u017cymy si\u0119 nieudokumentowanym hintem BIND_AWARE, to efekty b\u0119d\u0105 takie, jak powinny by\u0107 (jeden kursor, dwa plany):<\/p>\n<p><code>SQL&gt; alter system flush shared_pool;<br \/>\nSQL&gt; alter session set cursor_sharing=force;<br \/>\nSQL&gt; select \/*+ BIND_AWARE *\/ count(*) from armia where plec = 'M';<br \/>\n...<br \/>\nSQL&gt; select * from table (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));<br \/>\n...<br \/>\n---------------------------------------------<br \/>\n| Id\u00a0 | Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Name\u00a0 | E-Rows |<br \/>\n---------------------------------------------<br \/>\n|\u00a0\u00a0 0 | SELECT STATEMENT\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|\u00a0\u00a0 1 |\u00a0 SORT AGGREGATE\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0 1 |<br \/>\n|*\u00a0 2 |\u00a0\u00a0 TABLE ACCESS FULL| ARMIA |\u00a0 12672 |<br \/>\n---------------------------------------------<br \/>\n...<br \/>\nSQL&gt; select \/*+ BIND_AWARE *\/ count(*) from armia where plec = 'K';<br \/>\n...<br \/>\nSQL&gt; select * from table (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));<br \/>\n------------------------------------------------<br \/>\n| Id\u00a0 | Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Name\u00a0\u00a0\u00a0\u00a0\u00a0 | E-Rows |<br \/>\n------------------------------------------------<br \/>\n|\u00a0\u00a0 0 | SELECT STATEMENT\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|\u00a0\u00a0 1 |\u00a0 SORT AGGREGATE\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0 1 |<br \/>\n|*\u00a0 2 |\u00a0\u00a0 INDEX RANGE SCAN| ARMIA_IDX |\u00a0\u00a0\u00a0 128 |<br \/>\n------------------------------------------------<br \/>\n...<br \/>\nSQL&gt; SELECT SQL_TEXT , SQL_ID, VERSION_COUNT, HASH_VALUE,PLAN_HASH_VALUE<br \/>\nFROM V$SQLAREA<br \/>\nWHERE LOWER(SQL_TEXT) LIKE \u2018select \/*+ bind_aware *\/ count(*) from armia %';<br \/>\nSQL_TEXT \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 SQL_ID\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 VERSION_COUNT HASH_VALUE PLAN_HASH_VALUE<br \/>\n-------------------------------------------------------------------- ------------- ------------- ---------- ---------------<br \/>\nselect \/*+ BIND_AWARE *\/ count(*) from armia where plec = :\"SYS_B_0\" 5b9hvzx87nhm5\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 2 1350189669\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 348857963<br \/>\n<\/code><\/p>\n<p><strong>Pu\u0142apki CURSOR_SHARING=FORCE<\/strong><\/p>\n<p>Wydawa\u0142oby si\u0119, \u017ce CURSOR_SHARING=FORCE jest doskona\u0142ym sposobem na redukcj\u0119 zaj\u0119to\u015bci Library Cache, redukcj\u0119 rywalizacji o dost\u0119p do Library Cache (Latch Contention), redukcj\u0119 czasu kompilacji (optymalizacji) polece\u0144 SQL i na niepogarszanie ich wydajno\u015bci (o ile Adaptive Cursor Sharing nas nie zawiedzie). Nale\u017cy jednak zauwa\u017cy\u0107, \u017ce zamiana litera\u0142\u00f3w na zmienne wi\u0105zane dotyczy WSZYSTKICH litera\u0142\u00f3w! Przyk\u0142adowo, poni\u017csze zapytanie:<\/p>\n<p><code>select first_name, last_name from hr.employees<br \/>\nwhere hire_date=to_date('01-01-2013','DD-MM-YYYY')<br \/>\nand substr(first_name,1,1)='J';<br \/>\n<\/code><\/p>\n<p>zostanie przekszta\u0142cone do postaci:<\/p>\n<p><code>select first_name, last_name from hr.employees<br \/>\nwhere hire_date=to_date(:\"SYS_B_0\",:\"SYS_B_1\")<br \/>\nand substr(first_name,:\"SYS_B_2\",:\"SYS_B_3\")=:\"SYS_B_4\"<br \/>\n<\/code><\/p>\n<p>w kt\u00f3rej wyst\u0119puje PI\u0118\u0106 zmiennych wi\u0105zanych zamiast naprawd\u0119 potrzebnych dw\u00f3ch! Mo\u017ce to prowadzi\u0107 do generowania nieoptymalnych plan\u00f3w, o kt\u00f3rych nierzadko m\u00f3wi\u0105 opisy bug\u00f3w.<\/p>\n<p><strong>CURSOR_SHARING=SIMILAR<\/strong><\/p>\n<p>Zapomnijmy o nim. Ma znikn\u0105\u0107 w wersji 12c (notka MOS 1169017.1), jest niezalecane w 11g. Straci\u0142o sens gdy pojawi\u0142 si\u0119 Adaptive Cursor Sharing.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Jednym z bardziej popularnych parametr\u00f3w konfiguracyjnych jest CURSOR_SHARING, umo\u017cliwiaj\u0105cy sterowanie wsp\u00f3\u0142dzieleniem kursor\u00f3w i plan\u00f3w wykonania zapyta\u0144 (pojawi\u0142 si\u0119 w 8.1.6). Mo\u017ce przyj\u0105\u0107 jedn\u0105 z trzech warto\u015bci: EXACT (domy\u015blna), SIMILAR, FORCE, przy czym Oracle zapowiedzia\u0142 wycofanie opcji SIMILAR (ju\u017c nawet w wersji 11g [og\u0142oszenie ID 1169017.1], jednak jest nadal dost\u0119pna). Parametr CURSOR_SHARING jest reklamowany jako lekarstwo <a href=\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/\" rel=\"nofollow\"><span class=\"sr-only\">Read more about Eksperymenty z CURSOR_SHARING<\/span>[&hellip;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[21],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.2.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Eksperymenty z CURSOR_SHARING - Explain IT<\/title>\n<meta name=\"description\" content=\"Eksperymenty z CURSOR_SHARING\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Eksperymenty z CURSOR_SHARING - Explain IT\" \/>\n<meta property=\"og:description\" content=\"Eksperymenty z CURSOR_SHARING\" \/>\n<meta property=\"og:url\" content=\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/\" \/>\n<meta property=\"og:site_name\" content=\"Explain IT\" \/>\n<meta property=\"article:published_time\" content=\"2013-03-29T14:54:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-08-14T08:08:49+00:00\" \/>\n<meta name=\"author\" content=\"Maciej Zakrzewicz\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Napisane przez\" \/>\n\t<meta name=\"twitter:data1\" content=\"Maciej Zakrzewicz\" \/>\n\t<meta name=\"twitter:label2\" content=\"Szacowany czas czytania\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/\"},\"author\":{\"name\":\"Maciej Zakrzewicz\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219\"},\"headline\":\"Eksperymenty z CURSOR_SHARING\",\"datePublished\":\"2013-03-29T14:54:01+00:00\",\"dateModified\":\"2016-08-14T08:08:49+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/\"},\"wordCount\":608,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#organization\"},\"keywords\":[\"wydajno\u015b\u0107\"],\"articleSection\":[\"Oracle Database\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/\",\"url\":\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/\",\"name\":\"Eksperymenty z CURSOR_SHARING - Explain IT\",\"isPartOf\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#website\"},\"datePublished\":\"2013-03-29T14:54:01+00:00\",\"dateModified\":\"2016-08-14T08:08:49+00:00\",\"description\":\"Eksperymenty z CURSOR_SHARING\",\"breadcrumb\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/explainit.pl\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Eksperymenty z CURSOR_SHARING\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#website\",\"url\":\"https:\/\/explainit.pl\/wordpress\/\",\"name\":\"Explain IT\",\"description\":\"Autorska pracownia doradztwa i szkole\u0144 IT - Maciej Zakrzewicz - szkolenia, ekspertyzy, wdro\u017cenia. Technologie Oracle, PostgreSQL, MySQL.\",\"publisher\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/explainit.pl\/wordpress\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"pl-PL\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#organization\",\"name\":\"Explain IT\",\"url\":\"https:\/\/explainit.pl\/wordpress\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2016\/08\/explainITmini.png\",\"contentUrl\":\"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2016\/08\/explainITmini.png\",\"width\":196,\"height\":64,\"caption\":\"Explain IT\"},\"image\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219\",\"name\":\"Maciej Zakrzewicz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pl-PL\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/9c98d020128b142a480aa35a22300a69?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/9c98d020128b142a480aa35a22300a69?s=96&d=mm&r=g\",\"caption\":\"Maciej Zakrzewicz\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Eksperymenty z CURSOR_SHARING - Explain IT","description":"Eksperymenty z CURSOR_SHARING","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/","og_locale":"pl_PL","og_type":"article","og_title":"Eksperymenty z CURSOR_SHARING - Explain IT","og_description":"Eksperymenty z CURSOR_SHARING","og_url":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/","og_site_name":"Explain IT","article_published_time":"2013-03-29T14:54:01+00:00","article_modified_time":"2016-08-14T08:08:49+00:00","author":"Maciej Zakrzewicz","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Maciej Zakrzewicz","Szacowany czas czytania":"6 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/#article","isPartOf":{"@id":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/"},"author":{"name":"Maciej Zakrzewicz","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219"},"headline":"Eksperymenty z CURSOR_SHARING","datePublished":"2013-03-29T14:54:01+00:00","dateModified":"2016-08-14T08:08:49+00:00","mainEntityOfPage":{"@id":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/"},"wordCount":608,"commentCount":2,"publisher":{"@id":"https:\/\/explainit.pl\/wordpress\/#organization"},"keywords":["wydajno\u015b\u0107"],"articleSection":["Oracle Database"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/","url":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/","name":"Eksperymenty z CURSOR_SHARING - Explain IT","isPartOf":{"@id":"https:\/\/explainit.pl\/wordpress\/#website"},"datePublished":"2013-03-29T14:54:01+00:00","dateModified":"2016-08-14T08:08:49+00:00","description":"Eksperymenty z CURSOR_SHARING","breadcrumb":{"@id":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/explainit.pl\/wordpress\/2013\/03\/29\/eksperymenty-z-cursor_sharing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/explainit.pl\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Eksperymenty z CURSOR_SHARING"}]},{"@type":"WebSite","@id":"https:\/\/explainit.pl\/wordpress\/#website","url":"https:\/\/explainit.pl\/wordpress\/","name":"Explain IT","description":"Autorska pracownia doradztwa i szkole\u0144 IT - Maciej Zakrzewicz - szkolenia, ekspertyzy, wdro\u017cenia. Technologie Oracle, PostgreSQL, MySQL.","publisher":{"@id":"https:\/\/explainit.pl\/wordpress\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/explainit.pl\/wordpress\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"pl-PL"},{"@type":"Organization","@id":"https:\/\/explainit.pl\/wordpress\/#organization","name":"Explain IT","url":"https:\/\/explainit.pl\/wordpress\/","logo":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/logo\/image\/","url":"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2016\/08\/explainITmini.png","contentUrl":"https:\/\/explainit.pl\/wordpress\/wp-content\/uploads\/2016\/08\/explainITmini.png","width":196,"height":64,"caption":"Explain IT"},"image":{"@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219","name":"Maciej Zakrzewicz","image":{"@type":"ImageObject","inLanguage":"pl-PL","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/9c98d020128b142a480aa35a22300a69?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/9c98d020128b142a480aa35a22300a69?s=96&d=mm&r=g","caption":"Maciej Zakrzewicz"}}]}},"_links":{"self":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/116"}],"collection":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/comments?post=116"}],"version-history":[{"count":6,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/116\/revisions"}],"predecessor-version":[{"id":359,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/116\/revisions\/359"}],"wp:attachment":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/media?parent=116"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/categories?post=116"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/tags?post=116"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}