想不出什么好标题,也不想做什么标题党。说说今天工作中遇到的问题吧!先总结一句:了解应用的DBA才是一名合格的DBA!
开发人员要求解决一条SQL 语句问题。即过滤自身,比如
id
1
2
3
4
点id=1的那行,显示id in (2,3,4)的就对了
起初以为很简单,写了一条大致如下:
select * from t where not exists
(select 1 from t t1 where t1.id=:id
and t.id=t1.id)
这个是测试的语句,一个是笛卡尔乘积,一个是关联查询。严格的说要有性能上的考量().
SELECT
a.pk_equipdaliy,a.vbillstatus
FROM
ycam_equipdaliy a ,
ycam_equipdaliy b
WHERE
b.vbillstatus = 1
-- AND COALESCE (dr, 0) = 0
--AND a.pk_equipdaliy!=b.pk_equipdaliy
and a.pk_equipdaliy AND a.vbillstatus= 1.pk_equipdaliy
SELECT
a.pk_equipdaliy, a.vbillstatus
FROM
ycam_equipdaliy a
WHERE
-- AND COALESCE (dr, 0) = 0
a.pk_equipdaliy in
(
SELECT
b.pk_equipdaliy
FROM
ycam_equipdaliy b
WHERE
b.vbillstatus = 1
AND a.pk_equipdaliy !=b.pk_equipdaliy
)
AND a.vbillstatus = 1
两条在数据库里面跑时,都能得到正确的结果,但是当写到应用层,由java代码调用时,结果却一直报错。
判断sql本身没有问题,在开发执行调试状态时,同时在执行上述sql 语句时,发现表被锁住了。于是一步一步调试,调试到执行sql获取结果集时,问题出现了,sql语句所查询的表的一个字段 vbillstatus被修改由原来的3变为1。导致执行上述sql时,数据一致性遭到了破坏。于是梳理业务应用和业务逻辑。底层的代码的确在 “审核” 这一步,就把字段值修改了!最后只能通过应用程序而不是sql语句来解决问题。
总结一下:今天花了半天的时间来处理这个问题,最终解决了!对于数据库技术上没有什么收获,但是感悟是:作为一个行业软件的服务供应商的数据库技术支持,一定要了解应用,了解业务流程。这样才能准确而快速的定位问题的所在,进而更快的解决数据库问题。
附上盖国强大师对DBA 七点建议:
1.实时监控数据库告警日志
这是必须进行的工作,并且应该根据不同的严重级别,发送不同级别的告警,及时了解数据库的变化与告警。
2.实时监控数据库的重要统计信息
实施监控对于数据库运行至关重要、能够表征数据库重要变化的统计信息,并且据此发送报警信息。那么应当监控哪些统计信息呢?大家可以思考一下,对于单机、RAC环境各不相同。
3.部署自动的Statspack/AWR报告生成机制
每天检查前日的AWR报告,熟悉数据库的运行状况,做到对于数据库了如指掌
4.每天至少优化和熟悉一个Top SQL
根据AWR或Statspack报告,每天至少了解或熟悉一个Top SQL,能优化的要提出优化和调整建议
5.部署完善的监控和数据采样系统
DBA应该对数据库部署完善的监控系统,并对重要信息进行采样,能够实时或定期生成数据库重要指标的曲线图,展现数据库的运行趋势。
6.全面深入的了解应用架构
不了解应用的DBA是没有前途的DBA,对应用了解不深入的DBA算不上Expert,所以一定要深入了解应用。
7.撰写系统架构、现状、调整备忘录
根据对数据库的研究和了解,不断记录数据库的状况,撰写数据库架构、现状及调整备忘录,不放过任何可能的优化与改进的机会。