Heim  >  Artikel  >  Datenbank  >  ORACLE fügt über SPM HINT zu SQL-Anweisungen hinzu

ORACLE fügt über SPM HINT zu SQL-Anweisungen hinzu

巴扎黑
巴扎黑Original
2016-11-21 15:25:331265Durchsuche

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;

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn