KSCOPE 2012 Events!

I’m forwarding out the latest KSCOPE 2012 Email. I love their stuff!!

————————————————————————————
The stars at night are big and bright, deep in the heart of Texas… And some of the brightest stars of the Oracle world will light up the scene at ODTUG’s Kscope12, San Antonio, June 24-28.

Celebrated around the world for its top-notch content, outstanding networking opportunities, and memorable special events, ODTUG Kscope is unquestionably THE premier user conference for Oracle training. Kscope12 promises to deliver the goods again this year!

At last year’s special event, ODTUGgers were putting on the Ritz aboard the Queen Mary. At this year’s special event, Wednesday, June 27, we’re ready to saddle up and giddy up for a real live rodeo at the Knibbe (pronounced ka-NIB-bee) Ranch, a working ranch in the beautiful Texas Hill Country.

All you wranglers get ready for some good old-fashioned fun at the Knibbe including:

Mechanical bull rides
Racing armadillos
An official rodeo (not a showdeo)
Texas two-step and line dancing
A hay ride to tour this certified Texas Century Ranch and its archeological digs
Authentic Texas BBQ

Visiting the Knibbe Ranch during Kscope12 will be an experience you will never forget. Don’t just take our word for it—check out what Harold Hecuba has to say about it by clicking on this video. This once-in-a-lifetime event is included with your registration fee.

If you are bringing your junior wranglers to the conference, ODTUG has a special Wednesday night planned for them too at the Kscope Kids Club at the JW Marriott. Trained childcare professionals will supervise a Glow in the Dark Kid’s Party including pizza, a fun movie, glow in the dark games, fabulous face painting, interactive crafts, and energy-filled dance. Click here for other Fun Factor activities offered at the resort.

So mosey on over to the registration page ‘cause Early Bird Registration ends in less than two weeks. Already saddled up for Kscope12? Great! But hotel rooms are going fast, so make your reservation today.
—————————————————————————————
OK Pardners! Go sign up already!!! :)
~DBAKevlar

The Technical Bully Scenario

I’ve been again, unfortunately, reminded what makes a poor work environment for a DBA or Developer.  Eddie Awad had sent this out and the second one really resonated with me:

http://www.washingtonpost.com/national/on-leadership/how-to-completely-utterly-destroy-an-employees-work-life/2012/03/05/gIQAxU3iuR_story.html?tid=sm_twitter_washingtonpost

I refer to this in the IT world as the “technical bully syndrome” and it’s quite common in the arena.  It’s not because it’s a male dominated group- I’ve seen bullies come in all shapes and sizes, along with being of both genders.  In fact, there are a couple studies out there that say women managers and leads are more likely to bully a subordinate than a male is.

Now there isn’t any law against having a bad boss/manager/lead.  I lucked out in that I actually have quite a good manager where I currently work, but even if you are a good manager, you also have to note the cost to the business when you have people report to someone who does bully.  This individual pinpointed as the bully, will most likely get along very well with 90% of the folks around them.  They have a consistent need though, to pick out an “outlet” for their aggressions/frustrations and may have a small set of subordinates or peers that they switch from, bullying in intervals.    Often the switch occurs as the bully’s target starts to or simply threatens to escalate to management or HR if the bullying does not cease, the bully will then move their bulls-eye onto another target.

The cost?  Time, resources, revenue and productivity to the business.

It takes time to bully someone- time out of the bully’s day, but also time out of the target’s day when they could be productive.  The target can also be highly impacted post the incidents, feeling frustrated, disrespected and devalued.  The time lost then results in productivity loss to both parties, which in turn then costs the company revenue.  If left to continue for very long, resources are lost and high-turnover becomes the norm.

The target, who may have been highly productive in the past will start to show less results and seem to have conflicting requirements.  They may seem frustrated and angry, feeling unable to understand how to address the problem successfully or no matter what changes they make to their work style, without management intervention, they are unable to find a way to avoid the bully’s wrath.

The bully often chooses targets that are not weak, but strong.  Peers or subordinates that make them feel threatened, no matter if the threat is real or imagined.  They will continually find ways to undermine the target and make them seem insignificant.  If the target does decide to choose a defensive pose, becoming angry or responding in kind, this can escalate the behavior from the bully.  Often the bully does not see themselves as doing anything wrong!  They may be completely unaware of their behavior, having grown up with it and/or may live with similar disrespect in their personal relationships currently.

When I have been a target in the past, I have often either threatened the bully because of my technical skills, which they seemed to be completely focused on trying to convince everyone that were not sound and/or give conflicting requests to make it impossible for me to meet requirements or I reminded them of someone, (often a wife or mother..) that they had long-time issues with and felt it was acceptable to use me as an outlet when they became frustrated.

There are those that were equal-opportunity bullies.  It didn’t matter if you were male, female, what race you belonged to or your position- as long as you were below them, you were fair game and you simply did your best to avoid their bulls-eye.

I have stayed employed for a company where I was a target on and off for a couple years, until someone figured out what was going on and rid the company of the bully that was causing the high-turnover and tumultuous work environment.  The DBA’s group at that time found quite peaceful, productive years post the bully’s departure.

I have worked for another company for a very short time, where I saw the bulls-eye aiming for me and left so fast that the bully’s head spun.

No one knows what a DBA does but a DBA.  No one knows what a good DBA is except other DBA’s, (and then some would argue that there are a few that are heavily followed that would not be if most DBA’s only knew… J)  As a DBA who has seen how well IT groups can work together when everyone respects each other and respects what skills each person offers and how poorly the group will perform, how high turnover will be when a bully exists in the group, I hope more managers taken notice.

Yes, it’s not against the law to have a bully in your midst, but it should be a crime to allow it to damage the productivity, growth, resources and revenue for the company.

CBO, Statistics and A Rebel(DBA) With A Cause

This is not an “I’m against Oracle Best Practices” article.

This is not an “I’m preaching against histograms” article.

This is not an article telling folks that they should EVER take the steps or the choices that are presented in this article.

I’m also going to refer to the wonderful post by Greg Rahn as to the reasons why what works in my environment would most likely NOT work in yours:

http://structureddata.org/2008/10/14/dbms_stats-method_opt-and-for-all-indexed-columns/

What this article IS:

  1.  An honest account of how a unique database design was impacted when changing from a previously researched method of stats collection to post an 11g upgrade to the recommended choices.
  2. The reasons, including the high level data, (to protect the innocent, which happens to be the DBA writing this post, due to her confidentiality agreement…) that lead to the findings.
  3. The steps that were utilized, (and some that are still underway) to correct the performance issues introduced.
  4. The why a DBA should know their data/database, research, test, research, test some more and trust their knowledge.

 

Many folks in the Oracle arena were aware that I was undertaking a complex and challenging 11g upgrade.  This upgrade was challenging due to multiple datamarts, built using RMAN’s duplicate command, that would require me to perform a series of upgrades, one after another successfully.  IT was an “all or nothing” upgrade scenario and due to the interval, I had a very limited timeline to make it right or an inability to rollback the upgrade.

The initial source database environment was upgraded to 11.2.0.2.0 with the latest patch on a Tuesday and the first datamart to be built off of the upgrade was initialized, with all the script changes on that Friday in mid-December.  There were a couple challenges, including the office closed down between the Christmas week, (if no one is using the databases, how do you really know there is something wrong from your user base??  There were positives and negatives, I took the path of less users in the database meant I had downtime to work through any issues!)  The first build was completed and outside of a few, minor performance issues, the initial upgrade phase was successful and progressed along successfully through the initial mart build.

The 10g environment had been offered a slot of my time back in late 2009-early 2010 for careful performance tuning recommendations.  The database is a dual-purpose database that is over 12TB of large, wide main tables, over 100 columns wide for most and incorporating only 2-4 columns per table in any where clause.    Much of the data is used during a load process and almost exclusively in that load process.  This resulted in me recommending, due to this unique design,  to move much of the stats collection into the code level.  The DBA staff previously had relied on dynamic sampling for much of the safety net and by moving to statistics collection within the code, much of the performance challenge stabilized.  There was a nightly job that was the “catch-all”, creating stats collection calls from objects  listed as “STALE” in the DBA_TAB_MODIFICATIONS table.  Due to partitioning strategies that were based on reporting and not on data loads, hints were incorporated into the load processes to stabilize many of the erratic plans that were impacting performance and to deter poor choices from bind peeking.   As we moved the developers from performing DML transactions against the large partitions to a more mature choice of partition exchange, the database performance continued to stabilize and the business grew more satisfied.  The remaining performance issues were considered non-issues and no further performance tuning was really addressed in the source database except to realize there would be some required with the upgrade to 11g and a few one-offs that came up as new code was introduced.

I had learned quickly in 9i and 10g to know my database when it came to how to collect statistics and for this database, where large, wide tables, the same 2-4 indexed columns used in all where clauses and execution plans that needed to be stable, the following held particular, satisfying results:

METHOD_OPT=> ‘FOR ALL INDEXED COLUMNS’

The database simply did not care about the other columns and ran well with a streamlined, efficient data dictionary that did not offer many options than the basic information.  The culture among the developers and former DBA’s had grown into one that due to design challenges, had implemented a solid “code with hints” formula that was the only one I had ever seen created successfully.  It was an abrupt change, considering my former two positions I had spent most of my time removing hints to let the optimizer do its jobs after correcting statistics!  With this new environment, the source database only needed to retain information about the tables as a whole and the indexed columns that would be used in the load and reporting processes.

  • The load process would use the indexed columns.
  • The reporting processes used the partitions

