【SQL監控】SQL徹底監控的腳本

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=       

    今天小麥苗給你們分享了一套SQL監控的腳本,有興趣的朋友能夠拿來玩玩數據庫


 【SQL監控】SQL徹底監控的腳本          


腳本內容以下所示:ide


  
               
              

SET SQLBLANKLINES ON性能


---------------------------------  歷史SQL記錄測試

DROP TABLE XB_SQL_MONITOR_LHR PURGE;優化

CREATE TABLE XB_SQL_MONITOR_LHRspa

(.net

  ID             INTEGER PRIMARY KEY,日誌

  INST_ID        NUMBER,code

  SID            NUMBER,orm

  SERIAL#        NUMBER,

  SPID           NUMBER,

  SQL_ID         VARCHAR2(13),

  SQL_TEXT       VARCHAR2(4000),

  SQL_FULLTEXT   CLOB,

  SQL_EXEC_START DATE, 

  SQL_EXEC_ID    NUMBER,

  COMMAND_TYPE   VARCHAR2(20),

  ELAPSED_TIME   NUMBER,

  ELAPSED_TIME2  VARCHAR2(30),

  STATUS         VARCHAR2(19),

  USERNAME       VARCHAR2(30),

  OS_USER VARCHAR2(30),

  SESSION_TYPES  VARCHAR2(4000), 

  LAST_LOAD_TIME DATE, 

  LAST_ACTIVE_TIME DATE,

  EXECUTIONS     NUMBER  ,

  PX_QCSID       NUMBER,

  CPU_TIME NUMBER,

  FETCHES NUMBER,

  BUFFER_GETS NUMBER,

  DISK_READS NUMBER,

  DIRECT_WRITES NUMBER,

  BINDS_XML CLOB,

  USER_IO_WAIT_TIME NUMBER,

  CONCURRENCY_WAIT_TIME NUMBER,

  PHYSICAL_READ_BYTES NUMBER,

  PHYSICAL_WRITE_BYTES NUMBER, 

  KEY NUMBER,

  PLAN_OBJECT_OWNER VARCHAR2(50),

  PLAN_OBJECT_NAME VARCHAR2(50),

  IN_DATE        DATE

)  NOLOGGING

PARTITION BY RANGE(IN_DATE)

   INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))  

   (PARTITION P201704  VALUES LESS THAN(TO_DATE('201705','YYYYMM')));

                                                              

DROP SEQUENCE S_XB_SQL_MONITOR_LHR;

CREATE SEQUENCE S_XB_SQL_MONITOR_LHR START WITH 1 INCREMENT BY 1 CACHE 1000;

SELECT S_XB_SQL_MONITOR_LHR.NEXTVAL FROM DUAL;

 

CREATE INDEX IND_SQL_MONITOR_SQLID ON   XB_SQL_MONITOR_LHR(SQL_ID) LOCAL NOLOGGING;

