上一篇
想象一下:周一早晨,财务部的Lisa正准备生成季度报表,结果系统卡成了PPT,进度条像蜗牛爬行……😫 运维团队的电话瞬间被打爆,老板在会议室里焦躁地踱步——这熟悉的剧情,是不是让你后背一凉?别慌!今天这份Oracle性能急救手册,就是为你准备的超级英雄装备!💪
-- 生成最近8小时的AWR报告 SELECT * FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT( l_dbid => (SELECT dbid FROM v$database), l_inst_num => (SELECT instance_number FROM v$instance), l_bid => NULL, l_eid => NULL, l_options => 8));
重点看这些"危险信号":
DB CPU Time
飙升 → CPU资源告急 Top 5 Timed Events
中的等待事件(比如db file sequential read
) Hard Parses
(SQL解析过多) -- 查看当前活跃会话 SELECT sample_time, session_id, sql_id, event, blocking_session FROM v$active_session_history WHERE sample_time > SYSDATE - 5/1440; -- 最近5分钟
-- 找出TOP耗资源SQL SELECT * FROM ( SELECT sql_id, executions, elapsed_time/1e6 "总耗时(s)", elapsed_time/decode(executions,0,1,executions)/1e6 "单次耗时(s)" FROM v$sqlarea ORDER BY elapsed_time DESC) WHERE ROWNUM <= 10;
-- 查找未使用的索引 SELECT index_name, table_name FROM user_indexes WHERE index_name NOT IN (SELECT index_name FROM v$object_usage);
反模式案例:
-- 错误示范:在字段上使用函数 SELECT * FROM orders WHERE TO_CHAR(order_date,'YYYY-MM')='2025-07'; -- 正确姿势: SELECT * FROM orders WHERE order_date BETWEEN TO_DATE('2025-07-01','YYYY-MM-DD') AND TO_DATE('2025-07-31','YYYY-MM-DD');
-- 自动收集统计信息(适合OLTP系统) BEGIN DBMS_STATS.GATHER_SCHEMA_STATS( ownname => 'APP_USER', estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE); END;
参数名 | 推荐值范围 | 作用说明 |
---|---|---|
sga_target |
物理内存的50-60% | SGA内存池大小 |
pga_aggregate_target |
物理内存的20-25% | PGA工作区内存 |
optimizer_mode |
ALL_ROWS |
优化器倾向于批处理模式 |
-- 创建按月分区的订单表 CREATE TABLE orders ( order_id NUMBER, order_date DATE, customer_id NUMBER, amount NUMBER ) PARTITION BY RANGE (order_date) ( PARTITION orders_202501 VALUES LESS THAN (TO_DATE('2025-02-01','YYYY-MM-DD')), PARTITION orders_202502 VALUES LESS THAN (TO_DATE('2025-03-01','YYYY-MM-DD')), ... );
-- 创建每日销售汇总的物化视图 CREATE MATERIALIZED VIEW mv_daily_sales REFRESH COMPLETE ON DEMAND ENABLE QUERY REWRITE AS SELECT TRUNC(order_date) AS day, SUM(amount) AS total_sales FROM orders GROUP BY TRUNC(order_date);
-- 启用内存列存储 ALTER TABLE sales INMEMORY PRIORITY HIGH;
突发性能下降怎么办?
v$session_wait
找阻塞源 ALTER SYSTEM KILL SESSION 'sid,serial#' IMMEDIATE;
ALTER TABLESPACE TEMP ADD TEMPFILE '/path/temp02.dbf' SIZE 2G;
建议建立性能基线库,定期对比关键指标:
-- 创建性能基线 BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE( start_snap_id => 100, end_snap_id => 110, baseline_name => 'Peak_2025Q3'); END;
记住优化黄金法则:测量→优化→验证→迭代 🔄 你的Oracle数据库终将脱胎换骨!
(注:本文技术要点基于Oracle 19c/21c版本,部分特性需企业版许可,实际调整前建议在测试环境验证。)
本文由 才柔静 于2025-08-02发表在【云服务器提供商】,文中图片由(才柔静)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/518373.html
发表评论