For the 10g environment, stats collection on stale objects could run anywhere from 10 minutes to 8hrs.  The DBA_TAB_MODIFICATIONS table was cleared out nightly and plans were stable.

The 11g upgrade had been in place for the main design for one week when I proceeded forward with the *standard* for 11g statistics gathering.   All the DBA’s were in agreement that I would proceed forward with this post the upgrade, but until they attended Maria Colgan’s sessions at RMOUG in mid February, I don’t know if they truly realized what change I was undertaking, (they’ve mostly left performance tuning and statistics to me happily…)

Maria Colgan has been one of my favorites for quite some time, so of course, her blog posts are referenced here as some of the most important ones to me in my decision for what we should do for stats gathering in our forthcoming 11g databases:

https://blogs.oracle.com/datawarehousing/entry/managing_optimizer_statistics

I’d already utilized many of her recommendations, albeit hacked for the unique mart environments with much success when it came to partitioned objects:

http://optimizermagic.blogspot.com/2009/02/maintaining-statistics-on-large.html

I have extended stats on many of number of specific objects in my marts and even one table that I drop stats and lock the table stats due to dynamic sampling is the ONLY way the CBO utilizes this table correctly on a consistent basis, (always  have to have one odd one out!)  Everything is scripted, runs automatically and consistently since December, 2009, providing, (again!) consistent performance in our multiple mart environments, where prior to December 2009, the performance of the mart environments were erratic and beyond anything the former DBA’s could guarantee.

I knew I would not have the issues in my source database with any of the above concerns, including large partitions, as we were collecting stats at the partition level in the code during load/creation time.

Greg Rahn, Randolf Geist and others all had incredibly informative and universally similar messages on what should and should not be done in an 11g database, including improvements in how 11g’s stats collection features functioned.  I really was only interested in one change and that was to METHOD_OPT.

I’ve always been a DBA engrossed by anything Cost Based Optimizer, (CBO) related and considered myself well-versed in the area, specifically in the challenges of warehouse databases.

I then made my first, “should know better” mistake.  I stopped researching my own environment, testing further stats collection changes from 10g to 11g and blindly trusted what I was reading.   Hey, I was only going to give the CBO more information, let 11g make the decisions on the method of how to collect the statistics, everything else in my scripts would remain the same.

CBO performance is dependent on a number of factors for the feature to function optimally in any database and Oracle offers us auto stats gathering jobs and a scheduler to run these jobs-straight out of the box.  One of the largest dependencies to this offering of is:

  1.  Design of the database.
  • Is the database actually designed so that joins can be effective and efficient?
  • Is the partitioning strategy well thought out and evenly distributed?
  • Do the correct indices exist or are their extra indices that should be reviewed and removed?
  • Are their hints, bugs or any other obstacles to the CBO doing its job?

2.   Data

  • How is the data loaded vs. queried.  Is this process very different from the requirements.
  • Is the database multi-use so that transactional and reporting reside in the same database, resulting in concurrency issues?
  • Is the database so large that the auto scheduler window runs out of time each day, building up a queue of objects that never have stats gathered?

I had collected my 10g SQL Baselines and had these to return to at any time.  I was confident in my skills to determine good plan from bad plan, (I work with a DBA currently who first approached me in a conference a couple years ago because he wanted to know how I knew a slide in my presentation was a mistake, having put in a “bad plan” for a specific SQL statement…  This all goes back into the depth some of us obsessed DBA’s get into our data..:))

Now, with this in knowledge in hand, I implemented the following change:

METHOD_OPT=> ‘FOR ALL INDEXED COLUMNS’

Yes, I simply removed the method option, allowing Oracle to make the choice it felt was best.  This is when, slowly but surely, all $#%& broke loose.

 

Now many of you will quickly assume it was in the form of poor performance and you would be correct.  The reason behind the performance and what was most challenging about it, was what was not as clear.

I did have a few incidents of bind peeking and where hints were ignored and such.

select * from table(dbms_xplan.display_awr(’7rjk8mr85s2nq));

Wow…21 different plans for the same statement…

INSERT INTO DW_USR.CT1 (COL1,COL2,COL3,COL4,COL5,COL6,COL7.....
COL18,COL19,COL20)
SELECT * FROM ( SELECT S.COL1, S.COL2, S.COL3, ROW_NUMBER ()
OVER (PARTITION BY S.COL5, S.COL6,S.COL7, S.COL8
ORDER BY S.COL12) COL6,S.COL2, S.COL12, S.COL15,
S.COL19, S.COL5, S.COL15, S.COL22,
S.COL27, S.LAST_FILE_ID, S.COL28,
S.COL29, S.COL31, S.COL33,
S.COL35, S.COL36, S.COL37,
S.COL38, S.COL39, S.COL40,
S.COL43, S.COL44, S.F1, S.F2, S.F3,
S.F4, S.F5, S.F6, S.F7, S.F8, S.F9, S.F10,
S.COL45, S.COL46, S.COL47,
S.COL48, S.COL81
FROM ( SELECT /*+ use_hash(cts ca) */
CTS.COL5, CA.COL3, CTS.COL6,
CTS.COl76 AS COL6, CTS.COL2,
CTS.COL12, CTS.COL15, NULL AS COL19,
CTS.COL5, CTS.COL15, CTS.COL22,
CTS.COL27, CTS.COL7 AS LFID,
CTS.COL28, CTS.COL17, CTS.COL31,
CTS.COL33, CTS.COL35, CTS.COL36,
CTS.COL37, CTS.COL38,
CTS.COL39, CTS.COL40 AS COL40, :B5 AS
COL43, :B5 AS COL44, CTS.F1, CTS.F2,
CTS.F3, CTS.F4, CTS.F5, CTS.F6, CTS.F7, CTS.F8,
CTS.F9, CTS.F10, CTS.COL45, :B4 AS COL46, :B3 AS
COL47, CTS.COL48, CTS.COL49, CTS.COL50,
CTS.COL51, CTS.COL52,
CTS.COL53, CTS.COL54,
CTS.COL55, CTS.COL48,
CTS.COL28
FROM DW_USR.CTS1 CTS,
(SELECT COL2, COL3, COL5
FROM (SELECT COL2, COL3,
COL5, ROW_NUMBER () OVER(PARTITION BY COL2, COL5
ORDER BY COL43 DESC, IND_ID) C_RNK
FROM DW_USR.CA1  WHERE COL2 = :B1 ) C
WHERE C_RNK = 1) CA
WHERE CTS.P_ID = :B2 <--partition ID on stage table.
AND CTS.COL2 = :B1 <--Askew partition indicator for final tables.
AND CTS.COL2 = CA.COL2 (+)
AND CTS.COL5 = CA.COL5 (+)
AND CTS.COL72 = 'N' ) S ) X
WHERE X.COL3 IS NOT NULL
AND NOT EXISTS
( SELECT /*+ use_hash(ct) */ 1  ßHint, yeah, who cares??
FROM DW_USR.CT1 CT
WHERE X.COL9 = CT.COL9
AND X.COL4 = CT.COL4
AND X.COL2 = CT.COL2
AND X.COL2 = CT.COL3
AND CT.COL3 = :B1 );

This is where I remind everyone that yes, a hint can be ignored by the CBO.  A hint is simply a recommendation to the database.  If Oracle believes it has more complete information than your hint, it can continue to make its own decision about the path it will take in the database.

  • The data is askew across partitions.
  • The partitioning key is different on the ca table than the other tables.
  • The plan changes were not just in different order, it also involved different index usage, too.

How is this possible?  For the cts, staging table, the actual P_ID or partitioning key is a random number.  There are 1500 of these partitions, mapped out in a table to mark them as used or unused.  The original concept for the design was this staging table was a “parking lot” and any load process could choose an empty space, (partition) and load into it.  This left us open to considerable challenges for the CBO to make a solid decision when the lot could have a smart car one time in it and a semi-truck with trailer in its spot the next run.  I don’t find this a flaw in the CBO, but one in the design that the developer and the DBA group needed to address.

 

PERFORMANCE TANK

