[20231204]建立監測索引ind_m.sql指令碼.txt
[20231204]建立監測索引ind_m.sql指令碼.txt
--//前幾天在QQ上收到同事的請求,問一臺資料庫伺服器插入緩慢,問我最近動了什麼沒有,隨後還貼了一些對方工程師的建議,就是刪除一
--//些索引.該表一共12個索引,其中我加了4個索引(我建議索引的風格與對方原來的不同),其中1個在原來的基礎上增加了1個欄位(原來
--//的索引我刪除了),相當於我僅僅增加3個索引,我可以確定我增加的索引一定查詢用到的,該表很大,記憶裡目前已經到了18G.
--//說實在要刪除索引我比對方要積極,而且我一般觀察很久以後再刪除,先隱含一段時間後再刪除,而且有一些一看就知道根本不會用的,
--//我直接就刪除了,比如一些科室編碼索引,這些鍵值均勻分佈的,不作count統計根本不會用.我不知道對方如何得出這樣的結論,如何分
--//析的,實際上問題的本質是該伺服器執行在虛擬機器上,可能其他虛擬機器的執行可能影響該伺服器的IO,導致磁碟IO緩慢,這個從dg上
--//可以看出,dg也是執行在虛擬機器上,該機器的磁碟IO就更慢,而且有時候延遲很大的情況.
--//另外說一點,我個人非常不喜歡生產系統執行在虛擬機器上,出現問題可能根本不是該機器的問題,而是其他虛擬伺服器導致的問題,更
--//麻煩的是團隊配合上存在問題,實際上就是相互推諉,我不知道對方如何得出這樣的結論,明顯是一個小白,給這樣的人維護系統要死人
--//的.我記得12c引入改進了索引使用跟蹤,驗證看看是否這些索引現在全部使用.我看了以前的筆記,自己寫一個指令碼驗證看看.
--//Oracle12.2引入了索引使用跟蹤,以取代以前的索引監控。而不是隻判斷是否使用了索引(DBA_OBJECT_USAGE.used),使用跟蹤提供
--//了一個量化的索引使用統計資料,如訪問次數、每次訪問返回的行數。
--//有兩個檢視V$INDEX_USAGE_INFO 和DBA_INDEX_USAGE 以及3個隱藏引數,用於報告和控制索引使用情況的跟蹤:
--//3個隱藏引數_iut_開頭.
> @ hide _iut_
NAME DESCRIPTION DEFAULT_VALUE SESSION_VALUE SYSTEM_VALUE ISSES ISSYS_MOD
------------------------- ---------------------------------------- ------------- ------------- ------------ ----- ---------
_iut_enable Control Index usage tracking TRUE TRUE TRUE FALSE IMMEDIATE
_iut_max_entries Maximum Index entries to be tracked TRUE 30000 30000 FALSE IMMEDIATE
_iut_stat_collection_type Specify Index usage stat collection type TRUE SAMPLED SAMPLED TRUE IMMEDIATE
--//預設_iut_enable=true,也就是預設索引監控是開啟的。
--//如果需要獲得準確的統計可以設定_iut_stat_collection_type=ALL.
--//V$INDEX_USAGE_INFO
--//跟蹤自上次重新整理以來的索引使用情況。每15分鐘重新整理一次。每次重新整理後,ACTIVE_ELEM_COUNT被重置為0,LAST_FLUSH_TIME被更新為
--//當前時間。
--//DBA_INDEX_USAGE
--//將物件重新整理到磁碟後,顯示物件級索引使用情況。
$ cat ind_m.sql
-- Copyright 2023 lfree. All rights reserved.
-- Licensed under the Apache License, Version 2.0. See LICENSE.txt for terms and conditions.
--------------------------------------------------------------------------------
--
-- Name: ind_m.sql
-- Purpose: display index monitor of information
--
-- Author: lfree
-- Usage:
-- @ind_m owner.index_name
-- @ind_m owner.table_name
-- @ind_m index_name
-- @ind_m table_name
--
--------------------------------------------------------------------------------
column INDEX_NAME format a30
column owner format a20
set term off
column v_owner new_value v_owner
column v_table new_value v_table
select
upper(CASE
WHEN INSTR('&1','.') > 0 THEN
SUBSTR('&1',INSTR('&1','.')+1)
ELSE
'&1'
END
) v_table,
CASE WHEN INSTR('&1','.') > 0 THEN
UPPER(SUBSTR('&1',1,INSTR('&1','.')-1))
ELSE
user
END v_owner
from dual;
set term on
SELECT u.owner
, i.table_name
, u.name index_name
, u.total_access_count tot_acc_cnt
, u.total_exec_count tot_exec_cnt
, u.total_rows_returned tot_rows_cnt
, u.bucket_0_access_count b0
, u.bucket_1_access_count b1
, u.bucket_2_10_access_count b2_10
, u.bucket_11_100_access_count b11_100
, u.bucket_101_1000_access_count b101_1k
, u.bucket_1000_plus_access_count b1k
, u.last_used
FROM DBA_INDEX_USAGE u
RIGHT JOIN DBA_INDEXES i
ON i.index_name = u.name and i.owner=u.owner
--// WHERE i.owner = '&&v_owner' and ( i.table_name like '%&&v_table%' or u.name like '%&&v_table%')
WHERE i.owner = '&&v_owner' and ( i.table_name = '&&v_table' or u.name = '&&v_table')
ORDER BY u.last_used;
--//注意如果索引的owner與表的owner不同,可能查詢不到結果!!
--//在生產系統測試看看。
1.環境:
SYS@192.168.100.235:1521/orcl> @ pr
==============================
PORT_STRING : x86_64/Linux 2.4.xx
VERSION : 19.0.0.0.0
BANNER : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
BANNER_FULL : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
BANNER_LEGACY : Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
CON_ID : 0
PL/SQL procedure successfully completed.
2.測試:
SYS@192.168.100.235:1521/orcl> @ ind_m lis.LIS_TEST
OWNER TABLE_NAME INDEX_NAME TOT_ACC_CNT TOT_EXEC_CNT TOT_ROWS_CNT B0 B1 B2_10 B11_100 B101_1K B1K LAST_USED
----- ---------- ------------------------------ ----------- ------------ ------------ ---------- ---------- ---------- ---------- ---------- ---------- -------------------
LIS LIS_TEST IX_LIS_TEST_PHONE_NO 17 17 0 17 0 0 0 0 0 2023-04-17 05:12:37
LIS LIS_TEST IX_LIS_TEST_ORDER_TIME 91 91 87204092 0 0 0 0 0 91 2023-08-18 17:21:45
LIS LIS_TEST IX_LIS_TEST_IDENTITY_ID 9 9 237 3 0 1 5 0 0 2023-11-08 16:04:11
LIS LIS_TEST I_LIS_TEST_AUDIT_TIME 19239 19239 36933968 0 0 0 8196 8233 2810 2023-11-12 17:53:38
LIS LIS_TEST I_LIS_TEST_ORIGINAL_BARCODE 238 238 0 238 0 0 0 0 0 2023-12-05 08:18:01
LIS LIS_TEST I_LIS_TEST_VISIT_NO 372 372 76 354 2 16 0 0 0 2023-12-06 08:49:06
LIS LIS_TEST I_LIS_TEST_TEST_DATE_INST_ID_X 64049733 64005504 5.9003E+10 20129476 7893309 2771919 6815824 19549949 6889360 2023-12-06 15:34:23
LIS LIS_TEST IX_LIS_TEST_PAT_NAME 17694409 17694437 951529674 23213 906092 4176725 10366595 2188793 32993 2023-12-06 15:34:23
LIS LIS_TEST PK_LIS_TEST 5074403702 552348703 1.3347E+11 4554195834 520187451 0 0 0 18625 2023-12-06 15:34:23
LIS LIS_TEST IX_LIS_TEST_PAT_ID 109504279 109495230 3250613103 3660234 9177375 34258917 55652565 6750663 4491 2023-12-06 15:34:23
LIS LIS_TEST IX_LIS_TEST_PAT_BARCODE 16268438 16268469 393980811 122425 529530 6645422 8341394 629049 619 2023-12-06 15:34:23
LIS LIS_TEST IX_LIS_TEST_BARCODE 128143541 134974976 575735257 41331179 86693684 45511 44128 25558 2433 2023-12-06 15:34:23
12 rows selected.
--//I_開頭的索引是我建立的。你可以發現全部索引都使用過,只不過有幾個像IX_LIS_TEST_PHONE_NO很少使用罷了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/267265/viewspace-2999646/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 批量匯出建立索引的指令碼索引指令碼
- 監控mysql索引使用效率的指令碼MySql索引指令碼
- nagios-建立記憶體監控指令碼iOS記憶體指令碼
- [20190510]快速建立執行指令碼.txt指令碼
- Sqlserver自動查詢缺失索引及拼出建立索引的語句的指令碼SQLServer索引指令碼
- 監控指令碼指令碼
- [20190416]exclusive latch測試指令碼.txt指令碼
- listener監聽監控指令碼指令碼
- oracle 索引重建提示指令碼Oracle索引指令碼
- mysql監控指令碼MySql指令碼
- DBA監控指令碼指令碼
- session指令碼監控Session指令碼
- 埠監控指令碼指令碼
- oracle 監控指令碼Oracle指令碼
- [20230210]建立完善swcnm.sql指令碼.txtSQL指令碼
- [20241114]建立完善ext_kglob.sh指令碼.txt指令碼
- [Oracle] 指令碼建立DBOracle指令碼
- 指令碼::Vim進階索引[3]指令碼索引
- 找出冗餘索引的指令碼索引指令碼
- [20190423]oradebug peek測試指令碼.txt指令碼
- [20151008]索引組織表上建立BITMAP索引.txt索引
- ogg監控指令碼指令碼
- stap監控IO指令碼指令碼
- 【shell】磁碟監控指令碼指令碼
- 【原創】匯出所有物件(表、索引、檢視、同義詞)的建立指令碼物件索引指令碼
- 快速建立分支Shell指令碼指令碼
- centos建立賬戶指令碼CentOS指令碼
- 表及索引 move tablespace 常用指令碼索引指令碼
- 通過impdp匯出索引指令碼索引指令碼
- ORACLE分析表和索引的指令碼Oracle索引指令碼
- [20230302]建立完善tpt o2.sql指令碼.txtSQL指令碼
- [20230203]建立完善sp1x.sql指令碼.txtSQL指令碼
- 測試建立基於函式的索引函式索引
- 【SQL監控】SQL完全監控的指令碼SQL指令碼
- [20170628]完善ooerr指令碼.txt指令碼
- outline操作指令碼_老版本.txt指令碼
- PostgreSQL之鎖監控指令碼SQL指令碼
- Oracle DBA常用監控指令碼Oracle指令碼