Off May Not Be Totally Off: Is Oracle In-Memory Database 12c (220.127.116.11.0) Faster?
Most Oracle 12c installations will NOT be using the awesome Oracle Database in-memory features available starting in version 18.104.22.168.0. This experiment is about the performance impact of upgrading to 12c but disabling the in-memory features.
Every experiment I have performed comparing buffer processing rates, clearly shows any version of 12c performs better than 11g. However, in my previous post, my experiment clearly showed a performance decrease after upgrading from 22.214.171.124.0 to 126.96.36.199.0.
This posting is about why this occurred and what to do about it. The bottom line is this: make sure "off" is "totally off."
Turn it totally off, not partially off
What I discovered is by default the in-memory column store feature is not "totally disabled." My experiment clearly indicates that unless the DBA takes action, not only could they be a license agreement violation but a partially disabled in-memory column store slightly slows logical IO processing compared to the 12c non in-memory column store option. Still, any 12c version processes buffer faster than 11g.
My experiment: specific and targeted
This is important: The results I published are based on a very specific and targeted test and not on a real production load. Do not use my results in making a "should I upgrade decision." That would be stupid and an inappropriate use of the my experimental results. But because I publish every aspect of my experiment and it is easily reproducible it is a valid data point with which to have a discussion and also highlight various situations that DBAs need to know about.
You can DOWNLOAD all my experimental results HERE. This includes the raw sqlplus output, the data values, the free R statistics package commands, spreadsheet with data nicely formatted and lots of histograms.
The instance parameter settings and results
Let me explain this by first showing the instance parameters and then the experimental results. There are some good lessons to learn!
Pay close attention to the inmemory_force and inmemory_size instance parameters.
SQL> show parameter inmemory NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ inmemory_clause_default string inmemory_force string DEFAULT inmemory_max_populate_servers integer 0 inmemory_query string ENABLE inmemory_size big integer 0 inmemory_trickle_repopulate_servers_ integer 1 percent optimizer_inmemory_aware boolean TRUE SQL> show sga Total System Global Area 7600078848 bytes Fixed Size 3728544 bytes Variable Size 1409289056 bytes Database Buffers 6174015488 bytes Redo Buffers 13045760 bytes
In my experiment using the above settings the median buffers processing rate was 549.4 LIO/ms. Looking at the inmemory_size and the SGA contents, I assumed the in-memory column store was disabled. If you look at the actual experimental result file "Full ds2-v12-1-0-2-ON.txt", which contain the explain plan of the SQL used in the experiment, there is no mention of the in-memory column store being used. My assumption, which I think is a fair one, was that the in-memory column store had been disabled.
As you'll see I was correct, but only partially correct.
The parameter settings below are when the in-memory column store was totally disabled. They key is changing the default inmemory_force parameter value from DEFAULT to OFF.
SQL> show parameter inmemory NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ inmemory_clause_default string inmemory_force string OFF inmemory_max_populate_servers integer 0 inmemory_query string ENABLE inmemory_size big integer 0 inmemory_trickle_repopulate_servers_ integer 1 percent optimizer_inmemory_aware boolean TRUE SQL> show sga Total System Global Area 7600078848 bytes Fixed Size 3728544 bytes Variable Size 1291848544 bytes Database Buffers 6291456000 bytes Redo Buffers 13045760 bytes
Again, the SGA does not show any in-memory memory space. In my experiment with the above "totally off" settings, the median buffers processing rate was 573.5 LIO/ms compared to "partially off" 549.4 LIO/ms. Lesson: Make sure off is truly off.
It is an unfair comparison!
It is not fair to compare the "partially off" with the "totally off" test results. Now that I know the default inmemory_force must be changed to OFF, the real comparison should be made with the non in-memory column store version 188.8.131.52.0 and the "totally disabled" in-memory column store version 184.108.40.206.0. This is what I will summarize below. And don't forget all 12c versions showed a significant buffer processing increase compared to 11g.
The key question: Should I upgrade?
You may be thinking, if I'm NOT going to license and use the in-memory column store, should I upgrade to version 220.127.116.11.0? Below is a summary of my experimental results followed by the key points.
1. The non column store version 18.104.22.168.0 was able to process 1.1% more buffers/ms (median: 581.7 vs 573.5) compared to to "totally disabled" in-memory column store version 22.214.171.124.0. While this is statistically significant, a 1.1% buffer processing difference is probably not going to make-or-break your upgrade.
2. Oracle Corporation, I'm told, knows about this situation and is working on a fix. But even if they don't fix it, in my opinion my experimental "data point" would not warrant not upgrading to the in-memory column store version 126.96.36.199.0 even if you are NOT going to use the in-memory features.
3. Visually (see below) the non in-memory version 188.8.131.52.0 and the "totally off" in-memory version 184.108.40.206.0 samples sets look different. But they are pretty close. And as I mentioned above, statistically they are "different."
Note for the statistically curious: The red color 220.127.116.11.0 non in-memory version data set is highly variable. I don't like to see this in my experiments. Usually this occurs when a mixed workload sometimes impacts performance, I don't take enough samples or my sample time duration is too short. To counteract this, in this experiment I captured 31 samples. I also performed the experiment multiple times and the results where similar. What I could have done was used more application data to increase the sample duration time. Perhaps that would have made the data clearer. I could have also used another SQL statement and method to create the logical IO load.
What I learned from this experiment
To summarize this experiment, four things come to mind:
1. If you are not using an Oracle Database feature, completely disable it. My mistake was thinking the in-memory column store was disabled when I set it's memory size to zero and "confirmed" it was off by looking at the SGA contents.
2. All versions of 12c I have tested are clearly faster at processing buffers than any version of 11g.
3. There is a very slight performance decrease when upgrading from Oracle Database version 18.104.22.168.0 to 22.214.171.124.0.
4. It is amazing to me that with all the new features poured into each new Oracle Database version the developers have been able to keep the core buffer processing rate nearly at or below the previous version. That is an incredible accomplishment. While some people may view this posting as a negative hit against the Oracle Database, it is actually a confirmation about how awesome the product is.
All the best in your Oracle performance tuning work!
If you have any questions or comments, feel free to email me directly at craig at orapub.com.
|CPU Cores Vs Threads: Utilization Difference..Part2B||Top Five Holiday Gifts For The Oracle DBA||How To Solve A Similar SQL Statement Parsing Issue|