Two weeks since change:

  • Very minor performance hits outside of what I consider- “Why we should not insert/update/delete against large partitions” issues.  Can anyone say “REWRITE!!”
  • Stats job starts to run long…longer each day.  Not wanting to complete.
  • SYSTEM and SYSAUX tablespace, multiple additional space requests, (escalated and performed by after hours support, so not first noticed by main DBA staff, multiple environments and tablespace requests nightly, as it is…

 

Due to a performance challenge on a report, I ran a 10046 trace.  A red flag triggers when I start noticing large counts and long runs against certain data dictionary objects-  those involved with histograms and objects stats are clearly apparant:

 

SQL ID: 96g93hntrzjtr Plan Hash: 2239883476     COST: RULE

 

select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt, timestamp#,
sample_size, minimum, maximum, distcnt, lowval, hival, density, col#,
spare1, spare2, avgcln
from
hist_head$ where obj#=:1 and intcol#=:2
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        7      0.00       0.00          0          0          0           0
Execute    209      0.02       7.01          0          0          0           0
Fetch      209      0.00       3.04          6        836          0         209
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      425      0.02      10.06          6        836          0         209

 

SQL ID: db78fxqxwxt7r Plan Hash: 3312420081  COST:  RULE

 

select /*+ rule */ bucket, endpoint, col#, epvalue
from
histgrm$ where obj#=:1 and intcol#=:2 and row#=:3 order by bucket
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        4      0.00       0.00          0          0          0           0
Execute     56      0.01       7.03          0          0          0           0
Fetch       56      0.00       5.21         26        168          0         805
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      116      0.01      12.25         26        168          0         805

 

I knew I was seeing some large waits, but I was collecting stats on system level objects, fixed stats, plus, this was RULE Based Optimizer.  What was the sudden, consistent high fetch and times on different data dictionary calls for the optimizer?

I then noted the allocation of more space to the SYSTEM and SYSAUX tablespaces.  I queried objects from these two tables:

 

 SEGMENT_NAME                             MB
1              C_OBJ#_INTCOL#                           6723
2              I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST           6113
3              WRI$_OPTSTAT_HISTGRM_HISTORY             4697
4              I_WRI$_OPTSTAT_H_ST                      3038
5              WRH$_ACTIVE_SESSION_HISTORY              1910
6              SYS_LOB0000008982C00004$$                1096
7              WRH$_SQL_PLAN                            1088
8              WRI$_OPTSTAT_HISTHEAD_HISTORY            971
9              I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST            935
10             I_H_OBJ#_COL#                            804

 

I then checked a few partitioned tables, noting HOW many histograms were being collected for all the wide tables vs. what would ever be utilized in the simple queries, (remember, the queries here want ALL the data for anything in 2-4 columns…)  We previously would have only have the indexed columns with column stats data, few histogram data.

 

Of the main five, wide tales, I had the following histogram distribution:

OBJECT                 INDEXED COLUMNS                        HISTOGRAM COLUMNS
CA_TBL                      2%, (3)                                                  80%
CT_TBL                      4%, (5)                                                  84%
I_TBL                       2%, (3)                                                  70%
HH                          2% (3)                                                   74%
ILS                         1% (1)                                                   90%

 

The final counts came up and I had 30GB of new stats info *bloating* my SYSTEM and SYSAUX tablespace that I hadn’t had before and that was causing performance issues that many don’t really think of.

The performance waits added by the additional statistics on the database, which you need to also include to all load processes, as they collect statistics at the TIME we load the partition, increased processing time by 18% overall.

Now, with this said, we need to think about how stats are retained in the data dictionary, both for use by the CBO and if we needed to revert.

Would I gain anything in performance by reverting back?

Upon testing I realized:

  • A simple reversion to 10g plans would not solve this issue.
  • A simple change in back to how we collect statistics would not correct the issue, outside of clearing the data dictionary of all the stats post the retention time.

I chose to perform some lower level tests against the stats changes.  I just happen to have a couple copies of the main schema for our source database lying around!  It is utilized to build our marts, but available for testing afterwards.

I performed the following:

  • Change the retention from 31 days to 10:
exec dbms_stats.alter_stats_history_retention(10);
  • Tried to purge the stats from the data dictionary, but after two days of waiting for the delete statement to clear out some 30GB of stats, finally gave up and let it clear manually.
exec DBMS_STATS.PURGE_STATS(SYSDATE-10);
alter table WRI$_OPTSTAT_IND_HISTORY move;
  • After this, needed to rebuild my indexes…

 

Well, that’s a little better…from 30GB down to 12.6GB

 

Choosing the following statement as a test example I could point at a couple partitions, (there were others…):

SELECT I.I_ID, I.FN_COL, I.ROWID, I.ORA_ROWSCN
FROM CA_TBL C, I_TBL I
WHERE C.M_ID = 41891 <--Partitioning Key
AND C.C_NBR = 2000065698902 <--Unique column, part of index
AND I.I_ID = C.I_ID; <--Unique Column part of index

 

I chose one of the largest partitions in the CA_TBL and noted that it had stats collected on 100% of the columns and 800% of those contained histograms.

The execution time was 12.02 seconds.

Ran a 10053 trace file throughout the steps…

 

Clean out ALL STATS:

EXEC DBMS_STATS.DELETE_TABLE_STATS(ownname=>'<OWNER>', tabname=>'CA_TBL', PARTNAME=>'P_41891');

 

Recollected the table stats:

EXEC DBMS_STATS.GATHER_TABLE_STATS(ownname=>’OWNER’, TABname=>’CA_TBL’, PARTNAME=>'P_41891', METHOD_OPT=>'FOR ALL INDEXED COLUMNS', CASCADE=FALSE, DEGREE=8);
EXEC DBMS_STATS.GATHER_INDEX_STATS(ownname=>'DW_PROD', indname=>'CA_ACCT_PK', partname=>'P_41891');

Cleared the shared pool and ran again…

Elapsed: 00:00:00.01

Yes, I traced it, yes, I grabbed a 10053 trace, too.  I wanted to know WHY performance was so much better!

 

It used the SAME explain plan both times:

First RUN:

============
Plan Table
============
----------------------------------------------------------+-----------------------------------+---------------+
| Id  | Operation                            | Name       | Rows  | Bytes | Cost  | Time      | Pstart| Pstop |
----------------------------------------------------------+-----------------------------------+---------------+
| 0   | SELECT STATEMENT                     |            |       |       |  1965 |           |       |       |
| 1   |  NESTED LOOPS                        |            |       |       |       |           |       |       |
| 2   |   NESTED LOOPS                       |            |     1 |    52 |  1965 |  60:21:57 |       |       |
| 3   |    PARTITION LIST SINGLE             |            |     1 |    26 |  1964 |  60:19:06 | KEY   | KEY   |
| 4   |     INDEX RANGE SCAN                 | CA_PK |     1 |    26 |  1964 |  60:19:06 | 2636  | 2636  |
| 5   |    INDEX UNIQUE SCAN                 | I_PK     |     1 |       |     1 |  00:02:51 |       |       |
| 6   |   TABLE ACCESS BY GLOBAL INDEX ROWID | I_TBL |     1 |    26 |     1 |  00:02:51 | ROW LOCATION| ROW LOCATION|
----------------------------------------------------------+-----------------------------------+---------------+
Predicate Information:
----------------------
4 - access("C"."M_ID"=41891)
4 - filter(TO_NUMBER("C"."C_NBR")=2000065698902)
5 - access("I"."IND_ID"="C"."I_ID")

 

============
Plan Table
============
----------------------------------------------------------+-----------------------------------+---------------+
| Id  | Operation                            | Name       | Rows  | Bytes | Cost  | Time      | Pstart| Pstop |
----------------------------------------------------------+-----------------------------------+---------------+
| 0   | SELECT STATEMENT                     |            |       |       |   624 |           |       |       |
| 1   |  NESTED LOOPS                        |            |       |       |       |           |       |       |
| 2   |   NESTED LOOPS                       |            |     1 |    52 |   624 |  19:10:52 |       |       |
| 3   |    PARTITION LIST SINGLE             |            |     1 |    26 |   623 |  19:08:01 | KEY   | KEY   |
| 4   |     INDEX RANGE SCAN                 | CA _PK |     1 |    26 |   623 |  19:08:01 | 2636  | 2636  |
| 5   |    INDEX UNIQUE SCAN                 | I_PK     |     1 |       |     1 |  00:02:51 |       |       |
| 6   |   TABLE ACCESS BY GLOBAL INDEX ROWID | I_TBL |     1 |    26 |     1 |  00:02:51 | ROW LOCATION| ROW LOCATION|
----------------------------------------------------------+-----------------------------------+---------------+
Predicate Information:
----------------------
4 - access("C"."M_ID"=41891)
4 - filter(TO_NUMBER("C"."C_NBR")=2000065698902)
5 - access("I"."I_ID"="C"."I_ID")

 

But you’ll notice the cost has gone down significantly for CA_PK on the CA_TBL.  The time has decreased significantly.  Why?

 

In the 10053 Trace File, the Before and AFTER:

FIRST RUN-

Index Stats::
Index: CA_ PK  Col#: 1 4 2  PARTITION [2635]
LVLS: 2  #LB: 19641  #DK: 16052378  LB/K: 1.00  DB/K: 1.00  CLUF: 11032002.00
LVLS: 2  #LB: 19641  #DK: 16052378  LB/K: 1.00  DB/K: 1.00  CLUF: 11032002.00
Index: CA_ IX1  Col#: 4  PARTITION [2635]
LVLS: 2  #LB: 9776  #DK: 15506817  LB/K: 1.00  DB/K: 1.00  CLUF: 11030574.00
LVLS: 2  #LB: 9776  #DK: 15506817  LB/K: 1.00  DB/K: 1.00  CLUF: 11030574.00
Access path analysis for CA_TBL1

SECOND RUN-

Index Stats::
Index: CA_ PK  Col#: 1 4 2
    USING COMPOSITE STATS
LVLS: 2  #LB: 7467054  #DK: 5267937617  LB/K: 1.00  DB/K: 1.00  CLUF: 4906174903.00
Index: CA_IX1  Col#: 4
USING COMPOSITE STATS
LVLS: 2  #LB: 4006915  #DK: 3749763777  LB/K: 1.00  DB/K: 1.00  CLUF: 4911402731.00
Access path analysis for CA_TBL

 

By using “FOR ALL INDEXED COLUMNS” Composite Stats were built for the index in question and this did result in a better plan for the query used for the test than if there were individual column stats that had been created.

 

The second gain was due to data dictionary clean up that removed waits for the internal SQL Statements:

SQL ID: 96g93hntrzjtr Plan Hash: 2239883476

 

select /*+ rule */ bucket_cnt, row_cnt, cache_cnt, null_cnt, timestamp#,
sample_size, minimum, maximum, distcnt, lowval, hival, density, col#,
spare1, spare2, avgcln
from
hist_head$ where obj#=:1 and intcol#=:2
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        6      0.00       0.00          0          0          0           0
Execute     84      0.00       0.01          0          0          0           0
Fetch       84      0.00       0.04          8        330          0          78
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      174      0.00       0.05          8        330          0          78

 

SQL ID: db78fxqxwxt7r Plan Hash: 3312420081

 

select /*+ rule */ bucket, endpoint, col#, epvalue
from
histgrm$ where obj#=:1 and intcol#=:2 and row#=:3 order by bucket
call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        3      0.00       0.00          0          0          0           0
Execute     36      0.00       0.00          0          0          0           0
Fetch       36      0.00       0.05         11        108          0         623
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total       75      0.00       0.05         11        108          0         623

 

Ahhhh…much better!!

 

Why did I delete the old statistics before collecting with a new method option?

I’ve always been fascinated when looking at DBA_TAB_COLUMNS vs. DBA_TAB_COL_STATISTICS and DBA_PART_HISTOGRAMS.  I’ve often noted the discrepancy between their views when instead of purging and recollecting stats, a different method option is chosen, leaving old histogram data in place and how this can impact the choices for the CBO:

 

  • Columns with “old histogram/column data” appear more attractive than columns with updated statistics when natural growth occurs.
  • Incorrect execution plans confusing the optimizer.
  • Misleading data for the DBA/Developer when viewing statistical info from the stats data in columns views vs. histogram or historical stats data.

 

My First Recommendations

  1. Decrease the retention policy on statistics from 31 days to 7 to purge out the stats from the data dictionary quicker.
  2. Attempt to test on one of the datamarts DBMS_STATS.PURGE_STATS(sysdate-7) and see how long it would take to purge the old stats, (the mart contained the source data dictionary from the RMAN duplicate..)
  3. Rebuild the supporting “OPSTAT” indexes that would now be quite fragmented from the purging process.
  4. Only collect statistics for indexed columns from this point out, documenting the scenario for historical purposes.

 

Upon taking on this task, step #1 was quick.  Step #2, not so much.

DBMS_STATS.PURGE_STATS utilizes a delete statement.  Have you ever tried to run a single delete on constantly accessed, bloated, data dictionary tables, non-parallel, must complete before you it will commit?

 

Two attempts were made to purge stats from the data dictionary, both lasted over two days.  First one was forced to end due to requirements, the second ended during a sudden hiccup on the network, (why DBA’s should nohup or screen EVERYTHING!:))

 

