Again the same story : Oracle provides a useful view to check enqueue statistics (v$enqueue_statistics), but this view is a cumulative one. So how to check what’s is going on my database right now with cumulative values ?
You have to substract values as it has been done into Riyaj Shamsudeen’s post.
So to get real-time enqueue statistics, you can use the enqueue_statistics.pl script (click on the link and then on the view source button to copy/paste the source code) that basically takes a snapshot based on the gv$enqueue_statistics view each second (default interval) and computes the differences with the previous snapshot.
Let’s see an example:
./enqueue_statistics.pl 20:01:10 INST_NAME EQ_NAME EQ_TYPE REQ_REASON TOTAL_REQ 20:01:10 BDT_1 Job Queue Date JD contention 1 20:01:10 BDT_1 Job Queue JQ contention 2 20:01:10 BDT_1 Job Scheduler JS q mem clnup lck 2 20:01:10 BDT_1 Session Migration SE contention 4 20:01:10 BDT_1 Job Scheduler JS contention 15 20:01:10 BDT_1 Job Scheduler JS queue lock 15 20:01:10 BDT_1 Media Recovery MR contention 28 20:01:10 BDT_1 Cursor CU contention 107 20:01:10 BDT_1 Transaction TX contention 122 20:01:10 BDT_1 DML TM contention 166 --------------------------------------> NEW 20:01:11 INST_NAME EQ_NAME EQ_TYPE REQ_REASON TOTAL_REQ 20:01:11 BDT_1 Job Queue Date JD contention 1 20:01:11 BDT_1 Job Queue JQ contention 1 20:01:11 BDT_1 Job Scheduler JS q mem clnup lck 1 20:01:11 BDT_1 Session Migration SE contention 2 20:01:11 BDT_1 Job Scheduler JS contention 12 20:01:11 BDT_1 Job Scheduler JS queue lock 17 20:01:11 BDT_1 Media Recovery MR contention 20 20:01:11 BDT_1 Cursor CU contention 100 20:01:11 BDT_1 Transaction TX contention 134 20:01:11 BDT_1 DML TM contention 185
As you can see during the last second the DML enqueue has been requested 185 times.
For lisiblity, I removed some columns into the output that are displayed by the script: TOTAL_WAIT,SUCC_REQ,FAILED_REQ,WAIT_TIME
Output is ordered based on the TOTAL_REQ column but you could choose to order on any column.
Let’s see the help:
./enqueue_statistics.pl help Usage: enqueue_statistics.pl [Interval [Count]] [inst=] [top=] [eq_name=] [eq_type=] [req_reason=] [sort_field=] Default Interval : 1 second. Default Count : Unlimited Parameter Comment Default --------- ------- ------- INST= ALL - Show all Instance(s) ALL CURRENT - Show Current Instance INSTANCE_NAME,... - choose Instance(s) to display << Instances are only displayed in a RAC DB >> TOP= Number of rows to display ALL EQ_NAME= ALL - Show all ENQ NAME (wildcard allowed) ALL EQ_TYPE= ALL - Show all ENQ TYPE (wildcard allowed) ALL REQ_REASON= ALL - Show all REASONS (wildcard allowed) ALL SORT_FIELD= TOTAL_REQ|TOTAL_WAIT|SUCC_REQ|FAILED_REQ|WAIT_TIME TOTAL_REQ Example : enqueue_statistics.pl Example : enqueue_statistics.pl sort_field=WAIT_TIME Example : enqueue_statistics.pl eq_name='%sactio%' sort_field=WAIT_TIME Example : enqueue_statistics.pl req_reason='contention'
As usual:
- You can choose the number of snapshots to display and the time to wait between snapshots.
- You can choose to filter on enqueue name, enqueue type and enqueue reason (by default no filter is applied).
- You can choose the column to sort the output on (new).
- This script is oracle RAC aware : you can work on all the instances, a subset or the local one.
- You have to set oraenv on one instance of the database you want to diagnose first.
- The script has been tested on Linux, Unix and Windows.
Remark:
I’ll provide a few more real-time utility scripts (see this page for the existing ones) and after that I’ll put all those scripts together into a single “real-time” utility script.