云服务器内容精选

  • 事务 在GTM-FREE模式下,不允许执行跨节点事务。 在GTM-FREE模式下,如果所执行的SQL语句包含跨节点事务,会报错处理。 如果语句拆分多条会报错: INSERT/UPDATE/DELETE/MERGE contains multiple remote queries under GTM-free modeUnsupport DML two phase commit under gtm free mode. modify your SQL to generate light-proxy or fast-query-shipping plan。 此时需要修改语句,来单节点执行。 如果语句涉及多节点会报错: Your SQL needs more than one datanode to be involved in. 建议对语句进行修改,使得能够单节点执行。如果需要此种语句多节点执行,需要添加一个hint来允许,例如:insert /*+ multinode */ into t values(3,3),(1,1); 建议开发阶段在jdbc连接串内设置application_type=perfect_sharding_type,这样所有跨节点读写操作的SQL都会报错,用来提示开发人员尽早优化语句。 大对象操作不支持事务。 大对象操作包括:创建删除DATABASE, ANALYZE, VACUUM。 通过JDBC接入数据库时,避免拼接多条SQL为一条语句发送执行。 当多条语句拼接为一条语句,且其中包含对象操作时,如果中间对象操作失败,会重新开启新事务执行后续语句。 示例:不符合规则语句 Connection conn = .... try { Statement stmt = null; try { stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE t1 (a int); DROP TABLE t1"); } finally { stmt.close(); } conn.commit(); } catch(Exception e) { conn.rollback(); } finally { conn.close(); } 上述执行语句,如果“CREATE TABLE t1;”失败,会重新开启新事务执行“DROP TABLE t1;”导致执行失败。应拆分成两条语句分别发送: Connection conn = .... try { Statement stmt = null; try { stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE t1 (a int)"); stmt.executeUpdate("DROP TABLE t1"); } finally { stmt.close(); } conn.commit(); } catch(Exception e) { conn.rollback(); } finally { conn.close(); } 父主题: 数据库编程规范
  • 子查询 禁止一条SQL语句中,出现重复子查询语句。 少用标量子查询。 标量子查询指结果为1个值,并且条件表达式为等值的子查询。 示例:不符合规范的语句 SELECT * FROM t1 WHERE id = (SELECT id FROM t2 LIMIT 1)); 上述语句建议业务拆分为两条SQL语句,先执行子查询。 避免在SELECT目标列中使用子查询,可能导致计划无法下推影响执行性能。 子查询嵌套深度建议不超过2层。 由于子查询会带来临时表开销,过于复杂的查询应考虑从业务逻辑上进行优化。 父主题: 数据库编程规范