利用业务逻辑+OB分布式特性优化SQL
最近某人社局核心数据库上了OB,经常出现性能问题
某人社与我司合作多年,非常信任我司在数据库的专业能力,邀请我司过去看看能否提供帮助
与OB驻场工程师合作,抓取了一天的TOP SQL,跑得慢的SQL有几十条(注意只是某一天的TOP SQL)
大致分析了一下,有缺索引的,有执行计划走错的,有SQL写法有问题的,有字段类型设计错误的,也有表分区策略设计有问题的
这些问题在我看来都很简单就不贴在博客了,下面我要分享一个对于OB SQL优化很有启发意义的案例
下面SQL每天要运行20w次,平均每次执行0.5s到2秒,它耗费了整个OB集群20%的CPU资源
也许有人会说,不就才20w次吗,我见过运行几百万次,上千万次的SQL
这里我要说的是,请不要拿国产数据库与Oracle对比,Oracle发展了40年了,国产数据库才发展多少年,能替换O已经很厉害了
每天运行20w次的时段大致在早上9:30分到11:30分以及下午2:30到5:00,也就是工作日业务办理时间
SQL代码大致如下(只贴一条,还有很多类似SQL就不贴了):
SELECT * FROM AC08 WHERE (AAC001 = ? AND AAE140= ? AND AAE792 IN (?,?) AND NOT EXISTS (SELECT ? FROM AC08 B WHERE AC08.AAZ686 = B.AAZ686 AND B.AAE792 IN (?)))
AC08是个超级大表,它有26亿条数据,根据AAC001 进行的HASH分区,执行计划如下:
=======================================================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
-----------------------------------------------------------------------
|0 |NESTED-LOOP ANTI JOIN | |0 |337 |
|1 | PX COORDINATOR | |1 |302 |
|2 | EXCHANGE OUT DISTR |:EX10000 |1 |294 |
|3 | TABLE SCAN |AC08(IDX_AC08EES_AAC001) |1 |294 |
|4 | PX COORDINATOR | |1 |46 |
|5 | EXCHANGE OUT DISTR |:EX20000 |1 |46 |
|6 | SUBPLAN SCAN |VIEW1 |1 |46 |
|7 | PX PARTITION ITERATOR| |1 |46 |
|8 | TABLE SCAN |B(IDX_AC08_AAZ686_AAE792)|1 |46 |
=======================================================================Outputs & filters:
-------------------------------------0 - output([AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ686], [AC08.AAC001], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE140], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE792], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), filter(nil), conds(nil), nl_params_([AC08.AAZ686])1 - output([AC08.AAC001], [AC08.AAE140], [AC08.AAE792], [AC08.AAZ686], [AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), filter(nil)2 - output([AC08.AAC001], [AC08.AAE140], [AC08.AAE792], [AC08.AAZ686], [AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), filter(nil), is_single, dop=13 - output([AC08.AAC001], [AC08.AAE140], [AC08.AAE792], [AC08.AAZ686], [AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), filter([cast(cast(AC08.AAE140, VARCHAR2(3 BYTE)), NUMBER(-1, -85)) = 120], [AC08.AAE792 IN (?, ?)]), access([AC08.AAC001], [AC08.AAE140], [AC08.AAE792], [AC08.AAZ686], [AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), partitions(p0)4 - output([1]), filter(nil)5 - output([1]), filter(nil), dop=16 - output([1]), filter(nil), access([VIEW1.B.AAZ686])7 - output([B.AAZ686]), filter(nil)8 - output([B.AAZ686]), filter(nil), access([B.AAZ686]), partitions(p[0-127])
从执行计划上看,上面的SQL没有可以优化的地方了,访问路径是对的,表关联方式也是对的
对于一般的DBA来说,可能放弃治疗了
注意观察执行计划,ID = 8 access([B.AAZ686]), partitions(p[0-127]) 访问了所有的分区
OB是分布式数据库,会根据分区将数据打散到所有的数据节点
每次跑这个SQL都会访问所有的数据节点,如果并发较高,就会对整个OB带来压力
执行计划上没有优化的地方,那就从SQL写法和业务逻辑入手
喵了一眼SQL写法,也没问题,现在只能从业务逻辑入手了,查一下表和列的注释
AC08 养老保险人员实收明细表
AAC001 人员编号,分区KEY
AAE140 险种类型
AAE792 费用标志
AAZ686 人员缴费ID
看到这里就知道怎么优化了,原始SQL语句中 NOT EXISTS 部分少加了个关联条件,我们再来看一下原始SQL:
SELECT * FROM AC08 WHERE (AAC001 = ? AND AAE140= ? AND AAE792 IN (?,?) AND NOT EXISTS (SELECT ? FROM AC08 B WHERE AC08.AAZ686 = B.AAZ686 AND B.AAE792 IN (?)))
应该把SQL改成
SELECT * FROM AC08 WHERE (AAC001 = ? AND AAE140= ? AND AAE792 IN (?,?) AND NOT EXISTS (SELECT ? FROM AC08 B WHERE AC08.AAZ686 = B.AAZ686 AND AC08.AAC001=B.AAC001 AND B.AAE792 IN (?)))
因为人员缴费ID(AAZ686) 一般是与人员编号(AAC001) 一一对应的
加上AC08.AAC001=B.AAC001过滤条件之后,就能避免OB跨数据节点访问了
更改后的执行计划如下:
=====================================================================
|ID|OPERATOR |NAME |EST. ROWS|COST|
---------------------------------------------------------------------
|0 |EXCHANGE IN REMOTE | |1 |337 |
|1 | EXCHANGE OUT REMOTE | |1 |330 |
|2 | NESTED-LOOP ANTI JOIN| |1 |330 |
|3 | TABLE SCAN |AC08(IDX_AC08EES_AAC001) |1 |294 |
|4 | SUBPLAN SCAN |VIEW1 |1 |46 |
|5 | TABLE SCAN |B(IDX_AC08_AAZ686_AAE792)|1 |46 |
=====================================================================Outputs & filters:
-------------------------------------0 - output([AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ686], [AC08.AAC001], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE140], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE792], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), filter(nil)1 - output([AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ686], [AC08.AAC001], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE140], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE792], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), filter(nil)2 - output([AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ686], [AC08.AAC001], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE140], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE792], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), filter(nil), conds(nil), nl_params_([AC08.AAZ686])3 - output([AC08.AAC001], [AC08.AAE140], [AC08.AAE792], [AC08.AAZ686], [AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), filter([cast(cast(AC08.AAE140, VARCHAR2(3 BYTE)), NUMBER(-1, -85)) = 120], [AC08.AAE792 IN (?, ?)]), access([AC08.AAC001], [AC08.AAE140], [AC08.AAE792], [AC08.AAZ686], [AC08.AAZ648], [AC08.AAZ223], [AC08.AAZ159], [AC08.AAZ061], [AC08.AAB001], [AC08.AAB365], [AC08.AAE002], [AC08.AAE003], [AC08.AAA115], [AC08.AAE793], [AC08.AAE794], [AC08.AAA093], [AC08.AAC066], [AC08.AAC313], [AC08.AAC314], [AC08.AAE737], [AC08.AAB019], [AC08.AAB033], [AC08.AAE745], [AC08.AAC028], [AC08.AAC040], [AC08.AAB121], [AC08.AAE180], [AC08.AAE795], [AC08.AAE871], [AC08.AAE020], [AC08.AAE021], [AC08.AAE022], [AC08.AAE023], [AC08.AAE784], [AC08.AAE785], [AC08.AAE786], [AC08.AAE787], [AC08.AAE836], [AC08.AAE837], [AC08.AAE838], [AC08.AAE839], [AC08.AAE056], [AC08.AAE887], [AC08.AAE026], [AC08.AAE828], [AC08.AIC380], [AC08.AAE834], [AC08.AAE845], [AC08.AAE844], [AC08.AAB191], [AC08.AAE080], [AC08.AAE081], [AC08.AAE082], [AC08.AAE083], [AC08.AAE788], [AC08.AAE789], [AC08.AAE790], [AC08.AAE791], [AC08.AAE840], [AC08.AAE841], [AC08.AAE842], [AC08.AAE843], [AC08.AAE057], [AC08.AAE888], [AC08.AAE086], [AC08.AAE741], [AC08.AAE202], [AC08.AAA042], [AC08.AAA043], [AC08.AAA041], [AC08.AAA045], [AC08.AAZ616], [AC08.AAZ615], [AC08.AAE061], [AC08.AAE108], [AC08.AAB301], [AC08.AAB299], [AC08.AAE729], [AC08.AAE819], [AC08.AAE820], [AC08.AAE796], [AC08.AAE797], [AC08.AAE798], [AC08.AAE799], [AC08.AAE800], [AC08.AAZ625], [AC08.AAE150], [AC08.AAE066], [AC08.AAE748], [AC08.AAE822], [AC08.AAZ631], [AC08.AAZ650], [AC08.AAC323], [AC08.AAE013], [AC08.AAZ649], [AC08.AAE860], [AC08.AAE859], [AC08.AAE011], [AC08.AAZ692], [AC08.AAE036], [AC08.AAB034], [AC08.AAB360], [AC08.AAB359], [AC08.AAF018], [AC08.AAA431], [AC08.AAZ673], [AC08.AAA027], [AC08.AAA508], [AC08.AAA350]), partitions(p0)4 - output([1]), filter(nil), access([VIEW1.B.AAZ686])5 - output([B.AAZ686]), filter([B.AAC001 = 1026005878]), access([B.AAC001], [B.AAZ686]), partitions(p0)
执行计划中的PX消失了(你可以理解为跨界点访问),说明数据访问,关联都在一个节点完成
最终SQL由每次0.5秒-2秒优化到每次0.05秒,性能提升了10倍
算上每天跑20w次,平均耗费20%的CPU资源,那么这一个点的优化就可以将CPU资源从20%降低到2%
最后,有些小伙伴会有疑问,你咋知道SQL的NOT EXISTS应该加AC08.AAC001=B.AAC001过滤条件?原因有2个
1. 业务逻辑反推(得有开发&业务思维,纯运维DBA可能没这个思维)
2. AAC001是分区key
还有些小伙伴可能还有疑问,如果没有开发&业务思维怎么办? 也可以写个SQL检查AAC001与AAZ686的对应关系
select *from (select AAZ686, count(*) cntfrom (select AAZ686, AAC001 from ac08 group by AAZ686, AAC001)group by AAZ686order by 2 desc)where rownum <= 10;
如果CNT都是1就证明了我们的逻辑反推,如果CNT>1,得和业务确认,看看表中数据是否有问题
讲到这里还遇到点插曲,最开始查询的时候确实是1,过了2周我准备写博客了,再去查询发现CNT变成2了,把我吓了一跳
最终找到开发商,和业务确认,数据有错误。搞优化的同时帮开发商发现了数据质量问题,这尼玛...
相关文章:
利用业务逻辑+OB分布式特性优化SQL
最近某人社局核心数据库上了OB,经常出现性能问题 某人社与我司合作多年,非常信任我司在数据库的专业能力,邀请我司过去看看能否提供帮助 与OB驻场工程师合作,抓取了一天的TOP SQL,跑得慢的SQL有几十条(注意只是某一天的…...

哈希表
文章目录什么是哈希问题引入哈希函数直接定址法除留余数法 (常用、重点)哈希冲突哈希冲突的解决方法闭散列开散列unordered_map && unordered_set 封装实现哈希的应用位图布隆过滤器哈希经典面试题哈希切分位图应用布隆过滤器什么是哈希 在上一…...

基于Halcon的MLP(多层感知神经网络)分类器分类操作实例
一、介绍 人工神经网络(Artificial Neural Network,ANN)简称神经网络(Neural Network,NN)或类神经网络,是一种模仿生物神经网络的结构和功能的数学模型或计算模型,用于对函数进行估计或近似。 MLP神经网络是一种基于神经网络、动态的分类器。MLP分类器使用神经…...

VR全景博物馆,打造7*24小时的线上参访体验
导语:博物馆作为人们了解历史、文化和艺术的重要场所,现在可以通过VR全景技术来进行展览,让参观者身临其境地感受历史文化的魅力。本文将介绍博物馆VR全景的特点、优势,以及如何使用VR全景技术来丰富博物馆的展览和教育活动。什么…...
Go 数据类型
基础数据类型 类型长度(字节)默认值说明bool1falsebyte10uint8,取值范围[0,255]rune40Unicode Code Point,int32int,uint4或者8032位或64位操作系统int8,uint810-128~127,0-255int16,uint1620-32768~32767,…...

Mybatis-Plus学透?一篇足够(持续更新中)
01、Mybatis-Plus入门 一、简介 MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。如果你想对自己的项目进行技术升级,不妨尝试将mybatis换成Mybati…...
船用燃料油市场调研报告-主要企业、市场规模、份额及发展趋势
船用燃料油市场报告主要研究:市场规模: 产能、产量、销售、产值、价格、成本、利润等行业分析:原材料、市场应用、产品种类、市场需求、市场供给,下游市场分析、供应链分析等竞争分析:主要企业情况、市场份额、并购、扩…...

python趣味编程-奥赛罗游戏
在上一期我们用Python实现了一个高速公路汽车游戏的游戏,这一期我们继续使用Python实现一个简单的奥赛罗游戏,让我们开始今天的旅程吧~ 在Python中使用Turtle实现的奥赛罗游戏 在Python中使用Turtle的简单奥赛罗游戏 是一个以 Python 为程序设计语言的项…...
经典卷积模型回顾13—ResNetXt实现图像分类(matlab)
ResNetXt是ResNet的变种,在ResNet基础上引入了"split-transform-merge"的思想,旨在进一步提升模型的性能和准确率。ResNetXt模型的核心思想是通过对输入进行分组,然后对每个分组进行不同的变换,最后再将变换后的结果合并…...

Spring学习——Maven进阶
分模块开发与设计 创建模块 书写模块代码 通过maven指令安装模块到本地仓库(install指令) 在pom.xml中导入坐标执行maven的install命令将模块安装到本地maven仓库 团队内部开发可以发布模块功能到团队内部可共享的仓库中(私服) 依赖管理 依赖指当前项目运行所需…...
第23篇:基础知识-Java Switch Case
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。 switch case 语句语法格式如下: switch(expression){ case value : //语句 break; //可选 case value : //语句 break; //可选 //你可以有任意数量的…...

Go 实现多态和 参数的动态个数及动态类型
引子 go语言作为静态(编译期类型检测)强类型(手写代码进行类型转换)语言, 要想实现 动态语言的鸭子类型的调用方法,做到 一个入参是不同类型,还是有些麻烦的; 需求 希望写代码时像python一样的鸭子类型,不用管参数类型,都可以调用同一个方法;希望 入参像python一样 能够在 个…...
vue 指令
Vue 提供了很多指令,如:v-model, v-show,v-if等等,有利于应付开发时出现的各种情况。Vue 也提供了自定义指令,有利于开发者将某些通用性功能封装成一个指令,进行全局或局部注册。如:复制指令&am…...

APP违法违规收集使用个人信息合规评流程和范围
近期,工信部通报2023年第1批《侵害用户权益行为的APP通报》(总第27批),共通报46款APP(SDK),这些被责令限期整改的APP(SDK),涉及的问题主要包括3个方面&#x…...
【力扣2379】 得到 K 个黑块的最少涂色次数(c++100%)
给你一个长度为 n 下标从 0 开始的字符串 blocks ,blocks[i] 要么是 W 要么是 B ,表示第 i 块的颜色。字符 W 和 B 分别表示白色和黑色。给你一个整数 k ,表示想要 连续 黑色块的数目。每一次操作中,你可以选择一个白色块将它 涂成…...

[2.2.2]进程调度的时机、方式、切换与过程
文章目录第二章 进程管理进程调度的时机、方式、切换与过程(一)进程调度的时机(二)进程调度的方式(三)进程的切换与过程小结第二章 进程管理 进程调度的时机、方式、切换与过程 时机 什么时候需要进程调度…...
第24篇:Java包装类知识深度分析
目录 1、包装类背景 2、包装类的优点 3、包装类与基本类型关系 4、代码示例...

常见问题整理1
目录 偏差和方差 欠拟合underfitting 过拟合overfitting 梯度消失和梯度爆炸 归一化 偏差和方差 偏差:算法期望预测和真实预测之间的偏差程度。反应的是模型本身的拟合能力。 方差:度量了同等大小的训练集的变动导致学习性能的变化,刻画…...

体验Linux 块设备驱动实验(模拟块)
目录 一、块设备 二、块设备驱动框架 1、块设备的注册和注销 2、gendisk 结构体 3、block_device_operations 结构体 4、块设备 I/O 请求过程 ①、请求队列 request_queue ②、bio 结构 三、编写驱动之请求队列 1、修改makefile 2、基本的驱动框架编辑 3、添加头文…...

一文搞懂Linux时区设置、自定义时区文件
概念介绍 常说的 Linux 系统时钟有两个 一个是硬件时钟(RTC),即BIOS时间,一般保存的是 GMT0 时间,没时区、夏令时的概念 一个是当地时钟(LTC),即我们日常经常看到的时间࿰…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...