{"id":3853,"date":"2021-07-10T16:18:26","date_gmt":"2021-07-10T16:18:26","guid":{"rendered":"https:\/\/nenadnoveljic.com\/blog\/?p=3853"},"modified":"2021-07-10T16:20:53","modified_gmt":"2021-07-10T16:20:53","slug":"flashback-data-archive-ddl-bottleneck","status":"publish","type":"post","link":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/","title":{"rendered":"Flashback Data Archive DDL Bottleneck"},"content":{"rendered":"<p>Oracle database is designed to perform well under high concurrent load.<\/p>\n<p>With flashback data archive (FBDA), though, you might hit some limitations. In particular, the feature can delay the execution of DDL commands.<\/p>\n<p>I&#8217;ll be demonstrating it on two empty tables with the FBDA configuration (tested on 19.10.0.0.210119):<\/p>\n<pre><code>create flashback archive default fba tablespace users retention 1 year ;\n\ncreate table t1 ( n number ) ;\ncreate table t2 ( n number ) ;\n\nalter table t1 flashback archive  ;\nalter table t2 flashback archive  ;<\/code><\/pre>\n<p>WARNING: In this demo, I&#8217;ll be using debugger for changing memory locations and stopping the program execution to figure out the internal functioning of the feature. Such manipulations are unsafe and unsupported, and can corrupt the database. Therefore, never do them outside your private lab environment.<\/p>\n<h1>Oracle FBDA C functions<\/h1>\n<p>The script fbda.d traces the execution of the FBDA background process:<\/p>\n<pre><code>#pragma D option quiet\n\npid$target:oracle:ktfaundoar_main:entry,\npid$target:oracle:ktfaundoar_main:return\n{\n  printf(\"%Y %s %s\\n\", walltimestamp, probefunc, probename );\n}\n\npid$target:oracle:ktfaundoar_main:return\n{\n  printf(\"\\n\");\n}\n\npid$target:oracle:ktfa_partition_fba_tables:entry\n{\n  printf(\"%Y \\n\", walltimestamp );\n  ustack() ;\n}<\/code><\/pre>\n<p>In particular, it focuses on the following two functions: ktfaundoar_main and ktfa_partition_fba_tables. ktfaundoar_main calls other functions when there&#8217;s work to do. Among others, it periodically calls ktfa_partition_fba_tables, which creates new partitions on FBDA tables as they grow.<\/p>\n<pre><code>ps -ef | grep fbda | grep DB\n1000  7584 13824   0 16:10:15 ?           0:00 ora_fbda_DB<\/code><\/pre>\n<pre><code>dtrace -s fbda.d -p 7584<\/code><\/pre>\n<pre><code>2021 Jul  8 18:34:27 ktfaundoar_main entry\n2021 Jul  8 18:34:27 ktfaundoar_main return\n\n2021 Jul  8 18:39:27 ktfaundoar_main entry\n2021 Jul  8 18:39:27 ktfaundoar_main return\n\n2021 Jul  8 18:44:27 ktfaundoar_main entry\n2021 Jul  8 18:44:27 ktfaundoar_main return<\/code><\/pre>\n<p>As we can see, the FBDA process calls ktfaundoar_main every 5 minutes.<\/p>\n<h1>Interprocess communication<\/h1>\n<p>Between two consecutive calls, the FBDA process is waiting on a message:<\/p>\n<pre><code>pstack 7584\n7584:   ora_fbda_DB\n00007ff75427741a portfs   (5, 4, 7fffbfff8200, 3, 0, 7fffbfff8220)\n00000000062a650d sskgpwwait () + dd\n00000000062a60f3 skgpwwait () + c3\n00000000064a984d ksliwat () + 9ad\n00000000064a8a3f kslwaitctx () + af\n000000000a7f618d ktfaundoar () + 86d\n00000000073e2473 ksbrdp () + 543\n0000000006fe0399 opirip () + 2b9\n00000000061f0cd0 opidrv () + 160\n00000000061f0ae7 sou2o () + 97\n00000000061f08b4 opimai_real () + a4\n00000000061f040b ssthrdmain () + 26b\n00000000061f0179 main () + a9\n0000000007868c34 ???????? ()<\/code><\/pre>\n<p>This waiting is instrumented by the &#8220;fbar timer&#8221; wait event:<\/p>\n<pre><code>column program format a25\ncolumn event format a10\nSQL&gt; select program,event,seconds_in_wait from v$session where program like '%FBDA%' ;\n\nPROGRAM                   EVENT      SECONDS_IN_WAIT\n------------------------- ---------- ---------------\noracle@svdbp01i (FBDA)    fbar timer             112<\/code><\/pre>\n<p>The &#8220;fbar timer&#8221; wait event is an idle wait, i.e. not contributing to the total database time. Simply put, the FBDA process isn&#8217;t doing any work during this time &#8211; it&#8217;s just waiting on a message without blocking anyone.<\/p>\n<p>A process performing DDL on a table with configured FBDA will ask the FBDA process to do some work on its behalf, for example:<\/p>\n<pre><code>truncate t1<\/code><\/pre>\n<p>The FBDA process immediately exits the waiting state to perform the work &#8211; we can see several consecutive calls to ktfaundoar_main:<\/p>\n<pre><code>2021 Jul  8 17:27:45 ktfaundoar_main entry\n2021 Jul  8 17:27:46 ktfaundoar_main return\n\n2021 Jul  8 17:27:47 ktfaundoar_main entry\n2021 Jul  8 17:27:47 ktfaundoar_main return\n\n2021 Jul  8 17:27:48 ktfaundoar_main entry\n2021 Jul  8 17:27:48 ktfaundoar_main return\n\n2021 Jul  8 17:27:49 ktfaundoar_main entry\n2021 Jul  8 17:27:49 ktfaundoar_main return\n\n2021 Jul  8 17:27:50 ktfaundoar_main entry\n2021 Jul  8 17:27:50 ktfaundoar_main return\n\n2021 Jul  8 17:27:51 ktfaundoar_main entry\n2021 Jul  8 17:27:51 ktfaundoar_main return<\/code><\/pre>\n<p>In addition, I configured SQL trace on FBDA:<\/p>\n<pre><code>select sid,serial# from v$session where program like '%FBDA%' ;\n\n       SID    SERIAL#\n---------- ----------\n       289      53053\n\nexec dbms_system.set_ev(si=&gt;289, se=&gt;53053, ev=&gt;10046, le=&gt;8, nm=&gt;'');<\/code><\/pre>\n<p>The FBDA process executed some SQL statements, like the following one:<\/p>\n<pre><code>update SYS_FBA_BARRIERSCN set BARRIERSCN=:1, ACTIVESCN=:2, STATUS=:3 where INST_ID=:4<\/code><\/pre>\n<p>I used the update.d script to find out Oracle C functions underpinning the update.<\/p>\n<pre><code>#pragma D option quiet\n\npid$target:oracle:*upd*:entry\n{\n  ustack(200) ;\n}<\/code><\/pre>\n<pre><code>dtrace -s update.d -p 7584\n\n\noracle`kokbntupd\noracle`kauupd+0x348\noracle`updrow+0x7e7\noracle`qerupUpdRow+0x369\noracle`qerupRopRowsets+0x111\noracle`qerstRowP+0x587\noracle`kdstf110110100001000km+0xe91\noracle`kdsttgr+0x757\noracle`qertbFetch+0x542\noracle`qerstFetch+0x542\noracle`qerupFetch+0x3e6\noracle`qerstFetch+0x5c0\noracle`updaul+0x676\noracle`updThreePhaseExe+0x14a\noracle`updexe+0x1ec\noracle`opiexe+0x3182\noracle`kpoal8+0xb5a\noracle`opiodr+0x439\noracle`kpoodrc+0x26\noracle`rpiswu2+0x2d6\noracle`kpoodr+0x2bb\noracle`upirtrc+0xf7b\noracle`kpurcsc+0x6e\noracle`kpuexec+0x1e8e\noracle`OCIStmtExecute+0x29\noracle`ktfaubscn+0x506\noracle`ktfaarchiver1+0x10b0\noracle`ktfaarchiver+0x529\noracle`ktfaundoar_main+0x2c8\noracle`ktfaundoar+0x8c5\noracle`ksbrdp+0x543\noracle`opirip+0x2b9\noracle`opidrv+0x160\noracle`sou2o+0x97\noracle`opimai_real+0xa4\noracle`ssthrdmain+0x26b\noracle`main+0xa9<\/code><\/pre>\n<p>Why&#8217;s that interesting?<\/p>\n<p>Because if we set the breakpoint in any of those functions, we can simulate a performance problem with the FBDA process and observe how the sessions are behaving during that time.<\/p>\n<h1>Serialization<\/h1>\n<p>After attaching the debugger to the FBDA process and setting a breakpoint on the updrow function, I&#8217;ll truncate the T1:<\/p>\n<pre><code>attach 7584\nb updrow<\/code><\/pre>\n<pre><code>truncate table t1 ;<\/code><\/pre>\n<p>The FBDA process hit the breakpoint, and truncate table is hanging as long as the FBDA process execution is paused.<\/p>\n<p>In this state, I&#8217;ll start the truncate on another table, which will also hang:<\/p>\n<pre><code>truncate table t2 ;<\/code><\/pre>\n<h1>Instrumentation gap<\/h1>\n<p>Now we can observe the sessions in V$SESSION:<\/p>\n<pre><code>column program format a25\ncolumn event format a10\nselect program, state, event, seconds_in_wait\n  from v$session se\n  where sid != userenv('SID') and\n    ( program like 'sqlplus%' or program like '%FBDA%' ) ;\n\nPROGRAM                   STATE               EVENT      SECONDS_IN_WAIT\n------------------------- ------------------- ---------- ---------------\nACTION\n----------------------------------------------------------------\nsqlplus@svdbp01i (TNS V1- WAITING             fbar timer              57\nV3)\n\n\nsqlplus@svdbp01i (TNS V1- WAITING             fbar timer             451\nV3)\n\n\noracle@svdbp01i (FBDA)    WAITED KNOWN TIME   fbar timer             483<\/code><\/pre>\n<p>Both sessions executing truncate are waiting on the &#8220;fbar timer&#8221; wait event, i.e. they are waiting on a message from the FBDA process. The FBDA process will send this message after it completes its part.<\/p>\n<p>But notice the ambiguity of the &#8220;fbar timer&#8221; wait event. On the one hand, the FBDA process is waiting on &#8220;fbar timer&#8221; when it doesn&#8217;t have anything else to do, so it&#8217;s an idle event. On the other hand, the user session is in the same wait while waiting on the FBDA process to complete. Since the DDL statement doesn&#8217;t complete before the user process receives the message from the FBDA process, it shouldn&#8217;t be classified as &#8220;idle&#8221; in this partucular case.<\/p>\n<p>Consequently, ASH doesn&#8217;t capture the user session waiting on a message from FBDA to complete:<\/p>\n<pre><code>@ashtop session_id,program2,event2 1=1 &amp;5min\n    Total                                                                                                                                                          Distinct\n  Seconds     AAS %This   SESSION_ID PROGRAM2                                 EVENT2                                     FIRST_SEEN          LAST_SEEN           Execs Seen\n--------- ------- ------- ---------- ---------------------------------------- ------------------------------------------ ------------------- ------------------- ----------\n      300     1.0   97% |        289 (FBDA)                                   ON CPU                                     2021-07-08 18:23:44 2021-07-08 18:28:43          1\n        5      .0    2% |         53 (DBRM)                                   ON CPU                                     2021-07-08 18:24:16 2021-07-08 18:28:41          1<\/code><\/pre>\n<p>In other words, the DBA won&#8217;t be able to analyze slow truncates retrospectively.<\/p>\n<p>I covered this instrumentation gap in <a href=\"https:\/\/nenadnoveljic.com\/blog\/fbar-timer-active-session-history-instrumentation-gap\/\">a previous blog post<\/a> and also provided workarounds.<\/p>\n<p>So far, I demonstrated how a performance problem in the FBDA process can slow down DDL operations. I also showed the blind spot in the Oracle database instrumentation.<\/p>\n<h1>FBDA maintenance<\/h1>\n<p>With debugger, I simulated a performance problem on the update statement, which is less likely to happen in the real world. But during the maintenance window, the FBDA process executes much heavier statements, like split partition on large FBDA tables:<\/p>\n<pre><code>select floor(sum(BYTES\/1024\/1024)) from DBA_SEGMENTS where SEGMENT_NAME='SYS_FBA_HIST_4925624' and OWNER='OWNER' and PARTITION_NAME='HIGH_PART'\n\nselect sum(extents) from DBA_SEGMENTS where SEGMENT_NAME='SYS_FBA_HIST_4925624' and OWNER='OWNER' and PARTITION_NAME='HIGH_PART'\n\nalter table \"OWNER\".SYS_FBA_HIST_4925624 split partition high_part at (74291633007) into (partition part_74291633007, partition high_part)<\/code><\/pre>\n<p>This is likely to cause a concurrency problem with DDL statements coming from user processes.<\/p>\n<p>This maintenance code runs once per day at 2 AM. That schedule is inconvenient for experimenting except for night owls.<\/p>\n<p>Unfortunately, there isn&#8217;t a known way to shorten the interval or adjust the starting time. But I figured out a hack (for lab environments only).<\/p>\n<p>The interval is stored in the memory chunk marked as &#8220;ktfa dynamic SG&#8221;:<\/p>\n<pre><code>select KSMCHPTR, KSMCHSIZ from\n    x$ksmsp\nwhere ksmchcom = 'ktfa dynamic SG' ;\n\nKSMCHPTR           KSMCHSIZ\n---------------- ----------\n000000009091FDB8        648<\/code><\/pre>\n<p>With debugger, we can search for the value 86400 (86400 seconds = 1 day) in this chunk:<\/p>\n<pre><code>(gdb) x\/648d 0x000000009091FDB8\n...\n0x90920018:       86400   0       0       0<\/code><\/pre>\n<p>In our case, the interval value is stored in the location 0x90920018;<\/p>\n<pre><code>(gdb) x\/d 0x90920018\n0x90920018:       86400<\/code><\/pre>\n<p>After storing a low (unsigned integer) value in this address location, ktfaundoar_main will start executing the maintenance on each run, i.e. every 5 minutes, instead of once per day:<\/p>\n<pre><code>(gdb) set *0x90920018=1\n(gdb) x\/d 0x90920018\n0x90920018:       1<\/code><\/pre>\n<pre><code>2021 Jul  8 18:54:27 ktfaundoar_main entry\n2021 Jul  8 18:54:27\n\noracle`ktfa_partition_fba_tables\noracle`ktfa_traverse_tracked_tables+0x361\noracle`ktfa_do_scheduled_tasks_pdb+0xbd\noracle`ktfa_do_scheduled_tasks+0x24\noracle`ktfaundoar_main+0xa6d\noracle`ktfaundoar+0x8c5\noracle`ksbrdp+0x543\noracle`opirip+0x2b9\noracle`opidrv+0x160\noracle`sou2o+0x97\noracle`opimai_real+0xa4\noracle`ssthrdmain+0x26b\noracle`main+0xa9\na.out`0x7868c34<\/code><\/pre>\n<p>Now we can set a breakpoint somewhere in the maintenance procedures to emulate a performance problem:<\/p>\n<pre><code>(gdb) b ktfa_partition_fba_tables\n\nThread 2 hit Breakpoint 1, 0x000000000a87f520 in ktfa_partition_fba_tables ()<\/code><\/pre>\n<p>After hitting the first breakpoint, we&#8217;ll set another breakpoint at fetching:<\/p>\n<pre><code>(gdb) b *qertbFetch\nNote: breakpoint 2 (disabled) also set at pc 0x67e9980.\nBreakpoint 3 at 0x67e9980\n(gdb) c\nContinuing.\n\nThread 2 hit Breakpoint 3, 0x00000000067e9980 in qertbFetch ()<\/code><\/pre>\n<p>Now we can see what the FBDA process is currently executing:<\/p>\n<pre><code>column program format a25\ncolumn event format a10\nselect program, state, event, seconds_in_wait, sql_text\n  from v$session se, v$sqlarea sq\n  where sid != userenv('SID') and\n  program like '%FBDA%' and sq.address = se.sql_address ;\n\nPROGRAM                   STATE               EVENT      SECONDS_IN_WAIT\n------------------------- ------------------- ---------- ---------------\nSQL_TEXT\n--------------------------------------------------------------------------------\noracle@svdbp01i (FBDA)    WAITED SHORT TIME   fbar timer             232\nselect OWNERNAME, OBJNAME from SYS_FBA_TRACKEDTABLES where OBJ#=52340<\/code><\/pre>\n<p>It&#8217;s currently processing the T1 table:<\/p>\n<pre><code>select object_name from dba_objects where object_id=52340 ;\n\nOBJECT_NAME\n--------------------------------------------------------------------------------\nT1<\/code><\/pre>\n<p>Next, I&#8217;ll truncate a completely different table, currently not being processed by the FBDA process. The truncate of T2 will wait in fbar timer, even though the FBDA is currently processing the T1 table:<\/p>\n<pre><code>truncate table t2 ;<\/code><\/pre>\n<pre><code>set pagesize 100\ncolumn program format a25\ncolumn event format a10\nselect program, state, event, seconds_in_wait, se.action\n  from v$session se\n  where sid != userenv('SID') and\n    ( program like 'sqlplus%' or program like '%FBDA%' ) ;\n\nPROGRAM                   STATE               EVENT      SECONDS_IN_WAIT\n------------------------- ------------------- ---------- ---------------\nACTION\n----------------------------------------------------------------\noracle@svdbp01i (FBDA)    WAITED SHORT TIME   fbar timer             379\n\n\nsqlplus@svdbp01i (TNS V1- WAITING             fbar timer              65\nV3)<\/code><\/pre>\n<p>Truncate completed immediately after the FBDA process had continued the execution:<\/p>\n<pre><code>(gdb) detach\nDetaching from program: \/u00\/oracle\/orabase\/product\/19.10.0.0.210119_b\/bin\/oracle, process 7584\n[Inferior 1 (process 7584) detached]<\/code><\/pre>\n<pre><code>Table truncated.<\/code><\/pre>\n<h1>Conclusion<\/h1>\n<p>The FBDA background process is in the critical path of every DDL statement executed on a table with configured FBDA. Simply put, FBDA has to execute something on behalf of the user session before the DDL statement completes. The user process sends a message to the FBDA process when the action is required and then waits on the message from the FBDA process, which will arrive only after FBDA completes its part.<\/p>\n<p>While being busy with serving the current request, the FBDA process is not able to accept requests from any other process. In other words, it&#8217;s a serialization point for DDLs.<\/p>\n<p>It doesn&#8217;t even need two user sessions to suffer this serialization. It can also happen while the FBDA process is being busy with the maintenance work on FBDA tables, like splitting partitions.<\/p>\n<p>The serialization problem is not visible in retrospect, because it isn&#8217;t properly instrumented. So if you weren&#8217;t aware of these undocumented mechanisms, you would be clueless when users start complaining about slow truncates, because you wouldn&#8217;t find any ASH samples for it.<\/p>\n<p>What&#8217;s exactly the problem with the instrumentation?<\/p>\n<p>Both the FBDA background process and the user process use wait event &#8220;fbar timer&#8221; when waiting on each other. While in the case of the FBDA process, this is an idle event, i.e. not contributing to the total database time, in the case of the user process, it should definitely count as the database time, because the statement doesn&#8217;t complete until the process receives the message from the FBDA process.<\/p>\n<p>Since in both cases &#8220;fbar timer&#8221; is treated as an idle event, the sessions waiting on it will neither be captured in ASH nor contribute to the total database time.<\/p>\n<p>You need to build your own instrumentation for overcoming this problem.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Undocumented flashback data archive internals <a href=\"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/\" class=\"more-link\">Continue Reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[44,5],"tags":[],"class_list":["post-3853","post","type-post","status-publish","format-standard","hentry","category-flashback-data-archive","category-oracle"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Flashback Data Archive DDL Bottleneck - All-round Database Topics<\/title>\n<meta name=\"description\" content=\"Undocumented flashback data archive internals\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flashback Data Archive DDL Bottleneck - All-round Database Topics\" \/>\n<meta property=\"og:description\" content=\"Undocumented flashback data archive internals\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/\" \/>\n<meta property=\"og:site_name\" content=\"All-round Database Topics\" \/>\n<meta property=\"article:published_time\" content=\"2021-07-10T16:18:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-07-10T16:20:53+00:00\" \/>\n<meta name=\"author\" content=\"Nenad Noveljic\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@NenadNoveljic\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nenad Noveljic\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/\"},\"author\":{\"name\":\"Nenad Noveljic\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"headline\":\"Flashback Data Archive DDL Bottleneck\",\"datePublished\":\"2021-07-10T16:18:26+00:00\",\"dateModified\":\"2021-07-10T16:20:53+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/\"},\"wordCount\":1182,\"commentCount\":8,\"articleSection\":[\"fashback data archive\",\"Oracle\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/\",\"name\":\"Flashback Data Archive DDL Bottleneck - All-round Database Topics\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\"},\"datePublished\":\"2021-07-10T16:18:26+00:00\",\"dateModified\":\"2021-07-10T16:20:53+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\"},\"description\":\"Undocumented flashback data archive internals\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/flashback-data-archive-ddl-bottleneck\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flashback Data Archive DDL Bottleneck\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/\",\"name\":\"All-round Database Topics\",\"description\":\"Nenad Noveljic\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/#\\\/schema\\\/person\\\/51458d9dd86dbbdd19f5add451d44efa\",\"name\":\"Nenad Noveljic\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g\",\"caption\":\"Nenad Noveljic\"},\"sameAs\":[\"nenad-noveljic-9b746a6\",\"https:\\\/\\\/x.com\\\/NenadNoveljic\"],\"url\":\"https:\\\/\\\/nenadnoveljic.com\\\/blog\\\/author\\\/nenad\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Flashback Data Archive DDL Bottleneck - All-round Database Topics","description":"Undocumented flashback data archive internals","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:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/","og_locale":"en_US","og_type":"article","og_title":"Flashback Data Archive DDL Bottleneck - All-round Database Topics","og_description":"Undocumented flashback data archive internals","og_url":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/","og_site_name":"All-round Database Topics","article_published_time":"2021-07-10T16:18:26+00:00","article_modified_time":"2021-07-10T16:20:53+00:00","author":"Nenad Noveljic","twitter_card":"summary_large_image","twitter_creator":"@NenadNoveljic","twitter_misc":{"Written by":"Nenad Noveljic","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/#article","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/"},"author":{"name":"Nenad Noveljic","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"headline":"Flashback Data Archive DDL Bottleneck","datePublished":"2021-07-10T16:18:26+00:00","dateModified":"2021-07-10T16:20:53+00:00","mainEntityOfPage":{"@id":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/"},"wordCount":1182,"commentCount":8,"articleSection":["fashback data archive","Oracle"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/","url":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/","name":"Flashback Data Archive DDL Bottleneck - All-round Database Topics","isPartOf":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#website"},"datePublished":"2021-07-10T16:18:26+00:00","dateModified":"2021-07-10T16:20:53+00:00","author":{"@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa"},"description":"Undocumented flashback data archive internals","breadcrumb":{"@id":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/nenadnoveljic.com\/blog\/flashback-data-archive-ddl-bottleneck\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nenadnoveljic.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Flashback Data Archive DDL Bottleneck"}]},{"@type":"WebSite","@id":"https:\/\/nenadnoveljic.com\/blog\/#website","url":"https:\/\/nenadnoveljic.com\/blog\/","name":"All-round Database Topics","description":"Nenad Noveljic","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nenadnoveljic.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/nenadnoveljic.com\/blog\/#\/schema\/person\/51458d9dd86dbbdd19f5add451d44efa","name":"Nenad Noveljic","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97b796613ea48ec8a7b79c8ffe1c685dcffc920c68121f6238d5caab5070670?s=96&d=mm&r=g","caption":"Nenad Noveljic"},"sameAs":["nenad-noveljic-9b746a6","https:\/\/x.com\/NenadNoveljic"],"url":"https:\/\/nenadnoveljic.com\/blog\/author\/nenad\/"}]}},"_links":{"self":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/3853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/comments?post=3853"}],"version-history":[{"count":1,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/3853\/revisions"}],"predecessor-version":[{"id":3868,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/posts\/3853\/revisions\/3868"}],"wp:attachment":[{"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/media?parent=3853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/categories?post=3853"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nenadnoveljic.com\/blog\/wp-json\/wp\/v2\/tags?post=3853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}