通过Snapshot Standby来精确评估SQL性能

简介:     最近处理了一个需求,比较紧急,映射到数据库层面是需要更新17万id的值,听起来是不少,根据数据架构进行了分析,发现目前是做了分库分表的方式,所以这17万的id在这些分库中都可能存在,而跨部门的数据交付中,也没有做分库的区分,所以拿到的id是一个笼统的概念,即哪个id对应哪个分库没有事先过滤甄别,这个工作就自然而然的下落到了DBA头上。
    最近处理了一个需求,比较紧急,映射到数据库层面是需要更新17万id的值,听起来是不少,根据数据架构进行了分析,发现目前是做了分库分表的方式,所以这17万的id在这些分库中都可能存在,而跨部门的数据交付中,也没有做分库的区分,所以拿到的id是一个笼统的概念,即哪个id对应哪个分库没有事先过滤甄别,这个工作就自然而然的下落到了DBA头上。
   分库分表的方式,目前有12个分库,是以十二个用户的形式体现出来的,所以如果要整体更新,那么每个分库都需要更新一遍,有匹配的数据就更新,否则忽略。如此一来,更新的数据规模是就有几种计算方式,一种是每个id更新对应一条sql语句,那么语句就有17000*12=2040000条,200多万条,规模是相当惊人了。执行期间的锁暂且不考虑,光是执行时间在毫秒,百万的基数也会把差距放大。还有一种思路是提供12个sql语句,每个分库各一条sql语句,把17万的id放入一个临时表中,关联更新,这种方式执行时间肯定相比单条语句要长,但是具体多多少还是未知数。
    尤其是线上系统,关键的业务系统,这类的操作就尤其敏感。如果有几种方案,需要给出一个基本的分析和评定,哪种更好,有什么准确的数据呢,主库中是万万使不得,需要有把握再动手。所以我隆重推荐使用Snapshot Standby来实现这类需求,评估性能,预估影响范围和操作时间,在完全一致的数据基础上操作,得到的数据更加有说服力。
我想了几个方案作为备用方案:
方法:
每个id对应1个sql,17万sql*12个分库

方法2:
一个临时表,12个分库,12个sql

方法3:
一个临时表,12个分库,并行执行

方法4:
每个id对应1个sql,12个分库并行执行

这些方案在Snapshot Standby的环境中都可以轻松实现。主要原理是基于闪回日志,而亮点则在于备库可读可写,测试完毕之后可以继续闪回,应用最新的数据变更。
而对于上面方案中的临时表,我的考虑是基于外部表,因为本身要把这些数据导入,用完之后还得删除,热插拔的方式更加实惠。
创建外部表的语句如下:
CREATE TABLE  test_uin
      (uin    varchar2(30)
       )
    ORGANIZATION EXTERNAL
      (TYPE ORACLE_LOADER
      DEFAULT DIRECTORY batch_query_dir
      ACCESS PARAMETERS
        (
        RECORDS DELIMITED BY NEWLINE      
        )
      LOCATION ('uin.txt')
     );

开启备库为Snapshot Standby
DGMGRL> convert database s2test0 to snapshot standby;
Converting database "s2test0" to a Snapshot Standby database, please wait...
Database "s2test0" converted successfully
DGMGRL> show configuration;

Configuration - test0_dg

  Protection Mode: MaxPerformance
  Databases:
    stest032 - Primary database
    stest0   - Physical standby database
    s2test0  - Snapshot standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS
首先我测试了临时表通过insert填充数据的步骤,17万的id,用了大概5分钟。由此可想如果是12个分库,17万id更新,那么串行下来,少说也要1个小时,这个对于线上系统来说是很严重的延迟了。
然后我在这个备库中进行关联更新。
原来的语句如下:
update TEST_USER_INFO set  status=-99 where uin=?;
改为临时表的结果集来处理。
update TEST_USER_INFO set  status=-99 where uin in (select uin from test_uin);
这种方式大概用了30秒的时间就在12个分库顺利完成,平均每个分库大概是2秒钟的执行效率。
如此一来有了很精确的评估,所以实施起来就会很得心应手,而在部署前,得到的临时调整,需要修改的id变为了38万,当然看起来数据翻了一倍,但是执行效率还是杠杠的。大概是30秒就顺利完成。所以通过这种方式还是能够很精准的分析潜在的性能问题,而对于上面逐步分析的集中测试场景,其实有了这些数据就了然于胸。

目录
相关文章
|
2月前
|
SQL 关系型数据库 MySQL
为什么这些 SQL 语句逻辑相同,性能却差异巨大?
我是小假 期待与你的下一次相遇 ~
190 0
|
6月前
|
SQL 关系型数据库 PostgreSQL
CTE vs 子查询:深入拆解PostgreSQL复杂SQL的隐藏性能差异
本文深入探讨了PostgreSQL中CTE(公共表表达式)与子查询的选择对SQL性能的影响。通过分析两者底层机制,揭示CTE的物化特性及子查询的优化融合优势,并结合多场景案例对比执行效率。最终给出决策指南,帮助开发者根据数据量、引用次数和复杂度选择最优方案,同时提供高级优化技巧和版本演进建议,助力SQL性能调优。
648 1
|
SQL 存储 关系型数据库
如何巧用索引优化SQL语句性能?
本文从索引角度探讨了如何优化MySQL中的SQL语句性能。首先介绍了如何通过查看执行时间和执行计划定位慢SQL,并详细解析了EXPLAIN命令的各个字段含义。接着讲解了索引优化的关键点,包括聚簇索引、索引覆盖、联合索引及最左前缀原则等。最后,通过具体示例展示了索引如何提升查询速度,并提供了三层B+树的存储容量计算方法。通过这些技巧,可以帮助开发者有效提升数据库查询效率。
1111 2
|
9月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
10月前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
345 2
|
11月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
SQL 数据库 UED
SQL性能提升秘籍:5步优化法与10个实战案例
在数据库管理和应用开发中,SQL查询的性能优化至关重要。高效的SQL查询不仅可以提高应用的响应速度,还能降低服务器负载,提升用户体验。本文将分享SQL优化的五大步骤和十个实战案例,帮助构建高效、稳定的数据库应用。
1129 3
|
SQL IDE 数据库连接
IntelliJ IDEA处理大文件SQL:性能优势解析
在数据库开发和管理工作中,执行大型SQL文件是一个常见的任务。传统的数据库管理工具如Navicat在处理大型SQL文件时可能会遇到性能瓶颈。而IntelliJ IDEA,作为一个强大的集成开发环境,提供了一些高级功能,使其在执行大文件SQL时表现出色。本文将探讨IntelliJ IDEA在处理大文件SQL时的性能优势,并与Navicat进行比较。
263 4
|
SQL 存储 缓存
如何优化SQL查询性能?
【10月更文挑战第28天】如何优化SQL查询性能?
870 10
|
SQL 关系型数据库 MySQL
惊呆:where 1=1 可能严重影响性能,差了10多倍,快去排查你的 sql
老架构师尼恩在读者交流群中分享了关于MySQL中“where 1=1”条件的性能影响及其解决方案。该条件在动态SQL中常用,但可能在无真实条件时导致全表扫描,严重影响性能。尼恩建议通过其他条件或SQL子句命中索引,或使用MyBatis的`<where>`标签来避免性能问题。他还提供了详细的执行计划分析和优化建议,帮助大家在面试中展示深厚的技术功底,赢得面试官的青睐。更多内容可参考《尼恩Java面试宝典PDF》。