Ein SQL, dessen Ausführungsplan durch SPM festgelegt wird, kann über DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE implementiert werden. Sie können diese Funktion auch verwenden, um den Ausführungsplan zu korrigieren, indem Sie HINT zum ursprünglichen SQL hinzufügen, ohne es zu ändern.
DB-VERSION:ORACLE 11.2.0.4
OS:CENTOS 6.6
Zum Beispiel:
Original-SQL-Index:
SELECT * FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
Möchten Sie einen vollständigen Tabellenscan durchführen, indem Sie HINT hinzufügen:
SELECT /* FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=10;
In V$SQL The Die Abfrage zeigt, dass die SQL_ID des ursprünglichen SQL 064qcdmgt6thw ist und die SQL_ID des SQL mit HINT ahdtbgvsd3bht, PLAN_HASH_VALUE=970476072 ist.
Führen Sie Folgendes aus:
DECLARE
CNT NUMBER;
V_SQL CLOB;
BEGIN
--Holen Sie sich den SQL-Text der ursprünglichen Anweisung
SELECT SQL_FULLTEXT INTO V_SQL FROM V$ SQL WHERE SQL_ID = '064qcdmgt6thw' AND ROWNUM=1;
--Verwenden Sie die SQL_ID und den PLAN_HASH_VALUE des SQL mit HINT, um den SQL der ursprünglichen Anweisung zu korrigieren
CNT := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(SQL_ID => ' ahdtbgvsd3bht',
PLAN_HASH_VALUE => 970476072,
Dadurch wird der Ausführungsplan für das Hinzufügen von HINT zum Originalsatz korrigiert. Führen Sie die ursprüngliche Anweisung aus und überprüfen Sie, ob sie in der Spalte PLAN_HASH_VALUE und der Spalte SQL_PLAN_BASELINE von V$SQL behoben ist.
Während des Tests wurde festgestellt, dass für einige SQL-Anweisungen, die Bind-Variablen enthalten, die SQL_ID und der PLAN_HASH_VALUE der Konstanten-SQL nicht korrigiert werden können. Zu diesem Zeitpunkt können Sie versuchen, EXECUTE IMMEDIATE zu verwenden, um SQL-Anweisungen zu generieren, die Bind-Variablen enthalten .
Zum Beispiel:
DECLARE
V_SQL VARCHAR2(3000);
BEGIN
V_SQL := 'SELECT /* FULL(TB_SPM)*/* FROM SCOTT.TB_SPM WHERE OBJECT_ID=: 1';
EXECUTE IMMEDIATE V_SQL
USING 10;
END;
oder
var v number;
exec :v :=10
SELECT /* FULL(TB_SPM) */* FROM SCOTT.TB_SPM WHERE OBJECT_ID=:V;