重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 706|回复: 0
打印 上一主题 下一主题

[讨论] 数据库的争用问题产生原因与解决办法

[复制链接]
跳转到指定楼层
楼主
发表于 2025-6-29 18:29:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Inkcup 于 2025-10-10 09:34 编辑

数据库争用问题‌通常指的是在多用户环境中,多个事务或进程同时访问同一资源时发生的冲突和延迟,导致系统性能下降或操作失败。争用问题主要涉及行锁、表锁等锁机制的管理和使用。可以通过AWR报告的Top 10 Foreground Events by Total Wait Time板块确认是否触发锁机制,然后通过SQL ordered by Elapsed Time板块定位需要优化的SQL语句。

------数据库争用问题的原因

    ‌行锁争用‌:当多个事务试图同时访问同一行数据时,会导致行锁争用。例如,一个事务对某行数据加锁进行删除操作,而另一个事务也试图对该行加锁进行更新操作,这时就会发生锁争用,可能导致其中一个事务等待或超时 。
    ‌表锁争用‌:当行锁升级为表锁时,如果表已被其他事务锁定,新的事务必须等待表锁释放,这也会导致争用问题 。
    ‌缓存和缓冲区争用‌:在数据库操作中,数据块可能会被多个会话同时访问,导致缓存和缓冲区的争用,尤其是在高并发环境下更为明显‌2。

------数据库争用问题的表现


    ‌性能下降‌:争用问题会导致数据库处理请求的速度变慢,响应时间延长。
    ‌事务失败‌:由于锁资源耗尽,事务可能会因为无法获取锁而失败。
    ‌系统错误‌:在高并发环境下,系统可能会因为处理不过来请求而报错。

------数据库争用问题的解决方法

    ‌优化事务设计‌:确保事务尽可能短,避免长时间占用锁资源。将相关操作放在一个事务中处理,确保数据一致性。
    ‌合理使用锁‌:根据业务需求选择合适的锁类型和隔离级别。例如,使用共享锁进行读操作,排他锁进行写操作‌3。
    ‌缓存和异步处理‌:通过缓存减少对数据库的直接访问,使用异步处理分散并发请求‌。
    ‌数据分片‌:将数据分布到多个节点或表中,通过水平扩展提高并发处理能力‌。
    ‌调整数据库参数‌:优化数据库配置,减少热点数据块的争用。例如,调整PCTFREE参数、使用HASH分区表等方法

------SQL语句性能优化
    where子句带函数,包含复杂的字符串解析,通过dblink执行等因素会增加数据库的工作量,降低数据库的性能。如果发现此类SQL语句导致争用等性能问题,应提出优化建议:

最关键的是,尽量避免全表扫描,让查询能够使用索引。

方案一:最优方案 -修改表结构(增加计算列)

这是最彻底、性能最好的解决方案,但需要能够修改远程表结构。


方案二:次优方案 - 使用函数索引(如果无法新增列)

如果无法添加新列,可以在远程表上创建一个函数索引。


方案三:应用层解决方案 - 拆分查询

如果既不能改表也不能创建索引,可以尝试优化查询逻辑。


方案四:终极架构优化 - 物化视图

如果以上都不可行,并且这是一个频繁执行的关键查询,请认真考虑使用**物化视图**。

1.  在本地数据库创建一个物化视图,定期从远程 `MI_LOG` 表刷新数据。
2.  在这个本地物化视图上创建所需的索引(包括函数索引或虚拟列索引)。
3.  修改应用,直接查询本地的物化视图。

这完全消除了dblink的等待,并且你可以在本地随意优化索引。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-21 07:09 , Processed in 0.285668 second(s), 25 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表