I forget that Oracle’s AWR only records the top 30 SQL statements in each snapshot by default. I am not sure how long this link will last but here is a 19c manual page describing the default: 19c manual – see the topnsql setting. A lot of my query tuning assumes that the problem query is in the AWR but for very efficient queries on active systems they may mysteriously disappear or be absent from the AWR. It sometimes takes me a while to remember that the snapshots only include a fixed number of SQLs.
I use my sqlstat.sql query to look at a history of a particular sql_id’s executions. Often it shows the query running faster on one plan_hash_value than another. Then I look at why the sql_id changed plans. But what about when the good plan does not show up at all? Several times I have looked at sqlstat.sql output and thought that a query had not run in the past with an efficient query even though it had. It had run so efficiently that it was not on the report, so it looked like the query was a new, slow, SQL statement.
Often I will fix a query’s plan with a SQL Profile and rerun sqlstat.sql on a busy system after manually running dbms_workload_repository.create_snapshot to capture the most recent activity and the problem query with the new plan will not show up. Usually I remember that it is not in the top 30 queries and that is why it is missing but sometimes I forget. Here is a partial sqlstat.sql output showing a long running SQL disappearing after I fixed its plan on Wednesday:
SQL_ID PLAN_HASH_VALUE END_INTERVAL_TIME EXECUTIONS_DELTA Elapsed Ave ms
------------- --------------- --------------------- ---------------- ------------------
acn0557p77na2 3049654342 12-FEB-20 05.00.01 AM 1 16733.256
acn0557p77na2 3049654342 12-FEB-20 06.00.03 AM 2 49694.32
acn0557p77na2 3049654342 12-FEB-20 07.00.53 AM 6 47694.527
acn0557p77na2 3049654342 12-FEB-20 08.00.54 AM 11 50732.0651
acn0557p77na2 3049654342 12-FEB-20 09.00.33 AM 15 53416.5183
acn0557p77na2 3049654342 12-FEB-20 10.00.43 AM 21 86904.4385
acn0557p77na2 3049654342 12-FEB-20 11.00.02 AM 27 84249.859
acn0557p77na2 3049654342 12-FEB-20 12.00.20 PM 27 125287.757
acn0557p77na2 3049654342 12-FEB-20 01.00.36 PM 69 156138.176
Sometimes I query the V$ tables to verify it is currently running a good plan. Here is example output from vsqlarea.sql showing the good plan running today.
LAST_ACTIVE SQL_ID PLAN_HASH_VALUE Avg Elapsed ms
------------------- ------------- --------------- --------------
2020-02-14 16:11:40 acn0557p77na2 867392646 14
This is just a quick note to me as much as anyone else. A query that is missing from an AWR report or my sqlstat.sql report may not have run at all, or it may have run so well that it is not a top 30 query.
Bobby
Nice explanation. Can you upload sqlstat3.sql script.
Thank you for your comment. You made me realize that the post was out of date. I ended up consolidating my sqlstat scripts into one called sqlstat.sql. I updated the post to refer to that script and updated the URL as well.
https://github.com/bobbydurrett/OracleDatabaseTuningSQL/blob/master/awr/sqlstat.sql
Thanks for pointing this out. Good to get it right!
Bobby
p.s. I reviewed my other posts that referred to sqlstat2.sql and sqlstat3.sql and updated them. Thanks again for pointing this out!