从实例看oracle的索引监控与无效索引维护
一般观点认为 oracle 数据库使用的索引不会超过设计时创建索引总数的 25%, 或者不以它们被期望的使用方式使用 . 在实际应用中 , 调优速度较慢的查询时 , 经常发现执行的 sql 调用了垃圾索引 , 而不是我们设计时建立的索引 . 所以我们有必要通过监控数据库索
一般观点认为oracle数据库使用的索引不会超过设计时创建索引总数的25%,或者不以它们被期望的使用方式使用.在实际应用中,调优速度较慢的查询时,经常发现执行的sql调用了垃圾索引,而不是我们设计时建立的索引.所以我们有必要通过监控数据库索引的使用,释放那些未被使用的索引,从而节省维护索引的开销,优化性能.
为了查看目前系统中索引是否有效,我从2008.09.19号开始设置了索引监控,到目前共跟踪了4天的运行数据.下面我根据得到的索引监控信息,分几个角度解析bi系统的后台数据库索引的有效性,及维护无效索引的内存,io和时间花销.
1,索引有效性统计
首先创建一个用来存储索引在监控时间段内是否被使用的临时表ods.jax_t2.,
CREATE TABLE ods.jax_t2(
owner VARCHAR2(100),
index_name VARCHAR2(100),
table_name VARCHAR2(100),
MONITORING VARCHAR2(10),
used VARCHAR2(10)
)TABLESPACE odsd;
然后分别使用各不同账户登陆,并执行下面语句,将用户的信息统一写入ods.jax_t2中.
INSERT INTO ods.jax_t2(owner,index_name,table_name,monitoring,used)
SELECT USER,index_name,table_name,MONITORING,used FROM V$OBJECT_USAGE;
COMMIT;
最后通过查询表ods.jax_t2可以得到索引有效使用率.
SELECT owner, COUNT(INDEX_NAME),
NVL(SUM(DECODE(USED, 'YES', 1, 0)), 0) 有效索引数目,
ROUND(100 * NVL(SUM(DECODE(USED, 'YES', 1, 0)), 0) /
COUNT(INDEX_NAME),
2) 索引有效率
FROM ods.jax_t2
GROUP BY owner
ORDER BY 索引有效率;
Owner |
索引总数 |
有效索引数 |
有效索引率率(%) |
DC |
130 |
0 |
0 |
OD |
31 |
0 |
0 |
PRICE |
6 |
0 |
0 |
DP22 |
70 |
11 |
15.71 |
WAREHOUSE |
91 |
19 |
20.88 |
TODS |
224 |
48 |
21.43 |
FBI |
89 |
26 |
29.21 |
ODS |
355 |
105 |
29.58 |
DP23 |
70 |
28 |
40 |
DW |
50 |
23 |
46 |
RPT |
13 |
6 |
46.15 |
CTL |
32 |
20 |
62.5 |
合计 |
1161 |
286 |
24.63 |
2,索引占用空间信息统计
数据字典dba_segments中存储有各数据库对象的空间分配情况.我们连立dba_segments和ods.jax_t2可以查询得到各用户总的空间分配和有效索引,无效索引所占用的空间大小.从统计信息中我们看到,在总共的61G索引中,只有11G左右的索引被有效利用.其他的索引空间在监控期间未被使用,这就是说,这50G的索引只有维护开销,而没能起到我们所设想的增加查询速度的功能.
SELECT DS.OWNER, SEGMENT_TYPE, ROUND(SUM(BYTES) / 1024 / 1024),
round(SUM(decode(jt.used,'YES',ds.bytes,0))/1024/1024) 有效索引,
round(SUM(decode(jt.used,'NO',ds.bytes,0))/1024/1024) 无效索引
FROM DBA_SEGMENTS DS,ods.jax_t2 jt
WHERE ds.owner = jt.owner AND ds.segment_name = jt.Index_Name
AND DS.OWNER NOT IN ('SYS', 'SYSTEM', 'OUTLN', 'WMSYS')
AND DS.SEGMENT_TYPE = 'INDEX'
GROUP BY DS.OWNER, DS.SEGMENT_TYPE
ORDER BY 无效索引
Owner |
对象类型 |
索引总空间(M) |
有效索引空间(M) |
无效索引空间(M) |
DP23 |
INDEX |
5 |
2 |
3 |
DP22 |
INDEX |
4 |
1 |
4 |
OD |
INDEX |
7 |
0 |
7 |
RPT |
INDEX |
10 |
1 |
9 |
CTL |
INDEX |
34 |
22 |
13 |
FBI |
INDEX |
199 |
2 |
197 |
PRICE |
INDEX |
200 |
0 |
200 |
TODS |
INDEX |
1504 |
270 |
1235 |
DC |
INDEX |
2188 |
0 |
2188 |
DW |
INDEX |
5212 |
2325 |
2887 |
ODS |
INDEX |
22240 |
8703 |
13537 |
WAREHOUSE |
INDEX |
29750 |
4 |
29745 |
总计 |
Index |
61353 |
11330 |
50023 |
3,部分索引维护的空间和时间花销
在这里,我选择了数据抽取过程中两个相对执行时间教程的表CR_CUSTOMER_EXPIATION_A as CCEA和CR_ORDER_ROLE as COR表进行一下分析.
|
CCEA |
COR |
记录占用空间 |
28 (M) |
2112 (M) |
索引占用空间 |
40 (M) |
5072 (M) |
日维护记录行数 删除/插入 |
550138/550952 |
258593/279324 |
无效索引数/索引总数 |
1/1 |
2/4 |
删除所需时间 |
50.20 (S) |
172 (S) |
插入所需时间 |
16.25 (S) |
39.22 (S) |
去掉无效索引后删除时间 |
19.88 (S) |
23.77 (S) |
去掉无效索引后插入所需时间 |
2.78 (S) |
13.75 (S) |
根据上面的比较结果我们看到,目前系统中索引占用的总数据大小高达60G以上,但实际有效的索引占用空间只有10G左右,绝大多数的索引只是增加了我们的维护时间和空间开销,而无法为系统的性能提供支持,测试数据显示,在删除无效索引之后,系统的维护速度得到大幅度提高.所以我建议:
1, 对一些检索比较频繁的表,找出系统中引用该表的查询语句,查看其执行计划,检索是否使用正确索引;
2,如果已经使用正确索引,则考虑通过重建索引等手段查看是否能提高查询速度;
3,如果索引确实无法增加数据检索的速度,则清除之.

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Oracle 데이터베이스 로그의 보존 기간은 다음을 포함한 로그 유형 및 구성에 따라 다릅니다. 재실행 로그: "LOG_ARCHIVE_DEST" 매개변수로 구성된 최대 크기에 의해 결정됩니다. 보관된 리두 로그: "DB_RECOVERY_FILE_DEST_SIZE" 매개변수로 구성된 최대 크기에 따라 결정됩니다. 온라인 리두 로그: 보관되지 않고 데이터베이스를 다시 시작하면 손실되며 보존 기간은 인스턴스 실행 시간과 일치합니다. 감사 로그: "AUDIT_TRAIL" 매개변수로 구성되며 기본적으로 30일 동안 보관됩니다.

