这几天 Oacle 调优的小结

本文详细记录了在AIX5.3环境下进行Oracle数据库调优的过程,包括设置用户允许打开的进程数、调整文件标志符限制、优化数据库配置参数、减少死锁风险、增加索引等关键步骤,旨在提升数据库性能和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前在AIX 上进行了几天的Oracle 数据库调优,并进行了适当的命令记录,现备份上来:


数据库测试机器:
AIX5.3


查看aix每个用户允许打开的进程数
lsattr -El sys0|grep maxuproc


设置aix每个用户允许打开的进程数
chdev -l sys0 -a maxuproc=2048


设置aix允许打开的文件标志符数
ulimit -n 10000

查看oracle配置参数
show parameter processes;
#alter system set processes=300 scope = spfile;
#create pfile from spfile;

使用指定配置文件启动oracle
startup pfile=/oralce/app/admin/nspg/pfile/init.ora

查看当前连接数:
select count(*) from v$session;


查看所有数据库用户的连接数:
select schemaname,count(*) from v$session group by schemaname;


查看终端用户使用数据库的连接情况:
select osuser,schemaname,count(*) from v$session group by schemaname,osuser;

注意事项:
1、去掉所有外键。
     因为索引加的不全,Oracle加锁时,将主表的一条锁定后,没有加索引的子表将被整个锁定。(如果索引加的全,则按照索引锁定)。
     Oracle数据库加锁是:在数据行中放入一列(锁标志),这样不消耗系统资源。与其他数据库不同,其他是通过锁管理器进行管理的。
    (运行时建议都去掉外键)

2、死锁
    各个数据库都有不同的锁机制,锁管理器的管理运行机制。(Oracle除外)
    加锁(行锁、页锁、表锁,级别逐渐增高)
    锁升级(对应Oracle 为锁转换):数据库锁:行锁到一定规模后,自动升级成表锁(Sybase\db2 可设置阀值)
    操作:行锁去掉,变成一个表锁。所以应该尽量避免。

    sybase有页锁:锁定整个页,也是自动升级的。可以设定阀值    

    操作:如何尽可能的减少锁的个数、尽量避免锁升级。(Oracle仅注意锁转换)

    各个数据库配置对锁的影响不同:
       比如:DB2 lockList 

    Oracle配置:
        主要是内存配置、提炼出几个关键配置属性。修改这些配置,尽量避免锁升级/转换

3、加索引

    条件中的字段
    过滤掉较多非结果数据的字段优先添加索引。

MyBatis 中的 Oracle 批量更新(Batch Update)是指通过一次性发送多条 SQL 更新语句到 Oracle 数据库的方式,提高数据处理的效率,减少与数据库的交互次数。在 MyBatis 中,要实现批量更新,你需要做以下几个步骤: 1. **配置事务分隔符**:在 XML 映射文件中,设置 `<insert>` 或 `<update>` 标签的 `useGeneratedKeys="true"` 和 `keyProperty` 属性,这样 MyBatis 知道哪些操作是需要回滚的,并启用批次处理。 ```xml <update id="batchUpdate" parameterType="java.util.List"> <set> <!-- 更新字段 --> </set> FROM your_table WHERE some_condition </update> ``` 同时,在事务开始之前用 `session.getConfiguration().setAutoCommit(false)` 来关闭自动提交。 2. **创建一个 List 对象**:收集要更新的数据,每个元素是一个 Map,其中键值对对应 SQL 的占位符。 ```java List<Map<String, Object>> dataList = new ArrayList<>(); dataList.add(new HashMap<>(){{ put("field1", value1); put("field2", value2); }}); // 添加更多数据... ``` 3. **执行批量更新**:使用 `SqlSession` 的 `batch()` 方法执行批处理更新。 ```java try (SqlSession sqlSession = sqlSessionFactory.openSession()) { // 开始事务 sqlSession.startTransaction(); // 执行批量更新 int[] result = sqlSession.update("batchUpdate", dataList); // 提交事务 sqlSession.commit(); } catch (Exception e) { // 回滚事务 sqlSession.rollback(); throw e; } finally { sqlSession.close(); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值