[20210419]避免冗餘的輸出.txt

lfree發表於2021-04-20

[20210419]避免冗餘的輸出.txt

--//別人的問的問題,如何避免調式最佳化sql語句時大量的輸出資訊,順便總結概括幾種方法。

1.使用set feedback only:
--//12c R2開始sqlplus可以設定set feedback only。
--//更高的版本還可以顯示sql_id.  設定 set feedback only sql_id
--//例子:

SYS@dyhis1> set feedback only sql_id
SYS@dyhis1> select sysdate from dual ;
SYSDATE
-------------------

1 row selected.

SQL_ID: f0wzs9nc663bn

SYS@dyhis1> set head off
SYS@dyhis1> select sysdate from dual ;

1 row selected.

SQL_ID: f0wzs9nc663bn

--//缺點至少12c以上的sqlplus才支援這樣的設定。還有就是看執行計劃時要切換回來,比較麻煩。

2.使用set termout off以及set termout on。
--//這也是我常用的調式方法,例子:
set termout off
set sqlblanklines on
alter session set current_schema=XXX;
alter session set statistics_level=all;
select sysdate from dual ;
set termout on

--//缺點就是必須將sql語句寫在指令碼里面才能正常使用,如果你在sqlplus一個一個執行是無效的。
--//透過例子說明:
SCOTT@book> set termout off
SCOTT@book> select sysdate from dual ;
SYSDATE
-------------------
2021-04-19 16:49:56
--//在sqlplus裡面直接輸入的語句無效。

SCOTT@book> @ dpc '' ''
SCOTT@book> @ dpc '' ''
--//顯示執行計劃沒有輸出。
--//還有就是如果執行指令碼過程中按ctrl+c終端,必須有意識地輸入set termout on開啟,有時候在調式時很讓人疑惑。

3.在不影響執行計劃的情況下修改sql語句。
select * from emp ;
--// 修改如下,主要目的在基本不修改執行計劃的修改語句,減少輸出資訊。
select sum(sal) from emp ;
--//還有就是使用提示MATERIALIZE。

4.編輯指令碼例子如下:
@ 10046on 12
begin
  for r in ( select * from emp ) loop
    null;
  end loop;
end;
/
@ 10046off
--//這樣方法我基本不用,我開始學習oracle時候見過別人這個用過。
begin
  for r in ( &&sql ) loop
    null;
  end loop;
end;
/
--//缺點是語句必須寫在一行。

總結:
--//我現在基本最多的是第2種方法。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2768850/,如需轉載,請註明出處,否則將追究法律責任。

相關文章