Final Recommendation

The final recommendation, as I am on my final week with the company was to pull back the retention time and let them age out naturally.

I also recommended, due to the partition level stats being collected in the code during the load stage.  The best choice was to delete the stats before recollecting, but do so granularity=>AUTO so as to not collect stats on an already collected partition level objects.

 

Moral

There is always one exception to the story.  The day we say that it should ALWAYS be done a certain way or blindly do something because that is the way it is supposed to be done without using our intellect and skill to verify it is the right choice for our environment, is the day we can make a mistake.

I still believe in the standard practice for how statistics are best collected in Oracle 11g, but I also am aware, I just happen to be working in an environment that has the combination that did not benefit from the common, best choice.


RMOUG 2012 Revisited

As many of you know, I’ve been a bit busy since RMOUG Training Days finding a number of presentation opportunities and while I was at it, a new gig with Enkitec. I am finally sitting down and putting to paper what a great year the RMOUG Training Days conference had for 2012.

As everyone is still reeling from the great keynote from Cary Millsap, (so glad I was wrong about screwing up my passenger pick-up schedule, thinking I’d left our keynote speaker at the airport!!)  His speech was enlightening, enjoyable and worth every minute of a heavy morning commute to attend the initial morning!

First, kudos directed to TeamYCC and John Juenette for all their hard work for heading up the conference. John was this year’s conference director and it is a challenging endeavor ensuring all goes smoothly. There is a ton of moving parts as the conference comes together and if these are not coordinated effectively, the conference will be left less than enjoyable for the presenters and its attendees. John decided to add the challenge of performing his duties from Vermont, where he moved earlier in 2011 due to his own career opportunity, so he’s a real trooper and will be sorely missed on the board of director’s next year.
My next shout-out goes to all the folks in the social media arena that were wonderful, ensuring to participate in tweets, blog posts and messages in regards to presenting and attending the conference. Last year, I was able to count all the “tweeters” on one hand, (also prompting me further to run for the board…) where is this year, there were literally hundreds of posts, tweets and blog comments.
Third, I want to thank all the ACE and ACE Directors, many of who heard my plea to come to RMOUG and present, (they are so patient with me… :) ) during Oracle Open World and either submitted abstracts, attended or did both and marketed the conference for RMOUG. I appreciate the support they give to this great “grass-roots” conference and all that it has to offer.
Finally, I want to thank the great board of directors that I get to be a part of and the user group as a whole. We have an incredibly impressive, versatile and supportive membership that drives the conference to be more than it was before, yet keep what makes this area a great place to live as a technical specialist in our respective arena. The continued hard work of the board, including our wonderful administrative assistant, Heidi Kuhn, deserves a round of applause.
The conference as a whole was a local Goliath with the lineup, alone! It was the first time since 2004 that Jonathan Lewis, Pete Sharman and a few others have presented or even attended. This year we had Maria Colgan, Graham Wood, Riyaj Shamsudeen, James Morle, Marco Gralike, Guy Harrison and a mantra of impressive presenters- more names than I can list. We had a record year for ACE and ACE directors, along with an incredibly high amount of OAK Table members. The content and quality was amazing, as seen at the second day’s lunch when each ACE/ACED was assigned their own table for questions. My coworkers had narrowed in on Jonathan Lewis’ table early on and I enjoyed watching Jonathan keep up with our resident “Tsunami” Developer’s comments.
My two presentations for first day both went well. My first one, on EM12c was quite packed and did well- well enough that it’s been picked up for a number of conferences, including MOW and KSCOPE this year. I thoroughly enjoyed giving my “Sherlock Holmes for DBA’s” and appreciate my bud, Riyaj Shamsudeen offering to be my Dr. Watson if I ever need one, (considering the man’s technical skills, Holmes would prevail every time!!:))
I really enjoyed a number of presentations, including those given by Dominic Delomino, Don Seiler, Pete Sharman, Alex Gorbachev and Marc Fielding. I seemed to have my own presentations scheduled up against Jeff Smith, Gwen Shapira , Jonathan Lewis and even Tim Gorman’s. I had a chance to sit with Gwen Shapira a number of times, along with Marc Fielding and Karl Arao, (my new coworker!!) at many of the presentations I attended.
I ensured that I “stalked” Jean-Pierre Djicks, as often as he has stalked mine in the past. I keep waiting for an email from him, pointing out my frustrated comment regarding system stats, calibrate IO and the chaos that this poorly designed area of database IO information has become, but so far, I’ve been spared.
I finally got to meet Gaja Krishna Vaidyanatha ,serving as his stand-in room ambassador….for about 10 minutes, then his assigned one showed up and I told him he did not need me any longer and explained that I must show up for Kerry Osborne’s presentation, (which I’m sure he now understands the importance of my attendance… :) ) It was still very flattering that instead of “DBA Goth Princess”, he just referred to me as “DBA Goddess”…Yeah I’ll take that any day!
The actual Training Days Conference, post set up, always starts with the Presenters/Volunteer Appreciation banquet at Wynkoop, a local brewery, which I always enjoy. It’s a chance for many of the presenters to unwind after traveling into town and visit with each other, along with the Training Day’s volunteers. My partner was picking up folks at the airport for the conference, so I walked down to the event with a number of other folks from the hotel, including Don Seiler, Jeff Smith and Kris Rice.
The ACE dinner, Wednesday evening was excellent, even if I was knocked half unconscious by a new RA medication, (yes, I practically fell asleep at my first, “official” ACE dinner!!) OTN chose one of the newly recognized, top restaurants in Denver,  Row 14, so dinner was exceptional. Peggy King finally made a few excuses for me after I kept nodding off and I went back to my hotel to sleep it off, (thank you, Peggy!)
The last day was busy and fun- Got to meet and work for a short time with Jeremiah Wilton on his Oracle vs. SQL Server Recovery competition project, met fellow “Yooper”, Jonathan Gennick of Apress and then packed the SUV to go up to the mountains for “FOAK Table” and skiing, (fun and chaos of over 30 people in a house in Breckenridge for the President’s Day Weekend!  :) )
I’ve already started to plan out a few ideas for RMOUG Training Days 2013, (Feb. 11th-13th, I believe are the dates!) as the plans are being formulated for me to try on the Training Day’s Director hat. There are so many great conferences out there, all with their own unique flavor and I hope Training Days can keep the best of what it has to offer and still have a few more surprises that will keep everyone coming back for more!