CREATE INDEX IND_SQL_MONITOR_SID ON   XB_SQL_MONITOR_LHR(SID,SERIAL#,SPID) LOCAL NOLOGGING;

CREATE INDEX IND_SQL_MONITOR_IN_DATE ON   XB_SQL_MONITOR_LHR(IN_DATE,COMMAND_TYPE,PLAN_OBJECT_NAME) LOCAL NOLOGGING;


                          


COMMENT ON TABLE   XB_SQL_MONITOR_LHR IS '歷史SQL監控';

COMMENT ON COLUMN   XB_SQL_MONITOR_LHR.SQL_EXEC_START IS 'SQL語句開始執行時間'; 

COMMENT ON COLUMN   XB_SQL_MONITOR_LHR.ELAPSED_TIME IS 'SQL語句執行時間(微秒)';

COMMENT ON COLUMN   XB_SQL_MONITOR_LHR.EXECUTIONS IS 'SQL語句執行次數';

                                                     

GRANT SELECT ON  XB_SQL_MONITOR_LHR TO PUBLIC; 



---------------------------------  歷史SQL執行計劃記錄

DROP TABLE XB_SQL_PLAN_MONITOR_LHR PURGE;

CREATE TABLE XB_SQL_PLAN_MONITOR_LHR (

        ID NUMBER PRIMARY KEY, 

INST_ID        NUMBER,

        SQL_MONITOR_ID NUMBER,

        KEY NUMBER, 

        STATUS  VARCHAR2(25),

        SID   NUMBER,

SERIAL# NUMBER,

SPID NUMBER,

        SQL_ID VARCHAR2(25),

        SQL_EXEC_START DATE, 

SQL_EXEC_ID NUMBER, 

SQL_PLAN_HASH_VALUE NUMBER , 

SQL_CHILD_ADDRESS RAW(8), 

CHILD_NUMBER NUMBER,

PLAN_PARENT_ID NUMBER,

PLAN_LINE_ID NUMBER, 

PLAN_OPERATION VARCHAR2(30), 

PLAN_OPTIONS VARCHAR2(30), 

OPTIMIZER VARCHAR2(80),     

OBJECT# NUMBER,

PLAN_OBJECT_OWNER VARCHAR2(30), 

PLAN_OBJECT_NAME VARCHAR2(30), 

PLAN_OBJECT_TYPE VARCHAR2(40), 

OBJECT_ALIAS VARCHAR2(80),

PLAN_DEPTH NUMBER, 

PLAN_POSITION NUMBER, 

PLAN_COST NUMBER, 

PLAN_CARDINALITY NUMBER,

PLAN_BYTES NUMBER, 

PLAN_TIME NUMBER, 

PLAN_PARTITION_START VARCHAR2(255) ,

PLAN_PARTITION_STOP VARCHAR2(255), 

PLAN_CPU_COST NUMBER, 

PLAN_IO_COST NUMBER, 

PLAN_TEMP_SPACE NUMBER, 

STARTS NUMBER,

OUTPUT_ROWS NUMBER, 

IO_INTERCONNECT_BYTES NUMBER,

PHYSICAL_READ_REQUESTS NUMBER,

PHYSICAL_READ_BYTES NUMBER, 

PHYSICAL_WRITE_REQUESTS NUMBER,

PHYSICAL_WRITE_BYTES NUMBER, 

SEARCH_COLUMNS NUMBER,  

        FILTER_PREDICATES VARCHAR2(4000) ,

        ACCESS_PREDICATES VARCHAR2(4000) ,

        PROJECTION VARCHAR2(4000) ,

        OTHER_XML CLOB,

IN_DATE DATE 

)  NOLOGGING

PARTITION BY RANGE(IN_DATE)

    INTERVAL(NUMTOYMINTERVAL(1,'MONTH') ) 

  (PARTITION P201704 VALUES LESS THAN (TO_DATE('201705', 'YYYYMM'))

);


DROP SEQUENCE S_XB_SQL_PLAN_MONITOR_LHR;

CREATE SEQUENCE S_XB_SQL_PLAN_MONITOR_LHR START WITH 1 INCREMENT BY 1 CACHE 1000; 

SELECT S_XB_SQL_PLAN_MONITOR_LHR.NEXTVAL FROM DUAL;

 


CREATE INDEX IND_SQL_MONITOR_ID ON  XB_SQL_PLAN_MONITOR_LHR(SQL_MONITOR_ID)  NOLOGGING;   

CREATE INDEX IND_SQL_PLAN_MONITOR_IN_DATE ON  XB_SQL_PLAN_MONITOR_LHR(IN_DATE) LOCAL NOLOGGING;   

CREATE INDEX IND_SMONITOR_SQLIDSIDKEY ON  XB_SQL_PLAN_MONITOR_LHR(SQL_ID,SID,SERIAL#,SPID,KEY) LOCAL NOLOGGING;






--------監控正在運行的SQL語句

DROP TABLE XB_SQL_MONITOR_PP_LHR; 

-- Create table

CREATE TABLE XB_SQL_MONITOR_PP_LHR

(

  ID                   NUMBER NOT NULL,

  INST_ID              NUMBER,

  SID                  NUMBER,

  SERIAL#              NUMBER,

  SPID                 VARCHAR2(24),

  OSUSER               VARCHAR2(30),

  USERNAME             VARCHAR2(30),

  SQL_TEXT             VARCHAR2(4000),

  SQL_FULLTEXT         CLOB,

  PLAN_OPERATION       VARCHAR2(61),

  STARTS               NUMBER,

  PLAN_PARTITION_START VARCHAR2(128),

  PLAN_PARTITION_STOP  VARCHAR2(128),

  EXECUTIONS           NUMBER,

  SQL_ID               VARCHAR2(13),

  SQL_EXEC_START       DATE,

  LOGON_TIME           DATE,

  LAST_LOAD_TIME       DATE,

  LAST_ACTIVE_TIME     DATE,

  ELAPSED_TIME         VARCHAR2(500),

  ELAPSED_TIME1        NUMBER,

  MONITOR_TYPES        VARCHAR2(500),

  MONITOR_TYPES1       NUMBER,

  MONITOR_VALUE        NUMBER,

  TUNING_RESULT        CLOB,

  TUNING_TIME          DATE,

  SESSION_INFO         VARCHAR2(4000),

  SESSION_STATE        VARCHAR2(30),

  EVENT                VARCHAR2(4000),

  CPU_TIME             NUMBER,

  BUFFER_GETS          NUMBER,

  PHYSICAL_READ_BYTES  NUMBER,

  PHYSICAL_WRITE_BYTES NUMBER,

  USER_IO_WAIT_TIME    NUMBER,

  BLOCKING_INSTANCE    NUMBER,

  BLOCKING_SESSION     NUMBER,

  LAST_CALL_ET         NUMBER,

  ASH_COUNTS           NUMBER,

  IN_DATE              DATE

) NOLOGGING

PARTITION BY RANGE (IN_DATE)  INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))

