SQL Tuning Sets sind seid jeher ein wichtiges Mittel in der Datenbank um SQL Workloads in der Datenbank zu speichern. Sie geben schnell Aufschluss über das verwendete SQL und bieten eine gute Grundlage zum Tuning oder für Advisors.
1. Rund um SQL Tuning Sets
Ulrike Schwinn (email: ulrike.schwinn@oracle.com)
Oracle Business Unit Database
ORACLE Deutschland B.V. & Co. KG
2. Motivation
• Sie wollen ...
• Mehr über einen Workload erfahren ...
• Ausführungspläne aus einem Workload erhalten ...
• SQL Plan Baselines nutzen bzw. erzeugen ...
• Advisors wie SQL Tuning oder SQL Access verwenden ...
• SQL Performance Analyzer verwenden ...
3. • Datenbankobjekte, die
• SQL Text
• Execution Kontext (Parsing User, Bind Werte, …)
• Execution Statistiken (Buffer Gets, CPU, #Executions, …)
• Plan
• Plan Statistiken usw.
beinhalten.
• Persistente Speicherung im SYSAUX Tablespace
• Größe abhängig von SQL Text, Unterschiede, Binds etc...
• Geringer Performance Overhead
Was sind SQL Tuning Sets?
8. Grundlegendes zu STS
• Seit Oracle 10g automatisch ohne Installation
verfügbar
• Integriert in Enterprise Manager und im Package
DBMS_SQLTUNE
• Vor. : Privileg ADMINISTER SQL TUNING SET
• Lizenzierung über Tuning Pack
• Ausnahme: enthalten in Lizenz von Real Application Testing
• Parameter: control_management_pack_access
9. Administration mit DBMS_SQLTUNE
Select
Load
Create
Update/Delete
Drop
• Erzeugen eines neuen leeren STS
• Voraussetzung vor dem Laden
• create_sqlset(sqlset_name, desc,…
• Ändern innerhalb eines STS
• update_sqlset(sqlset_name, sql_id,…
• Löschen von Statements eines STS
• delete_sqlset(sqlset_name, filter …
• Löschen des gesamten Sets
• drop_sqlset(sqlset_name)
execute dbms_sqltune.create_sqlset ('STS1')
10. STS können …
aus dem Cursor Cache (auch über bestimmten Zeitraum)
aus AWR Snapshots
aus SQL
als Untermenge eines existierenden STS
während des Captures bzw. während des Replays
aus 10046 Trace Dateien
erzeugt werden.
Schnittstellen
EM
Package DBMS_SQLTUNE
Wie werden SQL Tuning Sets befüllt?
11. Erste Beispiele
• Aus dem Cursor Cache mit mehr als 500 Buffer
Gets
• Aus dem Cursor Cache über eindeutige SQL_ID
SELECT sql_id, sql_text FROM
table(dbms_sqltune.select_cursor_cache('buffer_gets >
500')) ORDER BY sql_id;
SELECT sql_id, plan_hash_value FROM
table(dbms_sqltune.select_cursor_cache('sql_id =
''gmnd4yt3c4zyw'''))
ORDER BY sql_id, plan_hash_value;
12. Mit PL/SQL laden ...
• Aus dem Cursor Cache mit SQL_ID laden
• Aus dem Cursor Cache über eine bestimmte Zeit
DECLARE
cur sys_refcursor;
BEGIN
open cur for
select value(p) from table(dbms_sqltune.select_cursor_cache
('sql_id = ''gwj1f651t001a''')) p;
dbms_sqltune.load_sqlset(sqlset_name => 'STS_ID',
populate_cursor => cur);
close cur;
END;
execute dbms_sqltune.capture_cursor_cache_sqlset
(sqlset_name => 'STS_CAPTURE',
time_limit => 3600,
repeat_interval => 600,
basic_filter => 'sql_text like ''%emp%'' and buffer_gets> 1000')
15. ... aus Snapshots
• Aus Snapshots mit Filter auf SYS
DECLARE
cur sys_refcursor;
BEGIN
open cur for
select value(p) from table(
dbms_sqltune.select_workload_repository
(begin_snap => 20184,
end_snap => 20185,
basic_filter => 'parsing_schema_name <> ''SYS''')) p;
dbms_sqltune.load_sqlset('STS_SNAP', cur);
close cur;
END;
/
16. ... aus SQL Traces
• Erzeuge 10046 Trace
• Erzeuge logisches Directory TRACE_DIR
• Lade SQL in STS
DECLARE
cur sys_refcursor;
BEGIN
open cur for
select value(p) from table(dbms_sqltune.select_sql_trace
(directory => 'TRACE_DIR',
file_name => '%.trc')) p;
dbms_sqltune.load_sqlset('STS_TRACE', cur);
close cur;
END;
/
17. ... aus SQL Traces in andere DB
• Zusätzliche Mapping Tabelle erzeugen
• Mapping Tabelle und Trace Datei wird auf Ziel DB
kopieren
• Laden mit
CREATE TABLE mapping AS
SELECT object_id id, owner, substr(object_name, 1, 30) name
FROM dba_objects
UNION ALL
SELECT user_id id, username owner, null name
FROM dba_users;
… dbms_sqltune.select_sql_trace(directory=>'TRACE_DIR',
file_name => '%.trc',
mapping_table_name => 'MAPPING',
mapping_table_owner => 'HR'))…
18. Wenn STS zu groß sind ...
• oder dbms_sqltune.select_sqlset
20. Transportieren mit Export/Import
1. Kopiere STS vom SYS Schema in Staging Tabelle (“pack”)
2. Transportiere Staging Tabelle zum Testsystem (Data Pump,
db link, etc.)
3. Kopiere STS aus der Staging Tabelle ins SYS Schema
(“unpack”)
“Pack”
SYSAUX
ADV
AWR
STS
STGTAB STGTAB SYSAUX
STS
AWR
ADV
“Unpack”Transport
24. • Vorhersehbare und
garantierte Planentwicklung
• Identifizierung sich wiederholender Statements
=> Statement Log
• Speicherung der SQL Pläne => SQL Plan History
• Speicherung der verifizierten/akzeptierten SQL Pläne =>
SQL Plan Baseline
• Falls Veränderung und somit neuer Plan eintritt
=> Nutzung der SQL Plan Baseline und Speicherung des
neuen Ausführungsplans in SQL Plan History (zur Verifikation)
• Setup über
• OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES=TRUE/FALSE
• OPTIMIZER_USE_SQL_PLAN_BASELINES=TRUE/FALSE
Szenario 2: SQL Plan Management
Plan history
HJ
HJ
GB
Plan baseline
Statement log
25. Upgrade von 10gR2 oder 11g
Test Umgebung mit STS
STS sind getuned
Transport des STS auf
Produktion mit Export/Import
Generierung von
SQL Plan Baselines aus STS
mit
dbms_spm.load_plans_from_sqlset
Auch möglich:
direkter Export/Import
von SQL Plan Baselines
Szenario 2: SQL Plan Baselines
Plan History
HJ
GB
HJ
Upgrade bzw. ge-tunte Umgebung
Production Database
keine Plan
Regression
HJ
GB
HJ
HJ
GB
HJ
Development/Test Database
Ge-tuned
HJ
GB
HJ
Staging Tabelle
DBA
Plan History
26. Generierung von SQL Plan Baselines mit Filterkriterien
• Überprüfung mit DBA_SQL_PLAN_BASELINES
Szenario 2: SQL Plan Baselines
variable pls number;
execute pls := dbms_spm.load_plans_from_sqlset(
sqlset_name => 'STS_WORKLOAD1',
basic_filter => 'sql_text like ''%select%''');
PLAN_NAME ACC ENA FIX
------------------------------ --- --- ---
SQL_TEXT
-----------------------------------------------------------
SQL_PLAN_axcu6w1bk1nyue451c073 YES YES NO
select /*+ use_nl(c) ordered parallel*/ count(*)
from sh.sales s,sh.customers c
27. • SQL Advisor sind Advisor die bei Tuning von SQL
Statements helfen
• 2 Arten: SQL Tuning und SQL Access Advisor
• Nutzbar über Enterprise Manager, teilweise
SQL*Developer und Packages DBMS_SQLTUNE/
DBMS_ADVISOR
• SQL Tuning Sets sind Voraussetzung bei der manuellen
Nutzung der beiden Advisors
• Voraussetzung: Tuning Pack
Szenario 3: SQL Advisor
28. • SQL Tuning Advisor
• Manuell bzw. auch automatisch in Automated MaintenanceTasks
• Aufgaben: Überprüfung von Statistiken,
Zugriffsstrukturen, SQL und Profiles
• Ergebnis/Findings:
• Erneuerung von Statistiken
• Restrukturierung von SQL
• SQL Profiles
• Alternative Pläne
• SQL Access Advisor
• Ermittelt geeignete Zugriffs (Access)- Strukturen wie B*/Bitmap,
Function Based Index, Materialized Views, Logs und Partitionen
• Resultat/Empfehlung: DDL-Skript zum Ausführen (CREATE, DROP,
DBMS_STATS...)
Szenario 3: SQL Advisor Funktionsweise
31. Szenario 3: Ergebnis SQL Access
Rem SQL Access Advisor: Version 11.2.0.3.0 - Production
Rem
Rem Username: SYS
Rem Task: TASK_34528
Rem Execution date:
Rem
CREATE MATERIALIZED VIEW LOG ON
"US"."COMP"
WITH ROWID, SEQUENCE("ORT","JAHR")
INCLUDING NEW VALUES;
CREATE MATERIALIZED VIEW "SYS"."MV$$_86E00000"
REFRESH FAST WITH ROWID
ENABLE QUERY REWRITE
AS SELECT US.COMP.ORT C1, MAX("US"."COMP"."JAHR") M1, COUNT(*) M2 FROM US.CO
MP GROUP
BY US.COMP.ORT;
begin
dbms_stats.gather_table_stats('"SYS"','"MV$$_86E00000"',NULL,dbms_stats.auto_s
ample_size);
end;
37. STS Teilmenge bestehend aus „regressed“ Statements
• Laden als SQL Plan Baselines aus STS (siehe Szenario 2)
Szenario 5: SQL Plan Baselines und SPA
execute dbms_sqltune.create_sqlset (sqlset_name => 'SUB_STS1',
description => 'Regressed Statements');
declare
sqlset_cur dbms_sqltune.sqlset_cursor;
begin
open sqlset_cur for
select value(p) from table(dbms_sqltune.select_sqlpa_task
(task_name => 'TASK_21137',
execution_name => 'Vergleich1',
level_filter => 'REGRESSED')) p;
dbms_sqltune.load_sqlset('SUB_STS1', sqlset_cur);
close sqlset_cur;
end;
/
38. Selektive Auswahl von Statements über unterschiedliche
Methoden ( Cache, Snapshots, SQL-Ids, Trace etc.)
Persistente Speicherung in der Datenbank
Kann auf andere DBs übertragen werden
Voraussetzung für unterschiedliche Tuning Tasks z.B. für
SQL Tuning Advisor oder SQL Access Advisor
Vereinfacht das Tuning von SQL Statements =>
Generierung von SQL Plan Baselines
Vorteile
39. • Handbücher
• Performance Guide
• Package Reference Guide
• Deutsche Datenbank Community
• Aktuelle Informationen
• blogs.oracle.com/dbacommunity_deutsch
• SQL Tuning Sets im Einsatz Teil 1 und Teil 2
Informationen