{"id":57,"date":"2012-12-19T19:19:13","date_gmt":"2012-12-19T18:19:13","guid":{"rendered":"http:\/\/explainit.pl\/blog\/?p=57"},"modified":"2017-06-10T15:18:06","modified_gmt":"2017-06-10T13:18:06","slug":"jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback","status":"publish","type":"post","link":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/","title":{"rendered":"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)"},"content":{"rendered":"<p>Podczas estymacji kosztu planu wykonania zapytania, kosztowy optymalizator zapyta\u0144 musi m.in. oszacowa\u0107 liczby rekord\u00f3w (tzw. kardynalno\u015b\u0107), kt\u00f3re b\u0119d\u0105 przetwarzane przez zapytanie w r\u00f3\u017cnych fazach jego realizacji. Od precyzji tych szacunk\u00f3w zale\u017c\u0105 decyzje dotycz\u0105ce np. kolejno\u015bci \u0142\u0105czenia tabel czy te\u017c wyboru algorytmu \u0142\u0105czenia tabel. Szacunki kardynalno\u015bci s\u0105 dokonywane przede wszystkim na podstawie dost\u0119pnych statystyk dla tabel i ich kolumn. Nie zawsze jednak optymalizator zachowuje sie nieomylnie, zw\u0142aszcza gdy w zapytaniu wyst\u0119puj\u0105 z\u0142o\u017cone predykaty lub gdy dost\u0119pne statystyki s\u0105 niedok\u0142adne lub nieaktualne.<\/p>\n<p>W celu zapobiegania problemom wynikaj\u0105cym z b\u0142\u0119d\u00f3w oszacowa\u0144 kardynalno\u015bci, Oracle Database 11g Release 2 wprowadza mechanizm Cardinality Feedback \u2013 sprz\u0119\u017cenia zwrotnego dostarczaj\u0105cego \u201epo fakcie\u201d optymalizatorowi zapyta\u0144 informacje o faktycznej kardynalno\u015bci na r\u00f3\u017cnych etapach realizacji zapytania. Dzi\u0119ki temu optymalizator jest w stanie poprawi\u0107 wygenerowany wcze\u015bniej plan wykonania zapytania, je\u015bli oka\u017ce si\u0119, \u017ce oczekiwane kardynalno\u015bci nie pokrywa\u0142y si\u0119 z faktycznymi zaobserwowanymi w czasie realizacji zapytania. Jest to rozwi\u0105zanie podobne do Automatic SQL Tuning, tyle \u017ce stosowane na bie\u017c\u0105co. <\/p>\n<p>Uwaga: Cardinality Feedback wymaga ustawienia parametru &#8222;statistics_level&#8221; na &#8222;all&#8221;!<\/p>\n<p>Przyjrzyjmy si\u0119 nast\u0119puj\u0105cemu przyk\u0142adowi funkcjonowania Cardinality Feedback. Tre\u015b\u0107 zapytania zapo\u017cyczy\u0142em z artyku\u0142u [<a title=\"https:\/\/blogs.oracle.com\/optimizer\/entry\/cardinality_feedback\" href=\"https:\/\/blogs.oracle.com\/optimizer\/entry\/cardinality_feedback\">https:\/\/blogs.oracle.com\/optimizer\/entry\/cardinality_feedback<\/a>]. W ramach eksperymentu poka\u017cemy, jak plan wykonania zapytania automatycznie zmienia si\u0119 po pierwszym wykonaniu zapytania, gdy tylko optymalizator dowie si\u0119, jakie b\u0142\u0119dy oszacowa\u0144 pope\u0142ni\u0142.<\/p>\n<p>Poni\u017cej przedstawiam faktyczny plan wykonania przyk\u0142adowego zapytania SQL <strong>_za pierwszym razem_<\/strong>:<\/p>\n<p><code>SQL&gt; connect oe\/oe<br \/>\nSQL&gt; alter system flush shared_pool;<br \/>\nSQL&gt; alter session set statistics_level=all;<br \/>\nSQL&gt; select product_name<br \/>\n2 from order_items o, product_information p<br \/>\n3 where o.unit_price = 15 and quantity &gt; 1<br \/>\n4 and p.product_id = o.product_id;<br \/>\n...<br \/>\nSQL&gt; select * from table (dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));<br \/>\n...<br \/>\n------------------------------------------------------------------------------<br \/>\n| Id | Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | E-Rows | A-Rows |<br \/>\n------------------------------------------------------------------------------<br \/>\n| 0\u00a0 | SELECT STATEMENT\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\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | 13\u00a0\u00a0\u00a0\u00a0 |<br \/>\n| 1\u00a0 | NESTED LOOPS\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\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 |\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | 13\u00a0 \u00a0\u00a0 |<br \/>\n| 2\u00a0 | NESTED LOOPS\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\u00a0\u00a0\u00a0\u00a0\u00a0 | 4\u00a0 \u00a0\u00a0\u00a0 | 13 \u00a0 \u00a0 |<br \/>\n|* 3 | TABLE ACCESS FULL \u00a0 \u00a0 \u00a0 \u00a0\u00a0 | ORDER_ITEMS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | 4\u00a0\u00a0\u00a0\u00a0\u00a0 | 13\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|* 4 | INDEX UNIQUE SCAN\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | PRODUCT_INFORMATION_PK | 1\u00a0\u00a0\u00a0\u00a0\u00a0 | 13\u00a0\u00a0\u00a0\u00a0 |<br \/>\n| 5\u00a0 | TABLE ACCESS BY INDEX ROWID| PRODUCT_INFORMATION\u00a0\u00a0\u00a0 | 1\u00a0\u00a0\u00a0\u00a0\u00a0 | 13\u00a0\u00a0\u00a0\u00a0 |<br \/>\n------------------------------------------------------------------------------<br \/>\n<\/code><\/p>\n<p>Zauwa\u017cmy, \u017ce znaleziony przez optymalizator plan wykonania obejmuje po\u0142\u0105czenie tabeli ORDER_ITEMS z indeksem PRODUCT_INFORMATION_PK z u\u017cyciem algorytmu NESTED LOOPS, a nast\u0119pnie po\u0142\u0105czenie wyniku z tabel\u0105 PRODUCT_INFORMATION za pomoc\u0105 ponownego wykonania algorytmu NESTED LOOPS. Do takich wybor\u00f3w optymalizator sk\u0142oni\u0142 si\u0119 w wyniku m.in. oszacowa\u0144 kardynalno\u015bci, widocznych w powy\u017cszej tabelce w kolumnie E-Rows (Estimated Number of Rows). Z kolei kolumna A-Rows (Actual Number of Rows) obrazuje rzeczywiste kardynalno\u015bci, zebrane ju\u017c w trakcie wykonywania zapytania (po optymalizacji). Jak wida\u0107, warto\u015bci te znacz\u0105co si\u0119 r\u00f3\u017cni\u0105 \u2013 np. optymalizator spodziewa\u0142 si\u0119 tylko czterech rekord\u00f3w z tabeli ORDER_ITEMS spe\u0142niaj\u0105cych warunek UNIT_PRICE=15, podczas gdy okaza\u0142o si\u0119 p\u00f3\u017aniej, \u017ce takich rekord\u00f3w by\u0142o jednak 13.<\/p>\n<p>Ciekawie b\u0119dzie wygl\u0105da\u0107 <strong>drugie <\/strong>uruchomienie tego samego zapytania i ponowna obserwacja planu jego wykonania:<\/p>\n<p><code>SQL&gt; select product_name<br \/>\n2 from order_items o, product_information p<br \/>\n3 where o.unit_price = 15 and quantity &gt; 1<br \/>\n4 and p.product_id = o.product_id;<br \/>\n...<br \/>\nSQL&gt; select * from table( dbms_xplan.display_cursor(null,null,'ALLSTATS LAST'));<br \/>\n...<br \/>\n-----------------------------------------------------------------<br \/>\n| Id | Operation\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | Name\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | E-Rows | A-Rows |<br \/>\n-----------------------------------------------------------------<br \/>\n| 0\u00a0 | SELECT STATEMENT | \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 | \u00a0 \u00a0 \u00a0\u00a0 | 13\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|* 1 | HASH JOIN\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 | 13\u00a0\u00a0\u00a0\u00a0 | 13\u00a0\u00a0\u00a0\u00a0 |<br \/>\n|* 2 | TABLE ACCESS FULL| ORDER_ITEMS\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 | 13\u00a0\u00a0\u00a0\u00a0 | 13 \u00a0 \u00a0 |<br \/>\n| 3\u00a0 | TABLE ACCESS FULL| PRODUCT_INFORMATION | 288\u00a0\u00a0\u00a0 | 288 \u00a0\u00a0 |<br \/>\n-----------------------------------------------------------------<br \/>\nPredicate Information (identified by operation id):<br \/>\n---------------------------------------------------<br \/>\n1 - access(\"P\".\"PRODUCT_ID\"=\"O\".\"PRODUCT_ID\")<br \/>\n2 - filter((\"O\".\"UNIT_PRICE\"=15 AND \"QUANTITY\"&gt;1))<br \/>\nNote<br \/>\n-----<br \/>\n- cardinality feedback used for this statement<\/code><\/p>\n<p>Plan wykonania si\u0119 zmieni\u0142! Tym razem optymalizator postanowi\u0142 po\u0142\u0105czy\u0107 tabele ORDER_ITEMS i PRODUCT_INFORMATION algorytmem HASH_JOIN. A co wa\u017cniejsze, tym razem trafnie oszacowa\u0142 kardynalno\u015bci (pozna\u0142 je podczas poprzedniego wykonania tego samego zapytania). O zastosowaniu techniki Cardinality Feedback \u015bwiadczy te\u017c notka w opisie planu wykonania (\u201ecardinality feedback used for this statement&#8221;). Obserwacja u\u017cycia Cardinality Feedback jest te\u017c mo\u017cliwa za pomoc\u0105 kolumny USE_FEEDBACK_STATS perspektywy V$SQL_SHARED_CURSOR (wyst\u0119puje od wersji 11.2.0.2!).<br \/>\n\u201eOdkryte\u201d kardynalno\u015bci nie s\u0105 trwale odnotowywane w bazie danych, w zwi\u0105zku z czym po wyczyszczeniu bufora Library Cache ca\u0142a zabawa rozpoczyna si\u0119 od pocz\u0105tku. Je\u015bli komu\u015b bardzo, bardzo zale\u017cy na utrwaleniu faktycznych kardynalno\u015bci, mo\u017cna poeksperymentowa\u0107 z niejawnym hintem CARDINALITY&#8230;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Podczas estymacji kosztu planu wykonania zapytania, kosztowy optymalizator zapyta\u0144 musi m.in. oszacowa\u0107 liczby rekord\u00f3w (tzw. kardynalno\u015b\u0107), kt\u00f3re b\u0119d\u0105 przetwarzane przez zapytanie w r\u00f3\u017cnych fazach jego realizacji. Od precyzji tych szacunk\u00f3w zale\u017c\u0105 decyzje dotycz\u0105ce np. kolejno\u015bci \u0142\u0105czenia tabel czy te\u017c wyboru algorytmu \u0142\u0105czenia tabel. Szacunki kardynalno\u015bci s\u0105 dokonywane przede wszystkim na podstawie dost\u0119pnych statystyk dla tabel <a href=\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/\" rel=\"nofollow\"><span class=\"sr-only\">Read more about Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)<\/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],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.2.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback) - Explain IT<\/title>\n<meta name=\"description\" content=\"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)\" \/>\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\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/\" \/>\n<meta property=\"og:locale\" content=\"pl_PL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback) - Explain IT\" \/>\n<meta property=\"og:description\" content=\"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)\" \/>\n<meta property=\"og:url\" content=\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/\" \/>\n<meta property=\"og:site_name\" content=\"Explain IT\" \/>\n<meta property=\"article:published_time\" content=\"2012-12-19T18:19:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-06-10T13:18:06+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=\"4 minuty\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/\"},\"author\":{\"name\":\"Maciej Zakrzewicz\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219\"},\"headline\":\"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)\",\"datePublished\":\"2012-12-19T18:19:13+00:00\",\"dateModified\":\"2017-06-10T13:18:06+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/\"},\"wordCount\":546,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#organization\"},\"keywords\":[\"optymalizator\"],\"articleSection\":[\"Oracle Database\"],\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/\",\"url\":\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/\",\"name\":\"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback) - Explain IT\",\"isPartOf\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/#website\"},\"datePublished\":\"2012-12-19T18:19:13+00:00\",\"dateModified\":\"2017-06-10T13:18:06+00:00\",\"description\":\"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)\",\"breadcrumb\":{\"@id\":\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/#breadcrumb\"},\"inLanguage\":\"pl-PL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Strona g\u0142\u00f3wna\",\"item\":\"https:\/\/explainit.pl\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)\"}]},{\"@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 optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback) - Explain IT","description":"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)","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\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/","og_locale":"pl_PL","og_type":"article","og_title":"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback) - Explain IT","og_description":"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)","og_url":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/","og_site_name":"Explain IT","article_published_time":"2012-12-19T18:19:13+00:00","article_modified_time":"2017-06-10T13:18:06+00:00","author":"Maciej Zakrzewicz","twitter_card":"summary_large_image","twitter_misc":{"Napisane przez":"Maciej Zakrzewicz","Szacowany czas czytania":"4 minuty"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/#article","isPartOf":{"@id":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/"},"author":{"name":"Maciej Zakrzewicz","@id":"https:\/\/explainit.pl\/wordpress\/#\/schema\/person\/740773131bc169a2dc9c0e5e07476219"},"headline":"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)","datePublished":"2012-12-19T18:19:13+00:00","dateModified":"2017-06-10T13:18:06+00:00","mainEntityOfPage":{"@id":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/"},"wordCount":546,"commentCount":0,"publisher":{"@id":"https:\/\/explainit.pl\/wordpress\/#organization"},"keywords":["optymalizator"],"articleSection":["Oracle Database"],"inLanguage":"pl-PL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/","url":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/","name":"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback) - Explain IT","isPartOf":{"@id":"https:\/\/explainit.pl\/wordpress\/#website"},"datePublished":"2012-12-19T18:19:13+00:00","dateModified":"2017-06-10T13:18:06+00:00","description":"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)","breadcrumb":{"@id":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/#breadcrumb"},"inLanguage":"pl-PL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/explainit.pl\/wordpress\/2012\/12\/19\/jak-optymalizator-oracle-database-uczy-sie-na-bledach-cardinality-feedback\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Strona g\u0142\u00f3wna","item":"https:\/\/explainit.pl\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Jak optymalizator Oracle Database uczy si\u0119 na b\u0142\u0119dach (Cardinality Feedback)"}]},{"@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\/57"}],"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=57"}],"version-history":[{"count":5,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/57\/revisions"}],"predecessor-version":[{"id":525,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/posts\/57\/revisions\/525"}],"wp:attachment":[{"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/media?parent=57"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/categories?post=57"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/explainit.pl\/wordpress\/wp-json\/wp\/v2\/tags?post=57"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}