{"id":9100,"date":"2019-02-17T21:15:42","date_gmt":"2019-02-17T20:15:42","guid":{"rendered":"https:\/\/www.salvis.com\/blog\/?p=9100"},"modified":"2023-11-08T10:25:38","modified_gmt":"2023-11-08T09:25:38","slug":"memoptimized-rowstore-in-oracle-database-19c","status":"publish","type":"post","link":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/","title":{"rendered":"MemOptimized RowStore in Oracle Database 19c"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Since February 13 2019 Oracle Database 19c has been available.\u00a0I blogged about this feature\u00a0<a href=\"https:\/\/www.salvis.com\/blog\/2018\/06\/10\/memoptimized-rowstore-in-oracle-database-18c\/\">here<\/a> and <a href=\"https:\/\/www.salvis.com\/blog\/2018\/06\/19\/memoptimized-rowstore-in-oracle-database-18c-with-oci\/\">here<\/a>. Time for an update. So, what&#8217;s new in 19c regarding the MemOptimized Rowstore?<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fast Lookup Works with JDBC Thin Driver<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">I listed 16 prerequisites for the MemOptimized Rowstore in <a href=\"https:\/\/www.salvis.com\/blog\/2018\/06\/10\/memoptimized-rowstore-in-oracle-database-18c\/\">this blog post<\/a>. The last one &#8211; &#8220;The query must not be executed from a JDBC thin driver connection. You have to use OCI, otherwise the performance will be really bad.&#8221; does not apply anymore. This &#8220;bug&#8221; is fixed in 19c. Here are the JDBC thin driver results of the test program listed in <a href=\"https:\/\/www.salvis.com\/blog\/2018\/06\/19\/memoptimized-rowstore-in-oracle-database-18c-with-oci\/\">this blog post:<\/a><\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Console output of run.sh (excerpt) with comments<\/span><span role=\"button\" tabindex=\"0\" data-code=\"# t1 - heap table\nrun #1: read 100000 rows from t1 in 18.602 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\nrun #2: read 100000 rows from t1 in 17.723 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\nrun #3: read 100000 rows from t1 in 18.834 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\nrun #4: read 100000 rows from t1 in 18.039 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\nrun #5: read 100000 rows from t1 in 18.711 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\n\n# t4 - memoptimized heap-table\nrun #1: read 100000 rows from t4 in 16.696 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\nrun #2: read 100000 rows from t4 in 16.671 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\nrun #3: read 100000 rows from t4 in 16.952 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\nrun #4: read 100000 rows from t4 in 16.805 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\nrun #5: read 100000 rows from t4 in 17.627 seconds via jdbc:oracle:thin:@\/\/localhost:1521\/odb.docker.\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #D4D4D4\"># t1 - heap <\/span><span style=\"color: #569CD6\">table<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t1 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">602<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t1 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">17<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">723<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t1 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">834<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t1 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">039<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t1 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">18<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">711<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\"># t4 - memoptimized heap-<\/span><span style=\"color: #569CD6\">table<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">1<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t4 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">696<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">2<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t4 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">671<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">3<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t4 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">952<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">4<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t4 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">16<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">805<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">run #<\/span><span style=\"color: #B5CEA8\">5<\/span><span style=\"color: #D4D4D4\">: <\/span><span style=\"color: #569CD6\">read<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">100000<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">rows<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">from<\/span><span style=\"color: #D4D4D4\"> t4 <\/span><span style=\"color: #569CD6\">in<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">17<\/span><span style=\"color: #D4D4D4\">.<\/span><span style=\"color: #B5CEA8\">627<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">seconds<\/span><span style=\"color: #D4D4D4\"> via jdbc:oracle:thin:@\/\/localhost:<\/span><span style=\"color: #B5CEA8\">1521<\/span><span style=\"color: #D4D4D4\">\/odb.docker.<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">See, the runs for <code>t4<\/code>\u00a0are the fastest because they used <code>memopt r lookups<\/code>\u00a0 instead of\u00a0 <code>consistent gets<\/code>.\u00a0 BTW, the absolute runtime values of these tests are not important or representative, they vary a lot depending on the Docker environment that I use. However, I consider the relative difference between the <code>t1<\/code> and <code>t4<\/code>\u00a0as relevant and conclusive. The next graph visualizes the results. I also added the results for the PL\/SQL runs to this graph. It clearly shows that if you can do it within the database, you should do it.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimized_rowstore_19c_thin_driver-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"945\" height=\"533\" src=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimized_rowstore_19c_thin_driver-1.png\" alt=\"\" class=\"wp-image-9109\" srcset=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimized_rowstore_19c_thin_driver-1.png 945w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimized_rowstore_19c_thin_driver-1-300x169.png 300w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimized_rowstore_19c_thin_driver-1-768x433.png 768w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimized_rowstore_19c_thin_driver-1-260x146.png 260w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimized_rowstore_19c_thin_driver-1-50x28.png 50w, https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimized_rowstore_19c_thin_driver-1-133x75.png 133w\" sizes=\"auto, (max-width:767px) 480px, (max-width:945px) 100vw, 945px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I also run this test for 18.5.0.0.0. It looks like this bug has not been fixed in 18c yet.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fast Ingest<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This new 19c feature consists of two parts. The usage is best described in the <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/tgdba\/tuning-system-global-area.html#GUID-CFADC9EA-2E2F-4EBB-BA2C-3663291DCC25\">Database Performance Tuning Guide<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, the table must be enabled for memoptimized write using the memoptimize_write_clause. You can do that in the <code>create table<\/code>&nbsp;or the <code>alter table<\/code>&nbsp;statement. Here&#8217;s an example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Example of memoptimize_write_clause<\/span><span role=\"button\" tabindex=\"0\" data-code=\"CREATE TABLE t5 (\n   key    INTEGER            NOT NULL,\n   value  VARCHAR2(30 CHAR)  NOT NULL,\n   CONSTRAINT t5_pk PRIMARY KEY (key)\n) \nSEGMENT CREATION IMMEDIATE\nMEMOPTIMIZE FOR WRITE;\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">CREATE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">TABLE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #DCDCAA\">t5<\/span><span style=\"color: #D4D4D4\"> (<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">key<\/span><span style=\"color: #D4D4D4\">    <\/span><span style=\"color: #569CD6\">INTEGER<\/span><span style=\"color: #D4D4D4\">            <\/span><span style=\"color: #569CD6\">NOT NULL<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">value<\/span><span style=\"color: #D4D4D4\">  <\/span><span style=\"color: #569CD6\">VARCHAR2<\/span><span style=\"color: #D4D4D4\">(<\/span><span style=\"color: #B5CEA8\">30<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">CHAR<\/span><span style=\"color: #D4D4D4\">)  <\/span><span style=\"color: #569CD6\">NOT NULL<\/span><span style=\"color: #D4D4D4\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">CONSTRAINT<\/span><span style=\"color: #D4D4D4\"> t5_pk <\/span><span style=\"color: #569CD6\">PRIMARY KEY<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">key<\/span><span style=\"color: #D4D4D4\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">) <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">SEGMENT CREATION <\/span><span style=\"color: #569CD6\">IMMEDIATE<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">MEMOPTIMIZE <\/span><span style=\"color: #569CD6\">FOR<\/span><span style=\"color: #D4D4D4\"> WRITE;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">One way to trigger fast ingest is to use an insert hint. Here&#8217;s an example:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Fast ingest (autocommit)<\/span><span role=\"button\" tabindex=\"0\" data-code=\"BEGIN\n   FOR r IN (SELECT * FROM t4 WHERE key between 10001 and 20000) LOOP\n      INSERT \/*+ memoptimize_write *\/ INTO t5 VALUES r;\n   END LOOP;\nEND;\n\/\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t4 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">key<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">between<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">10001<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">and<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #B5CEA8\">20000<\/span><span style=\"color: #D4D4D4\">) <\/span><span style=\"color: #569CD6\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">INSERT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/*+ memoptimize_write *\/<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> t5 <\/span><span style=\"color: #569CD6\">VALUES<\/span><span style=\"color: #D4D4D4\"> r;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">There is no <code>commit<\/code>&nbsp;in this anonymous PL\/SQL block. In this case an additional <code>commit<\/code>&nbsp;statement would just slow down the processing. The insert statements are treated like asynchronous transactions. This mechanism is called \u201edelayed inserts\u201c. The rows to be inserted are collected in the large pool and processed asynchronously in batches using direct path inserts. That will happen eventually. However, you can call <code>dbms_memoptimize_admin.writes_flush<\/code>&nbsp;to force the rows in the large pool to be written to disk.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fast ingest is much more efficient than a series of conventional single transactions. But, there are some disadvantages to consider.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Data loss in case of a crash of the database instance<\/li>\n\n\n\n<li>Delayed visibility of inserted data<\/li>\n\n\n\n<li>Delayed visibility of errors<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The first two are simply the price to optimize the insert performance of multiple clients. However, the last one is interesting. Where are errors reported in this case and how do we deal with them?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here&#8217;s an example.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2b2b2b;color:#c7c7c7\">Fast ingest with a duplicate row<\/span><span role=\"button\" tabindex=\"0\" data-code=\"SELECT * FROM t5 WHERE key IN (10001, 20001);\n\n       KEY VALUE                         \n---------- ------------------------------\n     10001 PAST7NL2N2W8K9ESS7BZWSI   \n\nBEGIN\n   FOR r IN (SELECT * FROM t4 WHERE key IN (10001, 20001)) LOOP\n      INSERT \/*+ memoptimize_write *\/ INTO t5 VALUES r;\n   END LOOP;\n   dbms_memoptimize_admin.writes_flush;\nEND;\n\/\n\nPL\/SQL procedure successfully completed.\n\nSELECT * FROM t5 WHERE key IN (10001, 20001);\n\n       KEY VALUE                         \n---------- ------------------------------\n     10001 PAST7NL2N2W8K9ESS7BZWSI       \n     20001 4IMKI9RLBTV7                  \n\" style=\"color:#D4D4D4;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dark-plus\" style=\"background-color: #1E1E1E\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t5 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> key <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10001<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20001<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       KEY VALUE                         <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">---------- ------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">10001<\/span><span style=\"color: #D4D4D4\"> PAST7NL2N2W8K9ESS7BZWSI   <\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">BEGIN<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">FOR<\/span><span style=\"color: #D4D4D4\"> r <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t4 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> key <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10001<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20001<\/span><span style=\"color: #D4D4D4\">)) <\/span><span style=\"color: #C586C0\">LOOP<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">      <\/span><span style=\"color: #569CD6\">INSERT<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #6A9955\">\/*+ memoptimize_write *\/<\/span><span style=\"color: #D4D4D4\"> <\/span><span style=\"color: #569CD6\">INTO<\/span><span style=\"color: #D4D4D4\"> t5 <\/span><span style=\"color: #569CD6\">VALUES<\/span><span style=\"color: #D4D4D4\"> r;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #C586C0\">END LOOP<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">   <\/span><span style=\"color: #DCDCAA\">dbms_memoptimize_admin.<\/span><span style=\"color: #4EC9B0\">writes_flush<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">END<\/span><span style=\"color: #D4D4D4\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">PL\/<\/span><span style=\"color: #569CD6\">SQL<\/span><span style=\"color: #D4D4D4\"> procedure successfully completed.<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #569CD6\">SELECT<\/span><span style=\"color: #D4D4D4\"> * <\/span><span style=\"color: #569CD6\">FROM<\/span><span style=\"color: #D4D4D4\"> t5 <\/span><span style=\"color: #569CD6\">WHERE<\/span><span style=\"color: #D4D4D4\"> key <\/span><span style=\"color: #569CD6\">IN<\/span><span style=\"color: #D4D4D4\"> (<\/span><span style=\"color: #B5CEA8\">10001<\/span><span style=\"color: #D4D4D4\">, <\/span><span style=\"color: #B5CEA8\">20001<\/span><span style=\"color: #D4D4D4\">);<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">       KEY VALUE                         <\/span><\/span>\n<span class=\"line\"><span style=\"color: #6A9955\">---------- ------------------------------<\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">10001<\/span><span style=\"color: #D4D4D4\"> PAST7NL2N2W8K9ESS7BZWSI       <\/span><\/span>\n<span class=\"line\"><span style=\"color: #D4D4D4\">     <\/span><span style=\"color: #B5CEA8\">20001<\/span><span style=\"color: #D4D4D4\"> 4IMKI9RLBTV7                  <\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Fast ingest persisted the non-existing row with the key <code>20001<\/code>. But the row with the existing key <code>10001<\/code> was ignored. Somewhere an <code>ORA-00001: unique constraint violated<\/code>\u00a0must have been thrown. But right now I do not know If it was just swallowed or stored somewhere (I have not found the trace file mentioned in <a href=\"https:\/\/docs.oracle.com\/en\/database\/oracle\/oracle-database\/19\/cncpt\/memory-architecture.html#GUID-07D4439A-8E4E-4FBC-A403-1B0F0B9E0058\">Database Concepts<\/a>). If ignoring is the right way to deal with such errors, then we are all set. Otherwise, we have to think a bit more about it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Since February 13 2019 Oracle Database 19c has been available.\u00a0I blogged about this feature\u00a0here and here. Time for an update. So, what&#8217;s new in 19c regarding the MemOptimized Rowstore? Fast Lookup Works with JDBC Thin Driver I listed 16 prerequisites for the MemOptimized Rowstore in this blog post. The last one &#8211;<span class=\"excerpt-hellip\"> [\u2026]<\/span><\/p>\n","protected":false},"author":1,"featured_media":9513,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[107,25,13,85],"class_list":["post-9100","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-oracle","tag-java","tag-performance","tag-plsql","tag-sql"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.9 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>MemOptimized RowStore in Oracle Database 19c - Philipp Salvisberg&#039;s Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"MemOptimized RowStore in Oracle Database 19c - Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"og:description\" content=\"Since February 13 2019 Oracle Database 19c has been available.\u00a0I blogged about this feature\u00a0here and here. Time for an update. So, what&#8217;s new in 19c regarding the MemOptimized Rowstore? Fast Lookup Works with JDBC Thin Driver I listed 16 prerequisites for the MemOptimized Rowstore in this blog post. The last one &#8211; [\u2026]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/\" \/>\n<meta property=\"og:site_name\" content=\"Philipp Salvisberg&#039;s Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-02-17T20:15:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-08T09:25:38+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimize_pool.png\" \/>\n\t<meta property=\"og:image:width\" content=\"414\" \/>\n\t<meta property=\"og:image:height\" content=\"537\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Philipp Salvisberg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:site\" content=\"@phsalvisberg\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Philipp Salvisberg\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/\"},\"author\":{\"name\":\"Philipp Salvisberg\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"headline\":\"MemOptimized RowStore in Oracle Database 19c\",\"datePublished\":\"2019-02-17T20:15:42+00:00\",\"dateModified\":\"2023-11-08T09:25:38+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/\"},\"wordCount\":533,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/memoptimize_pool.png\",\"keywords\":[\"Java\",\"Performance\",\"PL\\\/SQL\",\"SQL\"],\"articleSection\":[\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/\",\"name\":\"MemOptimized RowStore in Oracle Database 19c - Philipp Salvisberg&#039;s Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/memoptimize_pool.png\",\"datePublished\":\"2019-02-17T20:15:42+00:00\",\"dateModified\":\"2023-11-08T09:25:38+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/memoptimize_pool.png\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/02\\\/memoptimize_pool.png\",\"width\":414,\"height\":537},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/2019\\\/02\\\/17\\\/memoptimized-rowstore-in-oracle-database-19c\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MemOptimized RowStore in Oracle Database 19c\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/\",\"name\":\"Philipp Salvisberg&#039;s Blog\",\"description\":\"Database-centric development\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/#\\\/schema\\\/person\\\/34352245c48678b1a5a05d4bc1339515\",\"name\":\"Philipp Salvisberg\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"url\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"contentUrl\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\",\"width\":400,\"height\":400,\"caption\":\"Philipp Salvisberg\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.salvis.com\\\/blog\\\/wp-content\\\/uploads\\\/2010\\\/11\\\/phs_trivadis4.jpg\"},\"sameAs\":[\"http:\\\/\\\/www.salvis.com\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"MemOptimized RowStore in Oracle Database 19c - Philipp Salvisberg&#039;s Blog","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:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/","og_locale":"en_US","og_type":"article","og_title":"MemOptimized RowStore in Oracle Database 19c - Philipp Salvisberg&#039;s Blog","og_description":"Since February 13 2019 Oracle Database 19c has been available.\u00a0I blogged about this feature\u00a0here and here. Time for an update. So, what&#8217;s new in 19c regarding the MemOptimized Rowstore? Fast Lookup Works with JDBC Thin Driver I listed 16 prerequisites for the MemOptimized Rowstore in this blog post. The last one &#8211; [\u2026]","og_url":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/","og_site_name":"Philipp Salvisberg&#039;s Blog","article_published_time":"2019-02-17T20:15:42+00:00","article_modified_time":"2023-11-08T09:25:38+00:00","og_image":[{"width":414,"height":537,"url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimize_pool.png","type":"image\/png"}],"author":"Philipp Salvisberg","twitter_card":"summary_large_image","twitter_creator":"@phsalvisberg","twitter_site":"@phsalvisberg","twitter_misc":{"Written by":"Philipp Salvisberg","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/#article","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/"},"author":{"name":"Philipp Salvisberg","@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"headline":"MemOptimized RowStore in Oracle Database 19c","datePublished":"2019-02-17T20:15:42+00:00","dateModified":"2023-11-08T09:25:38+00:00","mainEntityOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/"},"wordCount":533,"commentCount":2,"publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimize_pool.png","keywords":["Java","Performance","PL\/SQL","SQL"],"articleSection":["Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/","url":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/","name":"MemOptimized RowStore in Oracle Database 19c - Philipp Salvisberg&#039;s Blog","isPartOf":{"@id":"https:\/\/www.salvis.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/#primaryimage"},"image":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/#primaryimage"},"thumbnailUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimize_pool.png","datePublished":"2019-02-17T20:15:42+00:00","dateModified":"2023-11-08T09:25:38+00:00","breadcrumb":{"@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/#primaryimage","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimize_pool.png","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2019\/02\/memoptimize_pool.png","width":414,"height":537},{"@type":"BreadcrumbList","@id":"https:\/\/www.salvis.com\/blog\/2019\/02\/17\/memoptimized-rowstore-in-oracle-database-19c\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.salvis.com\/blog\/"},{"@type":"ListItem","position":2,"name":"MemOptimized RowStore in Oracle Database 19c"}]},{"@type":"WebSite","@id":"https:\/\/www.salvis.com\/blog\/#website","url":"https:\/\/www.salvis.com\/blog\/","name":"Philipp Salvisberg&#039;s Blog","description":"Database-centric development","publisher":{"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.salvis.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.salvis.com\/blog\/#\/schema\/person\/34352245c48678b1a5a05d4bc1339515","name":"Philipp Salvisberg","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","url":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","contentUrl":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg","width":400,"height":400,"caption":"Philipp Salvisberg"},"logo":{"@id":"https:\/\/www.salvis.com\/blog\/wp-content\/uploads\/2010\/11\/phs_trivadis4.jpg"},"sameAs":["http:\/\/www.salvis.com\/"]}]}},"_links":{"self":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/9100","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/comments?post=9100"}],"version-history":[{"count":25,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/9100\/revisions"}],"predecessor-version":[{"id":12654,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/posts\/9100\/revisions\/12654"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media\/9513"}],"wp:attachment":[{"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/media?parent=9100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/categories?post=9100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.salvis.com\/blog\/wp-json\/wp\/v2\/tags?post=9100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}