(

  PARTITION P201704 VALUES LESS THAN (TO_DATE('201705', 'YYYYMM'))

); 


CREATE INDEX IND_SQL_MONITOR_PPID ON XB_SQL_MONITOR_PP_LHR(SQL_ID) LOCAL NOLOGGING;

CREATE INDEX IND_SQL_MONITOR_PP_DATE ON XB_SQL_MONITOR_PP_LHR(IN_DATE) LOCAL NOLOGGING;


DROP SEQUENCE S_XB_SQL_MONITOR_PP_LHR;

CREATE SEQUENCE S_XB_SQL_MONITOR_PP_LHR START WITH 1 INCREMENT BY 1 CACHE 1000;




DROP TABLE XB_SQL_PARAMETERS_LHR;

CREATE TABLE XB_SQL_PARAMETERS_LHR 

( ID NUMBER PRIMARY KEY, 

  CN_NAME     VARCHAR2(100) NOT NULL,

  PARAM_NAME    VARCHAR2(50) NOT NULL,

  PARAM_TYPE    VARCHAR2(50)    ,

  PARAM_VALUE   VARCHAR2(50)    ,

  PARAM_UNIT   VARCHAR2(50)  ,

  COMMENTS      VARCHAR2(500)

) NOLOGGING CACHE ;



INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (1, 'SQL佔用UNDO表空間過大', 'V_UNDOSIZE', 'NUMBER', '52428800', 'BYTES', '單條SQL佔用的UNDO表空間大小');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (2, 'SQL佔用TMP表空間過大', 'V_TMPSIZE', 'NUMBER', '15204352', 'BYTES', '單條SQL佔用的臨時表空間大小');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (3, '執行計劃COST花費過大', 'V_PLAN_COST', 'NUMBER', '114', NULL, 'SQL執行計劃中的COST花費,參照值,無單位');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (4, '執行計劃預估行數過大', 'V_PLAN_CARDINALITY', 'NUMBER', '1426', '行', 'SQL執行計劃中的預估行數');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (5, 'SQL執行時間過大', 'V_ELAPSED_TIME', 'NUMBER', '29', '秒', 'SQL執行時間,單位爲秒,1秒等於1000000微秒');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (6, 'SQL執行次數過大', 'V_EXECUTIONS', 'NUMBER', '7616', '次', 'SQL執行次數');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (7, 'SQL監控時間間隔', 'V_INTERVALTIME', 'NUMBER', '30', '秒', 'SQL監控時間間隔,最小值20秒,最大值120秒,默認30秒,推薦30秒');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (8, '笛卡爾積SQL監控', 'V_MERGEJOIN', NULL, NULL, NULL, 'SQL造成笛卡爾積');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (9, '分區表全分區掃描', 'V_PARTTABLESCAN', NULL, NULL, NULL, '分區表全分區掃描');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (13, 'SQL並行個數過大', 'V_PARALLEL', 'NUMBER', 8, '', 'SQL開並行的最大並行個數');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (14, '系統預估的剩餘執行時間過長', 'V_ESTIMATE_TIME', 'NUMBER', 900, '秒', '系統預估的剩餘執行時間過長');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (15, '邏輯讀過大', 'V_LOGICAL_READS', 'NUMBER', 1510407, '', '邏輯讀過大');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (16, '物理讀過大', 'V_DISK_READS', 'NUMBER', 1510407, '', '物理讀過大');

INSERT INTO XB_SQL_PARAMETERS_LHR (ID, CN_NAME, PARAM_NAME, PARAM_TYPE, PARAM_VALUE, PARAM_UNIT, COMMENTS)

VALUES (17, '等待事件異常', 'V_WAIT_EVENT', '', '', '', '等待事件異常的SQL語句');

COMMIT;

 



--@@PKG_SQL_MONITOR_LHR.PCK

。。。。。。。。。。。。。。。。。。。。。。。。。。


因爲公衆號最多2W字,因此,腳本並無列舉完,所有腳本請參考:

http://blog.itpub.net/26736162/viewspace-1262559/。




該腳本中有視圖也有表。若想直接查詢數據庫耗費性能的語句,能夠直接使用視圖進行查詢。若想查詢歷史記錄,則能夠經過表來查詢。另外,對於監控中使用的參數表爲每次都會從該表中讀取到配置參數的值,該表的查詢結果以下圖所示:下面簡單測試一下上邊的監控腳本的效果。首先構造一個笛卡爾積鏈接的SQL,並開啓並行。再構造一個鎖等待的SQL。以下所示的3條SQL語句:

SELECT /*+ monitor parallel(20)*/

 COUNT(*)

  FROM DBA_OBJECTS A,

       DBA_OBJECTS B,

       DBA_OBJECTS C,

       DBA_OBJECTS D;

UPDATE  /*+ MONITOR */ XB_SQL_MONITOR_LHR T SET T.SQL_TEXT='XXXXXXXXXXXX';

UPDATE  /*+ MONITOR */ XB_SQL_MONITOR_LHR T SET T.SQL_TEXT='XXXXXXXXXXXX';

首先查詢視圖VW_SQL_PP_LHR:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
對於該JOB的性能,因爲做者從多個方面作了優化,因此基本不影響數據庫的運行。下面是該JOB的運行日誌:

SELECT JRD.LOG_ID,

       JRD.JOB_NAME,

       N.JOB_CLASS,

      TO_CHAR(JRD.ACTUAL_START_DATE, 'YYYY-MM-DD HH24:MI:SS') ACTUAL_START_DATE,

       TO_CHAR(JRD.LOG_DATE, 'YYYY-MM-DD HH24:MI:SS') LOG_DATE,

       JRD.STATUS,

       JRD.ERROR#,

       JRD.RUN_DURATION 運行時長,

       JRD.ADDITIONAL_INFO

  FROM DBA_SCHEDULER_JOB_LOG N, DBA_SCHEDULER_JOB_RUN_DETAILS JRD

 WHERE N.LOG_ID = JRD.LOG_ID

   AND N.JOB_NAME LIKE 'JOB_SQL_%'

 ORDER BY JRD.LOG_ID DESC;

JOB運行日誌以下圖所示:
watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=查詢監控表XB_SQL_MONITOR_PP_LHR也可獲取相應的監控信息,這裏再也不演示。

相關文章
相關標籤/搜索