두 날짜 사이의 일수를 계산하는 Oracle의 함수는 DATEDIFF()입니다. 구체적인 사용법은 다음과 같습니다. 시간 간격 단위 지정: 간격(예: 일, 월, 연도) 두 날짜 값 지정: date1 및 date2DATEDIFF(interval, date1, date2) 일 차이를 반환합니다.

Oracle 데이터베이스 시작 순서는 다음과 같습니다. 1. 전제 조건을 확인합니다. 3. 데이터베이스 인스턴스를 시작합니다. 5. 데이터베이스에 연결합니다. . 서비스를 활성화합니다(필요한 경우). 8. 연결을 테스트합니다.

Oracle의 INTERVAL 데이터 유형은 시간 간격을 나타내는 데 사용됩니다. 구문은 INTERVAL <precision> <unit>입니다. INTERVAL을 연산하기 위해 덧셈, 뺄셈, 곱셈 및 나눗셈 연산을 사용할 수 있으며 이는 시간 데이터 저장과 같은 시나리오에 적합합니다. 날짜 차이를 계산합니다.

Oracle에서 문자 발생 횟수를 찾으려면 다음 단계를 수행하십시오. 문자열의 전체 길이를 얻습니다. 문자가 나타나는 부분 문자열의 길이를 얻습니다. 부분 문자열 길이를 빼서 문자 발생 횟수를 계산합니다. 전체 길이에서.

Oracle 데이터베이스 서버 하드웨어 구성 요구 사항: 프로세서: 기본 주파수가 2.5GHz 이상인 멀티 코어, 대규모 데이터베이스의 경우 32개 이상의 코어가 권장됩니다. 메모리: 소규모 데이터베이스의 경우 최소 8GB, 중간 크기의 경우 16~64GB, 대규모 데이터베이스 또는 과도한 작업 부하의 경우 최대 512GB 이상. 스토리지: SSD 또는 NVMe 디스크, 중복성 및 성능을 위한 RAID 어레이. 네트워크: 고속 네트워크(10GbE 이상), 전용 네트워크 카드, 지연 시간이 짧은 네트워크. 기타: 안정적인 전원 공급 장치, 이중 구성 요소, 호환 가능한 운영 체제 및 소프트웨어, 열 방출 및 냉각 시스템.

Oracle에 필요한 메모리 양은 데이터베이스 크기, 활동 수준 및 필요한 성능 수준(데이터 버퍼 저장, 인덱스 버퍼, SQL 문 실행 및 데이터 사전 캐시 관리에 필요)에 따라 다릅니다. 정확한 양은 데이터베이스 크기, 활동 수준 및 필요한 성능 수준에 따라 달라집니다. 모범 사례에는 적절한 SGA 크기 설정, SGA 구성 요소 크기 조정, AMM 사용 및 메모리 사용량 모니터링이 포함됩니다.

Oracle은 "||" 기호를 사용하여 문자열을 연결합니다. 사용 방법은 다음과 같습니다. 연결할 문자열을 "||" 기호로 연결합니다. 문자열 연결의 우선순위는 낮으며 이후에도 빈 문자열이 유지되도록 괄호를 사용해야 합니다. 연결; NULL 값 연결은 여전히 NULL입니다.
