{"id":158,"date":"2013-10-21T09:52:20","date_gmt":"2013-10-21T07:52:20","guid":{"rendered":"http:\/\/explainit.pl\/blog\/?p=158"},"modified":"2022-02-06T11:36:28","modified_gmt":"2022-02-06T10:36:28","slug":"jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c","status":"publish","type":"post","link":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/","title":{"rendered":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w  Oracle Database 12c"},"content":{"rendered":"<p>Zajmowali\u015bmy si\u0119 ju\u017c kiedy\u015b ciekaw\u0105 kwest\u0105 korygowania nieoptymalnego planu wykonania z wykorzystaniem Cardinality Feedback (<a href=\"https:\/\/explainit.pl\/blog\/?p=57\">Jak optymalizator uczy si\u0119 na b\u0142\u0119dach<\/a>). Pokazali\u015bmy, \u017ce po pierwszym wykonaniu nieoptymalnego planu wykonania optymalizator potrafi go zmodyfikowa\u0107 tak, aby drugie wykonanie przebieg\u0142o ju\u017c bardziej efektywnie. Niestety, ten mechanizm serwera potrafi by\u0107 skuteczny dopiero przy drugim wywo\u0142aniu tego samego zapytania. Pierwsze wywo\u0142anie trzeba spisa\u0107 na straty\u2026? Niekoniecznie\u2026<\/p>\n<p>Interesuj\u0105ce rozwi\u0105zanie zosta\u0142o wprowadzone w Oracle Database 12.1 pod nazw\u0105 Adaptive Plans. Polega ono na opracowywaniu przez optymalizator wielowariantowych plan\u00f3w wykonania, w kt\u00f3rych decyzja wyboru konkretnego wariantu zapada dopiero podczas wykonywania zapytania. Dzi\u0119ki temu, optymalizator mo\u017ce \u201cna gor\u0105co\u201d naprawi\u0107 skutki swoich nieprecyzyjnych szacunk\u00f3w kardynalno\u015bci\/selektywno\u015bci.<\/p>\n<p>Przyjrzyjmy si\u0119 dzia\u0142aniu adaptatywnych plan\u00f3w wykonania. Na pocz\u0105tek pos\u0142u\u017c\u0119 si\u0119 zapytaniem z podobnego <a href=\"http:\/\/www.youtube.com\/watch?v=9o9iuxNBciQ&amp;feature=youtu.be\">przyk\u0142adu Toma Kyte\u2019a<\/a>. B\u0119dzie to zapytanie do tabel przyk\u0142adowych schematu OE. Przeanalizujmy jego plan wykonania, przygl\u0105daj\u0105c si\u0119 wariantom adaptatywnym (parametr format=&gt;&#8217;+adaptive\u2019 w DISPLAY_CURSOR).<br>\n<code><br>\nSQL&gt; alter session set statistics_level=all;<br>\n...<br>\nSQL&gt; alter system flush shared_pool;<br>\n...<br>\nSQL&gt; select product_name<br>\n2&nbsp; from oe.order_items o, oe.product_information p<br>\n3&nbsp; where o.unit_price = 15<br>\n4 &nbsp;and o.quantity &gt; 1<br>\n5&nbsp; and p.product_id= o.product_id;<br>\n...<br>\nSQL&gt; select * from table(dbms_xplan.display_cursor(format=&gt;'+adaptive, allstats last'));<br>\nPLAN_TABLE_OUTPUT<br>\n-----------------------------------------------------------------------------------<br>\n|&nbsp;&nbsp; Id&nbsp; | Operation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | E-Rows | A-Rows|<br>\n-----------------------------------------------------------------------------------<br>\n|&nbsp;&nbsp;&nbsp;&nbsp; 0 | SELECT STATEMENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp; &nbsp;&nbsp; &nbsp; | &nbsp;&nbsp; 13 |<br>\n|&nbsp; *&nbsp; 1 |&nbsp; HASH JOIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp; &nbsp;&nbsp; 4 |&nbsp;&nbsp;&nbsp; 13 |<br>\n|-&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp; NESTED LOOPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; 13 |<br>\n|-&nbsp;&nbsp;&nbsp; 3 |&nbsp;&nbsp;&nbsp; NESTED LOOPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; &nbsp; 4 |&nbsp;&nbsp;&nbsp; 13 |<br>\n|-&nbsp;&nbsp;&nbsp; 4 |&nbsp;&nbsp;&nbsp;&nbsp; STATISTICS COLLECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; |&nbsp;&nbsp;&nbsp; 13 |<br>\n|&nbsp; *&nbsp; 5 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ORDER_ITEMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4 |&nbsp;&nbsp;&nbsp; 13 |<br>\n|- *&nbsp; 6 |&nbsp;&nbsp;&nbsp;&nbsp; INDEX UNIQUE SCAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | PRODUCT_INFORMATION_PK |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp;&nbsp; 0 |<br>\n|-&nbsp;&nbsp;&nbsp; 7 |&nbsp;&nbsp;&nbsp; TABLE ACCESS BY INDEX ROWID| PRODUCT_INFORMATION&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; &nbsp; 1 |&nbsp;&nbsp;&nbsp;&nbsp; 0 |<br>\n|&nbsp;&nbsp;&nbsp;&nbsp; 8 |&nbsp;&nbsp; TABLE ACCESS FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | PRODUCT_INFORMATION&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp; 288 |<br>\nPredicate Information (identified by operation id):<br>\n---------------------------------------------------<br>\n1 - access(\"P\".\"PRODUCT_ID\"=\"O\".\"PRODUCT_ID\")<br>\n5 - filter((\"O\".\"UNIT_PRICE\"=15 AND \"O\".\"QUANTITY\"&gt;1))<br>\n6 - access(\"P\".\"PRODUCT_ID\"=\"O\".\"PRODUCT_ID\")<br>\nNote<br>\n-----<br>\n- this is an adaptive plan (rows marked '-' are inactive)<br>\n<\/code><\/p>\n<p>Spos\u00f3b zapisu wielowariantowego planu adaptatywnego mo\u017ce budzi\u0107 zdziwienie. W naszym zapytaniu wyst\u0119puje przecie\u017c tylko jedno \u0142\u0105czenie tabel, a w planie widzimy dwa operatory po\u0142\u0105czenia \u2013 HASH JOIN i NESTED LOOPS! Zwr\u00f3\u0107my jednak uwag\u0119 na znaki minus w pierwszej kolumnie planu \u2013 oznaczaj\u0105 one, \u017ce te kroki planu zosta\u0142y pomini\u0119te w wykonaniu. A zatem nasze zapytanie rzeczywi\u015bcie zosta\u0142o wykonane wed\u0142ug planu HASH JOIN-TABLE ACCESS FULL-TABLE ACCESS FULL. Rozszyfrujmy jednak zapis wielowariantowego planu adaptatywnego. Jego wa\u017cnym krokiem jest STATISTICS COLLECTOR \u2013 jest to dzia\u0142anie weryfikuj\u0105ce rzeczywist\u0105 kardynalno\u015b\u0107 wyniku po\u015bredniego. Je\u015bli oka\u017ce si\u0119, \u017ce odbiega ona znacz\u0105co od prognozowanej, nast\u0119puje wyb\u00f3r innego wariantu planu wykonania. Optymalizator spodziewa\u0142 si\u0119 z tabeli ORDER_ITEMS odczyta\u0107 cztery rekordy (E-Rows) \u2013 gdyby to by\u0142o prawd\u0105, to wykona\u0142by wariant NESTED LOOPS-TABLE ACCESS FULL-INDEX UNIQUE SCAN-TABLE ACCESS BY INDEX ROWID. Jednak w naszym przypadku otrzyma\u0142 13 rekord\u00f3w (A-Rows), co spowodowa\u0142o prze\u0142\u0105czenie na wariant alternatywny HASH JOIN-TABLE ACCESS FULL-TABLE ACCESS FULL.<\/p>\n<p>A jak wygl\u0105da\u0142by wyb\u00f3r wariantu gdyby prognozowana kardynalno\u015bc okaza\u0142a si\u0119 trafna? Prosz\u0119 bardzo:<br>\n<code><br>\nSQL&gt; select * from table(dbms_xplan.display_cursor(format=&gt;'+adaptive, allstats last'));<br>\nPLAN_TABLE_OUTPUT<br>\n-----------------------------------------------------------------------------------<br>\n|&nbsp;&nbsp; Id&nbsp; | Operation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | E-Rows | A-Rows|<br>\n-----------------------------------------------------------------------------------<br>\n|&nbsp;&nbsp;&nbsp;&nbsp; 0 | SELECT STATEMENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | &nbsp; &nbsp; &nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 1 |<br>\n|- *&nbsp; 1 |&nbsp; HASH JOIN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp;&nbsp; 1 |<br>\n|&nbsp;&nbsp;&nbsp;&nbsp; 2 |&nbsp;&nbsp; NESTED LOOPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 1 |<br>\n|&nbsp;&nbsp;&nbsp;&nbsp; 3 |&nbsp;&nbsp;&nbsp; NESTED LOOPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp;&nbsp; 1 |<br>\n|-&nbsp;&nbsp;&nbsp; 4 |&nbsp;&nbsp;&nbsp;&nbsp; STATISTICS COLLECTOR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; 1 |<br>\n|&nbsp; *&nbsp; 5 |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TABLE ACCESS FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | ORDER_ITEMS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp;&nbsp; 1 |<br>\n|&nbsp; *&nbsp; 6 |&nbsp;&nbsp;&nbsp;&nbsp; INDEX UNIQUE SCAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | PRODUCT_INFORMATION_PK |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp;&nbsp; 1 |<br>\n|&nbsp;&nbsp;&nbsp;&nbsp; 7 |&nbsp;&nbsp;&nbsp; TABLE ACCESS BY INDEX ROWID| PRODUCT_INFORMATION&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp;&nbsp; 1 |<br>\n|-&nbsp;&nbsp;&nbsp; 8 |&nbsp;&nbsp; TABLE ACCESS FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | PRODUCT_INFORMATION&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1 |&nbsp;&nbsp;&nbsp;&nbsp; 0 |<br>\nPredicate Information (identified by operation id):<br>\n---------------------------------------------------<br>\n1 - access(\"P\".\"PRODUCT_ID\"=\"O\".\"PRODUCT_ID\")<br>\n5 - filter((\"O\".\"UNIT_PRICE\"=15 AND \"O\".\"QUANTITY\"&gt;150))<br>\n6 - access(\"P\".\"PRODUCT_ID\"=\"O\".\"PRODUCT_ID\")<br>\nNote<br>\n-----<br>\n- this is an adaptive plan (rows marked '-' are inactive)<\/code><\/p>\n<p>Tym razem wy\u0142\u0105czone zosta\u0142y kroki HASH JOIN-TABLE ACCESS FULL, wi\u0119c w rezultacie wykonany zosta\u0142 wariant NESTED LOOPS-TABLE ACCESS FULL-INDEX UNIQUE SCAN-TABLE ACCESS BY INDEX ROWID.<\/p>\n<p>Reasumuj\u0105c, nasz wygenerowany wielowariantowy plan adaptatywny mo\u017cna uj\u0105\u0107 &nbsp;w nast\u0119puj\u0105cych punktach:<\/p>\n<p>1. Wykonaj TABLE ACCESS FULL na ORDER_ITEMS<\/p>\n<p>2. Sprawd\u017a kardynalno\u015b\u0107 wyniku po\u015bredniego (STATISTICS COLLECTOR)<\/p>\n<p>3. Je\u017celi kardynalno\u015b\u0107 jest zgodna z prognozowan\u0105, to:<\/p>\n<p>a.&nbsp; wykonaj po\u0142\u0105czenie metod\u0105 NESTED LOOPS (INDEX UNIQUE SCAN\/TABLE ACCESS BY INDEX ROWID na PRODUCT_INFORMATION)<\/p>\n<p>w przeciwnym razie:<\/p>\n<p>a. wykonaj po\u0142\u0105czenie metod\u0105 HASH JOIN (TABLE ACCESS FULL na PRODUCT_INFORMATION)<\/p>\n<p>Pami\u0119tajmy tylko, \u017ce ca\u0142y ten mechanizm s\u0142u\u017cy wy\u0142\u0105cznie optymalnemu pierwszemu wykonaniu zapytania. W kolejnych uruchomieniach nie ma ju\u017c niespodzianek, stosowany jest znany wcze\u015bniej Cardinality Feedback.<\/p>\n\n\n<p>Aktualizacja: zainteresowanym &#8222;matematycznym&#8221; kontekstem powy\u017cszych rozwi\u0105za\u0144 proponuj\u0119 zerkni\u0119cie na publikacj\u0119 &#8222;Adaptive Statistics in Oracle 12c&#8221; z konferencji VLDB 2017: <a href=\"http:\/\/vldb.org\/pvldb\/vol10\/p1813-zait.pdf\">link<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Zajmowali\u015bmy si\u0119 ju\u017c kiedy\u015b ciekaw\u0105 kwest\u0105 korygowania nieoptymalnego planu wykonania z wykorzystaniem Cardinality Feedback (Jak optymalizator uczy si\u0119 na b\u0142\u0119dach). Pokazali\u015bmy, \u017ce po pierwszym wykonaniu nieoptymalnego planu wykonania optymalizator potrafi go zmodyfikowa\u0107 tak, aby drugie wykonanie przebieg\u0142o ju\u017c bardziej efektywnie. Niestety, ten mechanizm serwera potrafi by\u0107 skuteczny dopiero przy drugim wywo\u0142aniu tego samego zapytania. Pierwsze <a href=\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/\" rel=\"nofollow\"><span class=\"sr-only\">Read more about Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w  Oracle Database 12c<\/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":[12,14],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.2.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c - Explain IT<\/title>\n<meta name=\"description\" content=\"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c\" \/>\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\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c - Explain IT\" \/>\n<meta property=\"og:description\" content=\"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c\" \/>\n<meta property=\"og:url\" content=\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/\" \/>\n<meta property=\"og:site_name\" content=\"Explain IT\" \/>\n<meta property=\"article:published_time\" content=\"2013-10-21T07:52:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-02-06T10:36:28+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=\"5 minut\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/\"},\"author\":{\"name\":\"Maciej Zakrzewicz\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219\"},\"headline\":\"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c\",\"datePublished\":\"2013-10-21T07:52:20+00:00\",\"dateModified\":\"2022-02-06T10:36:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/\"},\"wordCount\":527,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#organization\"},\"keywords\":[\"optymalizator\",\"Oracle Database 12c\"],\"articleSection\":[\"Oracle Database\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/\",\"url\":\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/\",\"name\":\"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c - Explain IT\",\"isPartOf\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#website\"},\"datePublished\":\"2013-10-21T07:52:20+00:00\",\"dateModified\":\"2022-02-06T10:36:28+00:00\",\"description\":\"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c\",\"breadcrumb\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/explainit.pl\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c\"}]},{\"@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":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c - Explain IT","description":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c","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\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/","og_locale":"pl_PL","og_type":"article","og_title":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c - Explain IT","og_description":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c","og_url":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/","og_site_name":"Explain IT","article_published_time":"2013-10-21T07:52:20+00:00","article_modified_time":"2022-02-06T10:36:28+00:00","author":"Maciej Zakrzewicz","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Maciej Zakrzewicz","Szacowany czas czytania":"5 minut"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/#article","isPartOf":{"@id":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/"},"author":{"name":"Maciej Zakrzewicz","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219"},"headline":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c","datePublished":"2013-10-21T07:52:20+00:00","dateModified":"2022-02-06T10:36:28+00:00","mainEntityOfPage":{"@id":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/"},"wordCount":527,"commentCount":0,"publisher":{"@id":"https:\/\/explainit.pl\/wordpress\/#organization"},"keywords":["optymalizator","Oracle Database 12c"],"articleSection":["Oracle Database"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/","url":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/","name":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c - Explain IT","isPartOf":{"@id":"https:\/\/explainit.pl\/wordpress\/#website"},"datePublished":"2013-10-21T07:52:20+00:00","dateModified":"2022-02-06T10:36:28+00:00","description":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c","breadcrumb":{"@id":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/explainit.pl\/wordpress\/2013\/10\/21\/jak-nie-pomylic-sie-za-pierwszym-razem-adaptatywne-plany-wykonania-w-12c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/explainit.pl\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Jak nie pomyli\u0107 si\u0119 za pierwszym razem? Adaptatywne plany wykonania w Oracle Database 12c"}]},{"@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\/158"}],"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=158"}],"version-history":[{"count":2,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/158\/revisions"}],"predecessor-version":[{"id":1281,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/158\/revisions\/1281"}],"wp:attachment":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/media?parent=158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/categories?post=158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/tags?post=158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}