In the first post we looked at what XPLORE can do and how it can help identify the impact of CBO fixes/parameters but there was no reference to how the tool actually works so let’s try to fix that.
After installing XPLORE using sqlt/utl/xplore/install.sql we need to create our driver script using create_xplore_script.sql, at this point we are already connected as the target user (the installation connects us).
If we need a specific CBO environment now it’s the time to set all the parameters we need, right before starting create_xplore_script.sql.
Let’s keep it simple and assume the default configuration is enough (this holds true most of the times anyway).
Installation completed. You are now connected as mpagano. 1. Set CBO env if needed 2. Execute @create_xplore_script.sql SQL> @create_xplore_script.sql Parameter 1: XPLORE Method: XECUTE (default) or XPLAIN "XECUTE" requires /* ^^unique_id */ token in SQL "XPLAIN" uses "EXPLAIN PLAN FOR" command Remember EXPLAIN PLAN FOR does not perform bind peeking Enter "XPLORE Method" [XECUTE]: Parameter 2: Include CBO Parameters: Y (default) or N Enter "CBO Parameters" [Y]: Parameter 3: Include Exadata Parameters: Y (default) or N Enter "EXADATA Parameters" [Y]: Parameter 4: Include Fix Control: Y (default) or N Enter "Fix Control" [Y]: Parameter 5: Generate SQL Monitor Reports: N (default) or Y Only applicable when XPLORE Method is XECUTE Enter "SQL Monitor" [N]: Review and execute @xplore_script_1.sql
Depending on the values we select at this stage then XPLORE will either execute (XECUTE) or gather an EXPLAIN PLAN FOR (XPLAIN) our SQL, for all the CBO and Exadata parameters and Fix Controls, collecting SQL Monitor reports.
The create script first captures the current CBO environment to use it as baseline and then creates the instructions for each test that will be executed.
Each test looks like
CONN ^^connected_user./^^user_password.^^connect_identifier. EXEC xplore.set_baseline(1); ALTER SESSION SET "_fix_control" = '8274946:0'; ALTER SESSION SET STATISTICS_LEVEL = ALL; DEF unique_id = "xplore_{001}_[^^run_id.]_(00753)" @^^script_with_sql. WHENEVER SQLERROR CONTINUE; ALTER SESSION SET "_fix_control" = '8274946:1'; EXEC xplore.snapshot_plan('xplore_{001}_[^^run_id.]_(00753)', 'XECUTE', 'N');
The first instruction reconnects to make sure we “start fresh” each time.
Then we set the CBO environment to our baseline and set statistics_level =’ALL’ to capture execution statistics.
At this point we can make the change we want to test, in the example above is to turn off the fix for bug 8274946.
Next step is to run our SQL (the unique identifier makes the SQL parsed and helps in identifying the cursor) and once the execution completes then XPLORE captures statistics about the current test from V$SQL, V$SQL_PLAN and V$SQL_PLAN_STATISTICS_ALL storing them into the XPLORE repository tables (tables stored in the target user schema).
In summary SQLT XPLORE iterates over each single CBO/Exadata parameters/Fix Control, changes its value (for some parameters we have several values to test) and capture statistics for the plan generated with such change in place.
After all the tests have been performed XPLORE generates a HTML report with several aggregations starting with a very aggregated overview of the results to then drill little by little up to the final plan with execution statistics for each single test