關于秘密不一樣的解讀:
秘密之所以是秘密是因為它不可告人,于我把它寫下來了…
一、數據準備:
-- 解鎖scott用戶
alter user scott account unlock;
alter user scott identified by tiger;
-- 創建臨時表EMPLOYEE_TMP :
create table EMPLOYEE_TMP as select * from EMPLOYEE;
-- 查看數據量:
09:03:03 SQL> select count(*) from EMPLOYEE_TMP;
COUNT(*)
----------
10000
Elapsed: 00:00:03.11
二、查看當前會話執行的慢SQ語句:
col SQL_FULLTEXT for a50
col 平均執行時間 for a10
col 總執行時間 for a10
col SQL_ID for a15
COL OSUSER FOR A10
col USERNAME for a10
select
to_char(sa.last_active_time,'hh24:mi:ss') time,
se.osuser,
se.username,
se.sql_id,
sa.sql_fulltext,
sa.executions "執行次數",
round(sa.ELAPSED_TIME / 1000000, 2) || 's' "總執行時間",
round(sa.ELAPSED_TIME / 1000000 / sa.executions, 2) || 's' "平均執行時間"
from (select s.osuser, s.username, s.sql_id
from v$session s
where s.username in ('SCOTT') -- 用戶名
and s.sql_id is not null
group by s.osuser, s.username, s.sql_id) se
left join v$sqlarea sa
on se.sql_id = sa.sql_id
where sa.executions > 0
and round(sa.ELAPSED_TIME / 1000000 / sa.executions, 2) > 0 -- 平均執行時間大于0
and sa.last_active_time > trunc(sysdate); -- 查詢當天的數據
TIME OSUSER USERNAME SQL_ID SQL_FULLTEXT 執行次數 總執行時間 平均執行時
-------- ---------- ---------- --------------- -------------------------------------------------- ---------- ---------- ----------
09:03:27 oracle SCOTT 6rmnz1gbfhd3j select count(*) from EMPLOYEE_TMP 1 3.1s 3.1s
三、開始測試:
-- session 1:執行:11次執行
09:11:08 SQL> insert into EMPLOYEE_TMP select * from EMPLOYEE_TMP;
10000 rows created.
Elapsed: 00:00:00.04
09:11:32 SQL> /
20000 rows created.
Elapsed: 00:00:00.01
09:11:44 SQL> /
40000 rows created.
Elapsed: 00:00:00.03
09:11:45 SQL> /
80000 rows created.
Elapsed: 00:00:00.05
09:11:45 SQL> /
160000 rows created.
Elapsed: 00:00:00.09
09:11:46 SQL> /
320000 rows created.
Elapsed: 00:00:00.19
09:11:47 SQL> /
640000 rows created.
Elapsed: 00:00:00.31
09:11:47 SQL> /
1280000 rows created.
Elapsed: 00:00:00.64
09:11:49 SQL> /
2560000 rows created.
Elapsed: 00:00:01.06
09:11:50 SQL> /
5120000 rows created.
Elapsed: 00:00:06.57
09:11:58 SQL> /
10240000 rows created.
Elapsed: 00:00:12.63
– session2:
通過慢SQL語句查詢到:sql_id:687546kf2qazt 執行11次,總時間:21.62s,平均:1.96s

– session1:
執行一次查詢:執行時間:00:00:00.45
09:12:20 SQL> select count(*) from EMPLOYEE_TMP;
COUNT(*)
----------
20480000
Elapsed: 00:00:00.45
09:16:18 SQL>
– session2:
SQL_ID:6rmnz1gbfhd3j 執行一次,總時間0.45s,與session1的執行時間一致

– session1:
再次執行一次,未執行結束:insert into EMPLOYEE_TMP select * from EMPLOYEE_TMP;

– session2:
查詢結果:執行次數還是11次,但TIME與總執行時間一直在更新

直到session1 執行結束后,執行次數才會+1

四、編寫監控腳本:
– 根據上面的實驗結果編寫慢SQL監控腳本思路:
1、以平均時間為條件,大于1s(自己決定)的進行報警。
(因為是平均值,針對于執行次數過多的會延時報警,存在一定的誤差)。
2、SQL 未執行結束,平均時間也一直在更新。
3、在v$session視圖取的SQL_ID,監控會話正在執行的SQL。
4、username in (‘SCOTT’) 指定用戶名,避免出現系統SQL。
5、監控腳本輸出格式:慢SQL:條數|閥值
示例:SlowSQLNums:3|1s
解釋:超過1s的慢SQL有3條
6、打印詳細的慢SQL到日志中,方便查詢。
腳本截圖:

執行結果:
-- 腳本輸出:
-- 當前會話有1條慢SQL
[oracle@db~]$ sh Check_SlowSQL.sh
Error|SlowSQLNums:1|0s
-- 當前會話沒有慢SQL
[oracle@db~]$ sh Check_SlowSQL.sh
ok
-- 臨時輸出文件
[oracle@db~]$ cat SlowSQL.tmp
TIME:09:20:30|OSUSER:oracle|USERNAME:SCOTT|SQL_ID:687546kf2qazt|AVERAGE_ELAPSED_TIME:3.45|SQLText:insert into EMPLOYEE_TMP select * from EMPLOYEE_TMP
TIME:11:18:27|OSUSER:oracle|USERNAME:SCOTT|SQL_ID:6rmnz1gbfhd3j|AVERAGE_ELAPSED_TIME:1.81|SQLText:select count(*) from EMPLOYEE_TMP
-- 歷史慢SQL輸出文件
[oracle@db~]$ cat SlowSQL.his
TIME:09:20:30|OSUSER:oracle|USERNAME:SCOTT|SQL_ID:687546kf2qazt|AVERAGE_ELAPSED_TIME:3.45|SQLText:insert into EMPLOYEE_TMP select * from EMPLOYEE_TMP
TIME:09:20:30|OSUSER:oracle|USERNAME:SCOTT|SQL_ID:687546kf2qazt|AVERAGE_ELAPSED_TIME:3.45|SQLText:insert into EMPLOYEE_TMP select * from EMPLOYEE_TMP
TIME:09:20:30|OSUSER:oracle|USERNAME:SCOTT|SQL_ID:687546kf2qazt|AVERAGE_ELAPSED_TIME:3.45|SQLText:insert into EMPLOYEE_TMP select * from EMPLOYEE_TMP
TIME:11:18:27|OSUSER:oracle|USERNAME:SCOTT|SQL_ID:6rmnz1gbfhd3j|AVERAGE_ELAPSED_TIME:1.81|SQLText:select count(*) from EMPLOYEE_TMP
TIME:09:20:30|OSUSER:oracle|USERNAME:SCOTT|SQL_ID:687546kf2qazt|AVERAGE_ELAPSED_TIME:3.45|SQLText:insert into EMPLOYEE_TMP select * from EMPLOYEE_TMP
TIME:11:18:27|OSUSER:oracle|USERNAME:SCOTT|SQL_ID:6rmnz1gbfhd3j|AVERAGE_ELAPSED_TIME:1.81|SQLText:select count(*) from EMPLOYEE_TMP
?????????????????????????文章推薦
| PostgreSQL | URL |
|---|---|
| 《課程筆記:PostgreSQL深入淺出》之 初識PostgreSQL(一) | http://www.sunline.cc/db/475817 |
| 《課程筆記:PostgreSQL深入淺出》之 PostgreSQL源碼安裝(二) | http://www.sunline.cc/db/475933 |
| 《課程筆記:PostgreSQL深入淺出》之初始化PostgreSQL(三) | http://www.sunline.cc/db/479524 |
| 《課程筆記:PostgreSQL深入淺出》之PSQL管理工具-常用(四) | http://www.sunline.cc/db/479560 |
| 《課程筆記:PostgreSQL深入淺出》之PSQL管理工具-高級命令(四) | http://www.sunline.cc/db/479559 |
| 《課程筆記:PostgreSQL深入淺出》之內存與進程(五) | http://www.sunline.cc/db/489936 |
| 《《課程筆記:PostgreSQL深入淺出》之外存&永久存儲(六) | http://www.sunline.cc/db/502267 |
| Oracle: | URL |
| 《Oracle 自動收集統計信息機制》 | http://www.sunline.cc/db/403670 |
| 《Oracle_索引重建—優化索引碎片》 | http://www.sunline.cc/db/399543 |
| 《DBA_TAB_MODIFICATIONS表的刷新策略測試》 | http://www.sunline.cc/db/414692 |
| 《FY_Recover_Data.dbf》 | http://www.sunline.cc/doc/74682 |
| 《Oracle RAC 集群遷移文件操作.pdf》 | http://www.sunline.cc/doc/72985 |
| 《Oracle Date 字段索引使用測試.dbf》 | http://www.sunline.cc/doc/72521 |
| 《Oracle 診斷案例 :因應用死循環導致的CPU過高》 | http://www.sunline.cc/db/483047 |
| 《Oracle 慢SQL監控腳本》 | http://www.sunline.cc/db/479620 |
| 《Oracle 慢SQL監控測試及監控腳本.pdf》 | http://www.sunline.cc/doc/76068 |
| 《Oracle 腳本實現簡單的審計功能》 | http://www.sunline.cc/db/450052 |
| Greenplum: | URL |
| 《PL/Java.pdf》 | http://www.sunline.cc/doc/70867 |
| 《GP的資源隊列.pdf》 | http://www.sunline.cc/doc/67644 |
| 《Greenplum psql客戶端免交互執行SQL.pdf》 | http://www.sunline.cc/doc/69806 |
最后修改時間:2022-09-27 21:29:05
「喜歡這篇文章,您的關注和贊賞是給作者最好的鼓勵」
關注作者
【版權聲明】本文為墨天輪用戶原創內容,轉載時必須標注文章的來源(墨天輪),文章鏈接,文章作者等基本信息,否則作者和墨天輪有權追究責任。如果您發現墨天輪中有涉嫌抄襲或者侵權的內容,歡迎發送郵件至:contact@modb.pro進行舉報,并提供相關證據,一經查實,墨天輪將立刻刪除相關內容。