Kellyn’s Presentation Schedule, Spring/Summer 2012

Kellyn’s Schedule of Presentations, 2012, 2nd and 3rd Quarter
March 24th, 2012, Colorado Springs, CO
SQL Saturday
Oracle for SQL Server DBA’s

April 19th, 2012, Billund, Denmark
MOW 2012
ASH Analytics- Top Activity, the Next Generation

April 20th, 2012, Billund, Denmark
MOW 2012
EM12c: Making Oracle Enterprise Manager Work for You

May 30th, 2012, Hämeenlinna, Finland
OUG Harmony 2012
EM12c: Making Oracle Enterprise Manager Work for You

June 1st, 2012, Riga, Latvia
JUV Harmony 2012
EM12c: Making Oracle Enterprise Manager Work for You

June 26th, 2012, San Antonio, TX.
KSCOPE 2012
EM12c: Making Oracle Enterprise Manager Work for You

11g, Sherlock Holming it with Statistics, Histograms and Bind Peeking

Yes, my dear Watson, Bind Peeking is still an issue in 11g….

We recently upgraded from 10.2.0.4 to 11.2.0.2.0 and come across a couple interesting performance challenges. I do like this type of problem and have been quite busy working on the fixes for each one that has shown itself. This was one of the latest, requiring a solid, positive relationship between the developer and the DBA to solve- The DBA may have the answer, but the developer must be comfortable with the solution and make the code/design change that is required to correct the issue. I do work with a number of such developers, so this was a quick fix in our fast-paced environment…

Oracle’s Cost Based Optimizer makes the best decisions when the design and the code are in accordance with “best practices” as well. I know the word “best practices” is a bit over-used, so we will discuss first what this means.

In the example I’ll be using in my case below, the following is the design practices that should have been applied when the objects were first introduced to production, but were not. I wanted to include the example so that folks could see just how many different ways Oracle could slice and dice the data when deciding what path to take through the database to a completion of a process.
Best practice in this case would be:
1. partitions with similar sizing.
2. No truncated partitions.
3. Single column partitioning keys.
4. Stage tables that are utilized for a process and then promptly emptied after the completion of the process.

Scenario:
Performance challenge on one step in feed process. This process utilizes the following steps:
1. Chooses a “partition ID”, which is the partitioning key on a stage table. There is no logic to the partitioning key, (p_id) simply chosen as part of the steps from a list marked as a truncated partition that is ready to be utilized.
2. Inserts into this partition. Some loads can be quite small, (less than 1M, others can be quite large, 100G+.
3. Merge statement is then performed on stage table to delete from partition any duplicates and other non-loading indicators.
4. This partition is then used to join to the final table to decide what is inserted, updated and deleted from another partition. The final partition has the same vulnerability in design of askew sizing in partition data.
5. The partition in the staging table is then truncated.

First Step by the DBA:
dbms_xplan.display_awr

Twelve different explain plans were found to have been used for the insert statement in question.

Second step by the DBA:
Checked table, partition and column stats.

Select count(column_name) Col_cnt, last_analyzed from dba_tab_columns
 where table_name='CUSTOMER_ACCOUNTS'
 group by Last_analyzed;
COL_CNT LAST_ANALYZED
 27     1/24/2012 3:09:58 AM
 3      2/23/2012 12:41:23 PM

The columns with the newest date in question are the indexed columns, which is good in this environment. The bad is the amount of histograms on columns, we have already researched and found our waits are on the data dictionary and the scheduler in 11g since moving to collecting histograms on tons of columns, on tons of partitions that we do not use in any way for where clauses, etc., but no way to notify the database of this in the largely CTAS type process code base.

So, we now know we do have new stats, histograms were bloated, set to auto on method_opt, but they are still accurate and up to date. The performance issue started before the date we changed over to the method option on the stats..

Question by DBA: How does the database know what and how to build histograms when different logic is used depending on the code, when a partition can be used by any one of the processe? This results in the CBO making poor decisions on column stats.
This is quickly verified when column stats are compared between one partition and the next for large feeds using the same logic last use of the partition.

Unique keys are multi-column, partitioning key is askew on final tables. This key is in where clause, so we do have accurate information outside of the CTAS code/stats histogram issue. With more data involving histograms and partition data askew across the partitions, does this leave us vulnerable to bind peeking?

DBA Test case for bind peeking:
After pinpointing the hash_value for the plan used by the poor performing, large processing version of the performance issue, detail what the values for both bind variables that would have been used.

Replaced the bind variables, one at a time, with the actual values, noted the change in execution plan.
Noted that when the partition was a literal vs. the bind variable, the execution plan changed drastically and contained valid values for the cost and row count for the process.

Although the :B1 bind variable appears to be just as susceptible to the bind peek, it is the partitioning key for the staging table, (CTS1) that is the true culprit on large processing.

DBA recommendation:
Change from inserting into a partition to performing a CTAS for the logic involved, bypassing any deletes or merges, simply creating the table with the data it requires, uniquely named.
Use this in the insert’s subselect to eliminate the bind peek issue.

Summary:

The simple concept behind the “CTS1″ table was that is was a “parking lot”, where a process could simply find an empty parking space,  (partition) and proceed to utilize it.  The problem is that Oracle can’t figure out if it’s just parked a smart car or a semi in the spot.  To eliminate the issue, the parking lot was removed by going to a working table vs. the partitioned stage table and then the database simply had to work with whatever size of “vehicle” it had been issued in the process, (post stats collection, of course!)

DBMS_XPLAN.DISPLAY_AWR Output:
 PLAN_TABLE_OUTPUT
 SQL_ID 7rjk8mr85s2nq
 --------------------
 INSERT INTO DW_USR.CT1 (COL1,COL2,COL3,COL4,COL5,COL6,COL7.....
 COL18,COL19,COL20)
 SELECT * FROM ( SELECT S.COL1, S.COL2, S.COL3, ROW_NUMBER ()
 OVER (PARTITION BY S.COL5, S.COL6,S.COL7, S.COL8
 ORDER BY S.COL12) COL6,S.COL2, S.COL12, S.COL15,
 S.COL19, S.COL5, S.COL15, S.COL22,
 S.COL27, S.LAST_FILE_ID, S.COL28,
 S.COL29, S.COL31, S.COL33,
 S.COL35, S.COL36, S.COL37,
 S.COL38, S.COL39, S.COL40,
 S.COL43, S.COL44, S.F1, S.F2, S.F3,
 S.F4, S.F5, S.F6, S.F7, S.F8, S.F9, S.F10,
 S.COL45, S.COL46, S.COL47,
 S.COL48, S.COL81
 FROM ( SELECT /*+ use_hash(cts ca) */
 CTS.COL5, CA.COL3, CTS.COL6,
 CTS.COl76 AS COL6, CTS.COL2,
 CTS.COL12, CTS.COL15, NULL AS COL19,
 CTS.COL5, CTS.COL15, CTS.COL22,
 CTS.COL27, CTS.COL7 AS LFID,
 CTS.COL28, CTS.COL17, CTS.COL31,
 CTS.COL33, CTS.COL35, CTS.COL36,
 CTS.COL37, CTS.COL38,
 CTS.COL39, CTS.COL40 AS COL40, :B5 AS
 COL43, :B5 AS COL44, CTS.F1, CTS.F2,
 CTS.F3, CTS.F4, CTS.F5, CTS.F6, CTS.F7, CTS.F8,
 CTS.F9, CTS.F10, CTS.COL45, :B4 AS COL46, :B3 AS
 COL47, CTS.COL48, CTS.COL49, CTS.COL50,
 CTS.COL51, CTS.COL52,
 CTS.COL53, CTS.COL54,
 CTS.COL55, CTS.COL48,
 CTS.COL28
 FROM DW_USR.CTS1 CTS,
 (SELECT COL2, COL3, COL5
 FROM (SELECT COL2, COL3,
 COL5, ROW_NUMBER () OVER(PARTITION BY COL2, COL5
 ORDER BY COL43 DESC, IND_ID) C_RNK
 FROM DW_USR.CA1 WHERE COL2 = :B1 ) C
 WHERE C_RNK = 1) CA
 WHERE CTS.P_ID = :B2  AND CTS.COL2 = :B1  AND CTS.COL2 = CA.COL2 (+)
 AND CTS.COL5 = CA.COL5 (+)
 AND CTS.COL72 = 'N' ) S ) X
 WHERE X.COL3 IS NOT NULL
 AND NOT EXISTS
 ( SELECT /*+ use_hash(ct) */ 1
 FROM DW_USR.CT1 CT
 WHERE X.COL9 = CT.COL9
 AND X.COL4 = CT.COL4
 AND X.COL2 = CT.COL2
 AND X.COL2 = CT.COL3
 AND CT.COL3 = :B1 )
Plan hash value: 653243445
-------------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop |
 -------------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | 1659 | | |
 | 1 | HASH JOIN RIGHT ANTI | | 23 | 110K| 1659 | | |
 | 2 | PARTITION LIST SINGLE | | 1 | 52 | 1 | KEY | KEY |
 | 3 | TABLE ACCESS BY LOCAL INDEX ROWID | CT1 | 1 | 52 | 1 | KEY | KEY |
 | 4 | INDEX RANGE SCAN | CT1_IDX | 1 | | 1 | KEY | KEY |
 | 5 | VIEW | | 23 | 109K| 1657 | | |
 | 6 | WINDOW SORT | | 23 | 4232 | 1657 | | |
 | 7 | HASH JOIN | | 23 | 4232 | 1644 | | |
 | 8 | VIEW | | 1 | 56 | 14 | | |
 | 9 | WINDOW SORT PUSHED RANK | | 1 | 52 | 14 | | |
 | 10 | FILTER | | | | | | |
 | 11 | PARTITION LIST SINGLE | | 1 | 52 | 1 | KEY | KEY |
 | 12 | TABLE ACCESS BY LOCAL INDEX ROWID| CA1 | 1 | 52 | 1 | KEY | KEY |
 | 13 | INDEX RANGE SCAN | CA1 _PK | 1 | | 1 | KEY | KEY |
 | 14 | PARTITION RANGE SINGLE | | 11M| 1346M| 1385 | KEY | KEY |
 | 15 | TABLE ACCESS FULL | CTS1 | 11M| 1346M| 1385 | KEY | KEY |
 -------------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
Plan hash value: 1492830811
---------------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | Pstart| Pstop |
 ---------------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 23810 | | |
 | 1 | HASH JOIN RIGHT ANTI | | 23 | 110K| | 23810 | | |
 | 2 | PARTITION LIST SINGLE | | 1 | 52 | | 1 | KEY | KEY |
 | 3 | TABLE ACCESS BY LOCAL INDEX ROWID| CT1 | 1 | 52 | | 1 | KEY | KEY |
 | 4 | INDEX RANGE SCAN | CT1_IDX | 1 | | | 1 | KEY | KEY |
 | 5 | VIEW | | 23 | 109K| | 23808 | | |
 | 6 | WINDOW SORT | | 23 | 4646 | | 23808 | | |
 | 7 | HASH JOIN | | 23 | 4646 | | 23795 | | |
 | 8 | PARTITION RANGE SINGLE | | 1 | 146 | | 20 | KEY | KEY |
 | 9 | TABLE ACCESS FULL | CTS1 | 1 | 146 | | 20 | KEY | KEY |
 | 10 | VIEW | | 14M| 753M| | 23623 | | |
 | 11 | WINDOW SORT PUSHED RANK | | 14M| 457M| 1293M| 23623 | | |
 | 12 | FILTER | | | | | | | |
 | 13 | PARTITION LIST SINGLE | | 14M| 457M| | 2267 | KEY | KEY |
 | 14 | TABLE ACCESS FULL | CA1 | 14M| 457M| | 2267 | KEY | KEY |
 ---------------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
Plan hash value: 1588626705
-------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | Pstart| Pstop |
 -------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 3699K| | |
 | 1 | HASH JOIN RIGHT ANTI | | 62M| 287G| 2977M| 3699K| | |
 | 2 | PARTITION LIST SINGLE | | 70M| 2165M| | 10018 | KEY | KEY |
 | 3 | INDEX FAST FULL SCAN | CTS1_PK | 70M| 2165M| | 10018 | KEY | KEY |
 | 4 | VIEW | | 62M| 285G| | 546K| | |
 | 5 | WINDOW SORT | | 62M| 9461M| 27G| 546K| | |
 | 6 | HASH JOIN | | 62M| 9461M| 2794M| 182K| | |
 | 7 | VIEW | | 43M| 2301M| | 75523 | | |
 | 8 | WINDOW SORT PUSHED RANK| | 43M| 1315M| 3620M| 75523 | | |
 | 9 | FILTER | | | | | | | |
 | 10 | PARTITION LIST SINGLE| | 43M| 1315M| | 13076 | KEY | KEY |
 | 11 | TABLE ACCESS FULL | CA1 | 43M| 1315M| | 13076 | KEY | KEY |
 | 12 | PARTITION RANGE SINGLE | | 62M| 6107M| | 5407 | KEY | KEY |
 | 13 | TABLE ACCESS FULL | CTS1 | 62M| 6107M| | 5407 | KEY | KEY |
 -------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
Plan hash value: 1672751078
------------------------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop |
 ------------------------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 235K(100)| | | |
 | 1 | LOAD TABLE CONVENTIONAL | | | | | | | | |
 | 2 | HASH JOIN ANTI | | 1355 | 6522K| 632M| 235K (7)| 00:03:24 | | |
 | 3 | VIEW | | 135K| 631M| | 134K (10)| 00:01:57 | | |
 | 4 | WINDOW SORT | | 135K| 24M| 26M| 134K (10)| 00:01:57 | | |
 | 5 | HASH JOIN | | 135K| 24M| 18M| 132K (10)| 00:01:55 | | |
 | 6 | PARTITION RANGE SINGLE | | 135K| 16M| | 287 (32)| 00:00:01 | KEY | KEY |
 | 7 | TABLE ACCESS FULL | CTS1 | 135K| 16M| | 287 (32)| 00:00:01 | KEY | KEY |
 | 8 | VIEW | | 11M| 610M| | 90184 (13)| 00:01:19 | | |
 | 9 | WINDOW SORT PUSHED RANK| | 11M| 338M| 480M| 90184 (13)| 00:01:19 | | |
 | 10 | FILTER | | | | | | | | |
 | 11 | PARTITION LIST SINGLE| | 11M| 338M| | 38574 (9)| 00:00:34 | KEY | KEY |
 | 12 | TABLE ACCESS FULL | CA1 | 11M| 338M| | 38574 (9)| 00:00:34 | KEY | KEY |
 | 13 | PARTITION LIST SINGLE | | 20M| 840M| | 6426 (5)| 00:00:06 | KEY | KEY |
 | 14 | INDEX RANGE SCAN | CTS1_PK | 20M| 840M| | 6426 (5)| 00:00:06 | KEY | KEY |
 ------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 1930179405
------------------------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time | Pstart| Pstop |
 ------------------------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 1572K(100)| | | |
 | 1 | LOAD TABLE CONVENTIONAL | | | | | | | | |
 | 2 | HASH JOIN RIGHT ANTI | | 3033K| 13G| 691M| 1572K (2)| 00:22:44 | | |
 | 3 | PARTITION LIST SINGLE | | 17M| 489M| | 4192 (6)| 00:00:04 | KEY | KEY |
 | 4 | INDEX RANGE SCAN | CTS1_PK | 17M| 489M| | 4192 (6)| 00:00:04 | KEY | KEY |
 | 5 | VIEW | | 5152K| 23G| | 246K (9)| 00:03:34 | | |
 | 6 | WINDOW SORT | | 5152K| 835M| 909M| 246K (9)| 00:03:34 | | |
 | 7 | HASH JOIN | | 5152K| 835M| 619M| 155K (11)| 00:02:15 | | |
 | 8 | PARTITION RANGE SINGLE | | 5152K| 560M| | 11305 (31)| 00:00:10 | KEY | KEY |
 | 9 | TABLE ACCESS FULL | CTS1 | 5152K| 560M| | 11305 (31)| 00:00:10 | KEY | KEY |
 | 10 | VIEW | | 11M| 608M| | 69790 (16)| 00:01:01 | | |
 | 11 | WINDOW SORT PUSHED RANK| | 11M| 325M| 478M| 69790 (16)| 00:01:01 | | |
 | 12 | FILTER | | | | | | | | |
 | 13 | PARTITION LIST SINGLE| | 11M| 325M| | 20402 (16)| 00:00:18 | KEY | KEY |
 | 14 | TABLE ACCESS FULL | CA1 | 11M| 325M| | 20402 (16)| 00:00:18 | KEY | KEY |
 ------------------------------------------------------------------------------------------------------------------------------
Plan hash value: 2157924392
--------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | Pstart| Pstop |
 --------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 267K| | |
 | 1 | HASH JOIN RIGHT ANTI | | 4459K| 20G| 152M| 267K| | |
 | 2 | PARTITION LIST SINGLE | | 3204K| 116M| | 564 | KEY | KEY |
 | 3 | TABLE ACCESS FULL | CT1 | 3204K| 116M| | 564 | KEY | KEY |
 | 4 | VIEW | | 4459K| 20G| | 44503 | | |
 | 5 | WINDOW SORT | | 4459K| 723M| 1574M| 44503 | | |
 | 6 | HASH JOIN | | 4459K| 723M| 357M| 16818 | | |
 | 7 | VIEW | | 5516K| 294M| | 8663 | | |
 | 8 | WINDOW SORT PUSHED RANK| | 5516K| 173M| 505M| 8663 | | |
 | 9 | FILTER | | | | | | | |
 | 10 | PARTITION LIST SINGLE| | 5516K| 173M| | 492 | KEY | KEY |
 | 11 | TABLE ACCESS FULL | CA1 | 5516K| 173M| | 492 | KEY | KEY |
 | 12 | PARTITION RANGE SINGLE | | 3052K| 331M| | 329 | KEY | KEY |
 | 13 | TABLE ACCESS FULL | C | 3052K| 331M| | 329 | KEY | KEY |
 --------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
Plan hash value: 2900900913
---------------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | Pstart| Pstop |
 ---------------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 306K| | |
 | 1 | HASH JOIN RIGHT ANTI | | 35M| 164G| | 306K| | |
 | 2 | PARTITION LIST SINGLE | | 1 | 52 | | 1 | KEY | KEY |
 | 3 | TABLE ACCESS BY LOCAL INDEX ROWID| CT1 | 1 | 52 | | 1 | KEY | KEY |
 | 4 | INDEX RANGE SCAN | CT1_IDX | 1 | | | 1 | KEY | KEY |
 | 5 | VIEW | | 35M| 163G| | 278K| | |
 | 6 | WINDOW SORT | | 35M| 6046M| 16G| 278K| | |
 | 7 | HASH JOIN | | 35M| 6046M| 687M| 47011 | | |
 | 8 | VIEW | | 10M| 566M| | 17018 | | |
 | 9 | WINDOW SORT PUSHED RANK | | 10M| 343M| 971M| 17018 | | |
 | 10 | FILTER | | | | | | | |
 | 11 | PARTITION LIST SINGLE | | 10M| 343M| | 988 | KEY | KEY |
 | 12 | TABLE ACCESS FULL | CA1 | 10M| 343M| | 988 | KEY | KEY |
 | 13 | PARTITION RANGE SINGLE | | 14M| 1624M| | 1595 | KEY | KEY |
 | 14 | TABLE ACCESS FULL | CTS1 | 14M| 1624M| | 1595 | KEY | KEY |
 ---------------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
Plan hash value: 2973217172
-------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | Pstart| Pstop |
 -------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 208K| | |
 | 1 | HASH JOIN RIGHT ANTI | | 6346K| 29G| | 208K| | |
 | 2 | PARTITION LIST SINGLE | | 12908 | 630K| | 3 | KEY | KEY |
 | 3 | INDEX RANGE SCAN | CTS1_PK | 12908 | 630K| | 3 | KEY | KEY |
 | 4 | VIEW | | 6346K| 28G| | 85943 | | |
 | 5 | WINDOW SORT | | 6346K| 1373M| 2916M| 85943 | | |
 | 6 | HASH JOIN | | 6346K| 1373M| 533M| 33969 | | |
 | 7 | VIEW | | 8231K| 439M| | 15389 | | |
 | 8 | WINDOW SORT PUSHED RANK| | 8231K| 282M| 754M| 15389 | | |
 | 9 | FILTER | | | | | | | |
 | 10 | PARTITION LIST SINGLE| | 8231K| 282M| | 2423 | KEY | KEY |
 | 11 | TABLE ACCESS FULL | CA1 | 8231K| 282M| | 2423 | KEY | KEY |
 | 12 | PARTITION RANGE SINGLE | | 6346K| 1034M| | 1171 | KEY | KEY |
 | 13 | TABLE ACCESS FULL | CTS1 | 6346K| 1034M| | 1171 | KEY | KEY |
 -------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
****This was the hash value used in our poorest performer!!!!*****
Plan hash value: 3005115193
-------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | Pstart| Pstop |
 -------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 89378 | | |
 | 1 | HASH JOIN RIGHT ANTI | | 287K| 1347M| 912M| 89378 | | |
 | 2 | PARTITION LIST SINGLE | | 22M| 658M| | 2193 | KEY | KEY |
 | 3 | INDEX FAST FULL SCAN | CTS1_PK | 22M| 658M| | 2193 | KEY | KEY |
 | 4 | VIEW | | 287K| 1338M| | 63268 | | |
 | 5 | WINDOW SORT | | 287K| 41M| 92M| 63268 | | |
 | 6 | HASH JOIN | | 287K| 41M| 29M| 61637 | | |
 | 7 | PARTITION RANGE SINGLE | | 287K| 26M| | 25 | KEY | KEY |
 | 8 | TABLE ACCESS FULL | CTS1 | 287K| 26M| | 25 | KEY | KEY |
 | 9 | VIEW | | 27M| 1446M| | 42660 | | |
 | 10 | WINDOW SORT PUSHED RANK| | 27M| 852M| 2482M| 42660 | | |
 | 11 | FILTER | | | | | | | |
 | 12 | PARTITION LIST SINGLE| | 27M| 852M| | 2548 | KEY | KEY |
 | 13 | TABLE ACCESS FULL | CA1 | 27M| 852M| | 2548 | KEY | KEY |
 -------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
Plan hash value: 3149367802
--------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | Pstart| Pstop |
 --------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 87386 | | |
 | 1 | HASH JOIN RIGHT ANTI | | 1260K| 5917M| 210M| 87386 | | |
 | 2 | PARTITION LIST SINGLE | | 4603K| 158M| | 327 | KEY | KEY |
 | 3 | TABLE ACCESS FULL | CT1 | 4603K| 158M| | 327 | KEY | KEY |
 | 4 | VIEW | | 1260K| 5874M| | 22365 | | |
 | 5 | WINDOW SORT | | 1260K| 251M| 539M| 22365 | | |
 | 6 | HASH JOIN | | 1260K| 251M| 198M| 12826 | | |
 | 7 | PARTITION RANGE SINGLE | | 1260K| 183M| | 142 | KEY | KEY |
 | 8 | TABLE ACCESS FULL | CTS1 | 1260K| 183M| | 142 | KEY | KEY |
 | 9 | VIEW | | 4701K| 251M| | 7346 | | |
 | 10 | WINDOW SORT PUSHED RANK| | 4701K| 152M| 430M| 7346 | | |
 | 11 | FILTER | | | | | | | |
 | 12 | PARTITION LIST SINGLE| | 4701K| 152M| | 238 | KEY | KEY |
 | 13 | TABLE ACCESS FULL | CA1 | 4701K| 152M| | 238 | KEY | KEY |
 --------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
Plan hash value: 3517833265
-------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes |TempSpc| Cost | Pstart| Pstop |
 -------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | | 142K| | |
 | 1 | HASH JOIN ANTI | | 37130 | 174M| 173M| 142K| | |
 | 2 | VIEW | | 37130 | 173M| | 130K| | |
 | 3 | WINDOW SORT | | 37130 | 6563K| 13M| 130K| | |
 | 4 | HASH JOIN | | 37130 | 6563K| 4992K| 130K| | |
 | 5 | PARTITION RANGE SINGLE | | 37130 | 4532K| | 5 | KEY | KEY |
 | 6 | TABLE ACCESS FULL | CTS1 | 37130 | 4532K| | 5 | KEY | KEY |
 | 7 | VIEW | | 57M| 3089M| | 90806 | | |
 | 8 | WINDOW SORT PUSHED RANK| | 57M| 1655M| 4859M| 90806 | | |
 | 9 | FILTER | | | | | | | |
 | 10 | PARTITION LIST SINGLE| | 57M| 1655M| | 12448 | KEY | KEY |
 | 11 | TABLE ACCESS FULL | CA1 | 57M| 1655M| | 12448 | KEY | KEY |
 | 12 | PARTITION LIST SINGLE | | 14M| 548M| | 2629 | KEY | KEY |
 | 13 | INDEX FAST FULL SCAN | CTS1_PK | 14M| 548M| | 2629 | KEY | KEY |
 -------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)
Plan hash value: 3518559863
-------------------------------------------------------------------------------------------------------------------
 | Id | Operation | Name | Rows | Bytes | Cost | Pstart| Pstop |
 -------------------------------------------------------------------------------------------------------------------
 | 0 | INSERT STATEMENT | | | | 49 | | |
 | 1 | HASH JOIN ANTI | | 1 | 4924 | 49 | | |
 | 2 | VIEW | | 1 | 4887 | 32 | | |
 | 3 | WINDOW SORT | | 1 | 154 | 32 | | |
 | 4 | HASH JOIN | | 1 | 154 | 19 | | |
 | 5 | VIEW | | 1 | 56 | 14 | | |
 | 6 | WINDOW SORT PUSHED RANK | | 1 | 52 | 14 | | |
 | 7 | FILTER | | | | | | |
 | 8 | PARTITION LIST SINGLE | | 1 | 52 | 1 | KEY | KEY |
 | 9 | TABLE ACCESS BY LOCAL INDEX ROWID| CA1 | 1 | 52 | 1 | KEY | KEY |
 | 10 | INDEX RANGE SCAN | CA1 _PK | 1 | | 1 | KEY | KEY |
 | 11 | PARTITION RANGE SINGLE | | 23150 | 2215K| 4 | KEY | KEY |
 | 12 | TABLE ACCESS FULL | CTS1 | 23150 | 2215K| 4 | KEY | KEY |
 | 13 | PARTITION LIST SINGLE | | 1963K| 69M| 1 | KEY | KEY |
 | 14 | TABLE ACCESS BY LOCAL INDEX ROWID | CT1 | 1963K| 69M| 1 | KEY | KEY |
 | 15 | INDEX RANGE SCAN | CT1_IDX | 1333 | | 1 | KEY | KEY |
 -------------------------------------------------------------------------------------------------------------------
Note
 -----
 - cpu costing is off (consider enabling it)

RMOUG 2012 Presentation Slides!

Graham Wood was kind enough to send me a quick email and let me know that my presentation slides weren’t downloading correctly from RMOUG’s website, so I’ve put them here for anyone that may like to have them.

I’m still recovering from the post RMOUG Training Day festivities, aka Foak Table, which was held up in Breckenridge again this year. I will make sure to blog about Training Days and the post event at a later date, but until then, here is a link to my slides. Please email me with any questions or comments you may have- always glad to chat!

EM12C
Sherlock Holmes for DBA’s

~Kellyn

Getting the Most Out of Enterprise Manager and Notifications

I ran out of time before I was able to provide an adequate white paper this year for my EM12c presentation, but there was some valuable info in what I had started, so thought I’d turn it into a mulit-part blog post…

The Oracle Enterprise Manager, (OEM) is the standard monitoring tool for Enterprise Edition Oracle databases.  The interface allows the DBA to manage the entire Oracle stack using a single console.  The installation and interface is easy for most DBA’s to implement and utilize.  In the newest EM12c version, it encompasses integrated systems management, application management, application-to-disk and cloud management , the following documentation will include some 10g but mostly, the EM12c version of the product.

The goal for any DBA is to be notified of an issue and only notified when there is an actual issue.  One of the most common downfalls of a monitored environment is the misconception that receiving emails upon success or checks stating that a process is running, is correctly configured monitoring.  This produces an environment that leads to a “white noise” effect, where DBA’s may misinterpret a notification as one of the success notifications when a real issue has actually arisen.

The optimal design is one where redundancy checks of the monitoring system is included to ensure that if there is an issue with the monitoring environment that deters it from monitoring and sending alerts, the system has a redundant check on a secondary server that is notifying the DBA on call of the issue.   Multiple Oracle Management Server Repositories , residing on separate servers can address this, but in my opinion, would be overkill when simple additional scripts run from a cron would suffice.

OEM Basics

The Oracle Enterprise Manager, 10g and EM12c comprises of the following, basic components:

  • The Oracle Management Server/Service, (OMS).
  • The OMS repository database.
  • The OMS Home, aka the EM state directory, which contains the bin files, log files, collection files and configuration files.
  • The Agent installation, application and configuration on each monitored host server.

EM12c has the additional weblogic components included automatically, along with the Cloud support features which can be installed.

Licensing

As long as the OMS is on its own server and is only used for the OMS repository and/or an RMAN backup catalog repository, individual oracle licensing IS NOT required for the Oracle database utilized for the repositories, (Please see pg. 15 of the following PDF from Oracle.)

http://download.oracle.com/docs/cd/B19306_01/license.102/b40010.pdf

Monitoring the OEM from a secondary server:

This can be performed easily from a shell script and allows the DBA(s) to rest easy, knowing that the interface to their database environment, if impacted, will notify them from a secondary server.  This allows for redundant checks without sending an “I’m OK” notification to grant comfort:

 

       #!/usr/bin/ksh
       #----------------------------------------------------------------------------
       # Author:   Kellyn Pot’Vin
       # Redundancy Check to OEM Server to ensure EM is up and Running!
       # Verify that all parameters are set in the remote host env. vars...
       #----------------------------------------------------------------------------
       if (( $# != 2 ))
       then
           echo "usage: $0 SID hostname"
           exit 1
      fi
      #
      #----------------------------------------------------------------------------
      # Set up Oracle environment...
      #----------------------------------------------------------------------------
      export ORACLE_SID=$1
      export who_to_ping=$2
      echo "Oracle SID: "${ORACLE_SID
      export AVL_LOG=${LOG_DIR}/oem_avl.log
      export AVL_ERR=${LOG_DIR}/oem_avl.err
      export AVL_PNG_ERR=${LOG_DIR}/ping_avl.err
      #Check Repository DB for Access
      $ORACLE_HOME/bin/sqlplus oem_chk/"${pass}"@${ORACLE_SID} <<EOF
      spool ${AVL_LOG};
      select sum(1+1) from dual@grid_chk;
      spool off;
      exit;
      EOF
      cat ${AVL_LOG} | grep "ORA-" > ${AVL_ERR}
      if [ -s ${AVL_ERR} ]
      then
       echo|mail -s "No Response from Grid Control from Oracle Management Server!" "<EML_Address>"  < ${AVL_LOG}
      fi
#Check to verify that EM12C is up!  This requires SSH authentication from remote server.
ssh oracle/n0c1u3ata11@
"$OMS_HOME/bin/emctl status oms" | grep Down > ${EM_LOG}

if [ -s ${EM_LOG} ]
then
 echo|mail -s "No Response from EM12C Grid Control!" "<EML_ADDRESS>"  < ${EM_LOG}
exit
fi
      #Check Grid Server, ensure that you can ping it as well
      date
      ping -c 3 ${who_to_ping}
      if [ $? -ne 0 ]
      then
          sleep 5
          ping -c 3 ${who_to_ping}
          if [ $? -ne 0 ]
          then
              echo "`hostname` CANNOT PING ${who_to_ping} the EM Server!" > /tmp/ping.$$
       echo|mail -s "`hostname` CANNOT PING ${who_to_ping} from Oracle Managent Server!" "<EML_Address>"
       rm -f /tmp/ping.$$
           fi
      fi
      rm -f ${AVL_LOG}
      rm -f ${AVL_ERR}
exit

 

Pretty simple to schedule in cron:

0,15,30,45 * * * * /home/oracle/scripts/admin/chk_grid.ksh <dbname> <servername> > /dev/null  2>&1

I’ve chosen a 15 minute interval on the checks, but this can be done with any interval as requirements are set.

 

Escalation

Due to Sarbanes-Oxley and/or outside support contracts, an enhanced escalation process may be required.  One that can offer more choices and escalation paths then what is currently offered in the 10g and EM12c console.  A simple package/support object implementation can be created to support this type of requirement that works with OEM.  The code presented here will allow one to set the on-call DBA, scheduler and escalation outside of the OEM interface, but will all OEM alerts and escalation from the OMS will utilize the data found in the supporting tables.

I will try to upload and post the supporting schema and code soon on dbakevlar.com

 

 

Blacking out DB from Agent Side with Shell Scripts:

Blackouts can be performed via a shell script to assist in automated processes that could trigger OEM alerts, sending false notifications when a blackout script is all that is required for Unix Admin or Application support personnel.

#!/usr/local/bin/ksh
# #######################################################
# start_blackout.ksh
# Usage ./start_blackout.ksh <oracle_sid>
# Rewrite Date: 4/22/2011
# Modified by:  reckl
#########################################################
usage="$0 <db_name>"
if (($# != 1))
then
    print $usage
    exit 1
fi
ORACLE_SID=$1
sudo su - oracle -c "$AGENT_HOME/bin/emctl start blackout ${ORACLE_SID}_blackout ${ORACLE_SID}"
exit

Patching

I am a supporter of patch deployments through OEM.  If you have not configured this or are working to get this feature approved in your database environments, I highly recommend it.  In the “Deployments” tab of the EM console, first ensure that the MOS credentials is configured:

Once this has been set up for your environment, you can then designate a patching strategy to deploy to development, test and then production with a full testing cycle that will make any DBA stop quaking in their boots when they receive the notification that new patches have arrived from Oracle Support.

The Deployment Procedure Manager allows the DBA group to schedule deployments of necessary patching with the most effective schedule and little DBA involvement required.

 

The DBA can then set up patching resource allocation and requirements from the “Offline Patching” UI and choose what to install for automatically patching:

To be continued in next post….

 

 

RMOUG 2012!

As busy as I am with the 11g project, (no real weekends off for 9 weekends and counting… :P )  I wanted to take some time out to write on the upcoming RMOUG Training Days 2012.

For those of you Oracle techies, DBA or Developer, this is a must attend and for any who do choose to travel and attend- kudos to you, good choice.    As one of the directors on the RMOUG board, I can attest to the incredible amount of time and resources that have been invested into what is easily, the best grass-roots, Oracle conference around.  John Jeunette, the Training Days Director for the 2012 event has done a bang-up job with planning and none of us could get along without the continued support from those, such as Peggy King and Team YCC.

Oracle folks who do attend are going to be treated to a keynote from one of my favorite DBA Gods, Cary Millsap, along with presentations from some of the greats in the DBA world, including Jonathan Lewis, Debra Lilley, Mark Farnham, John King, Alex Gorbachev, Guy Harrison, Dan Morgan,  Marco Gralike, James Morle and Graham Woods.  We also can’t forget the local favorites, like Tim Gorman and Randy Cunningham.

Upon quick count, I realized we have 14 Oracle ACE’s and 14 ACE Directors speaking this year.  With all these ACE folks, we’ve decided to create a special event with them, something to really find out what it means to be an Oracle ACE.  Stay tuned, it’s shaping up to be an awesome session.

We also have the benefit for those interested in Oracle RAC of having “RAC Attack”, a great workshop, first offered at Oracle Open World and UKOUG, now also offered at RMOUG Training Days for 2012!  This is a great opportunity to get your “RAC on” and learn from some of the best on how to properly build a RAC environment and when.  Pythian and Apress will be sharing in the sponsorship of this great workshop at the RMOUG training days event. Show up with a laptop that meets the requirements for the workshop and build your own, how great is that?

That’s a pretty impressive count for a two day Oracle conference when you think of it!  I’m thrilled with the quality on the content of the presentations this year and how the event is coming together.  We had a record year for abstract submissions and it was a difficult decision deciding who would be in the schedule, so many great, solid abstracts submitted!

So if you are interested in attending, here’s the link to RMOUG’s Training Days Event.  You can view the current schedule, registration and biographies for the speakers.  There’s only a short time left to take advantage of the advance registration rate, saving even more if you become a member, (that’s me as the membership director just selling it a bit! :) )

http://www.teamycc.com/RMOUG_2012_Conference/Registration.html