针对大事务问题对业务存储过程改造

spark学习:如何用spark sql改造存储过程(以PostgreSql为例) 存储过程中的变量和参数需要转换为Spark SQL中的变量和参数。在Spark SQL中,可以使用表达式和函数来表示变量和参数,例如:lit()函数表示字面量,col()函数表示列名,lit()函数可以用来创建常量列,可以用在DataFrame中的操作和计算中。如果用spark或用jdbc调用存储过程,存储过程还是在数据库执行,执行时间和资源消耗取决于数据库的性能,压力也给到数据库这边,可以利用spark sql改造存储过程。2、若存储过程存在DML(update/insert/delete)等。 阅读详情

针对大事务问题对业务存储过程改造

一、问题描述

1. 问题现象

业务调用存储过程没有成功,发现存在大事务,单独拿出来执行发现问题。

greatsql> INSERT INTO
  `ywdb1`.`t1`(
  `TIMEKEY`,
  `zbbh`,
  `zcbl`,
  `zcblms`,
  `zjzh`,
  `zjzhms`,
  `cbzh`,
  `ljzjzh`,
  `xmbh`,
  `xmmc`,
  `sfgj`,
  `dd`,
  `ddsm`,
  `cb`,
  `cz`,
  `bqzje`,
  `bnzje`,
  `ljzje`,
  `zcjz`,
  `zcje`,
  `bqzzb`,
  `bnjzzb`,
  `bfqj`
)
SELECT
  `TIMEKEY`,
  `zbbh`,
  `zcbl`,
  `zcblms`,
  `zjzh`,
  `zjzhms`,
  `cbzh`,
  `ljzjzh`,
  `xmbh`,
  `xmmc`,
  `sfgj`,
  `dd`,
  `ddsm`,
  `cb`,
  `cz`,
  `bqzje`,
  `bnzje`,
  `ljzje`,
  `zcjz`,
  `zcje`,
  `bqzzb`,
  `bnjzzb`,
  `bfqj`
FROM ywdb2.t2
WHERE
  TIMEKEY = concat(substr(_sj, 1, 4), '-', substr(_sj, 5, 2));
  
ERROR 8532 (HY000): Execute backend SQL on node failed with 1197: Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again.

错误日志中体现为:

2025-02-20T00:36:01.969610+08:00 O [Note] [MY-011953] [InnoDB] Page cleaner took 10448ms to flush 2000 pages  
2025-02-20T00:38:26.020404+08:00 O [Note] [MY-011953] [InnoDB] Page cleaner took 8427ms to flush 560 pages  
2025-02-20T00:38:39.690478+08:00 3478 [ERROR] [MY-011735] [Rep] Plugin group_replication reported: '[GCS] gcs_packet's payload is too big. Only packets smaller than 2113929216 bytes can be compressed. Payload size is 3823615463.'  
2025-02-20T00:38:39.690504+08:00 3478 [ERROR] [MY-011735] [Rep] Plugin group_replication reported: '[GCS] Error preparing the message for sending.'  
2025-02-20T00:38:40.092629+08:00 3478 [ERROR] [MY-011614] [Rep] Plugin group_replication reported: 'Error while broadcasting the transaction to the group on session 3478'  
2025-02-20T00:38:41.047249+08:00 3478 [ERROR] [MY-011207] [Rep] Run function 'before_commit' in plugin 'group_replication' failed  

二、问题分析

1.错误信息分析

  • ERROR 8532 (HY000)错误信息说明,执行的操作涉及multi-statement transaction,并且所需的存储超出了 max_binlog_cache_size 的限制。
  • 日志([Error]):提到 group_replication 报告的消息,具有GCS_packet's payload is too big 的报错。来自 group_replication,强调负载太大,只有小于 2113929216 字节的包可以发送。出现了 before_commit 的运行错误,以至于无法在group_replication 中完成事务。

2.分析参数设置

默认情况下,不建议超过2G以上的大事务。这也是参数层面的限制。

greatsql> SHOW variables WHERE variable_name IN ('group_replication_transaction_size_limit','group_replication_compression_threshold');
+------------------------------------------+------------+
| Variable_name                            | Value      |
+------------------------------------------+------------+
| group_replication_compression_threshold  | 1000000    |
| group_replication_transaction_size_limit | 2147483647 |
+------------------------------------------+------------+
2 rows in set (0.00 sec)
  1. group_replication_transaction_size_limit:
    1. 值:2147483647
    2. 含义:这个参数定义了可以被复制的事务的最大大小,单位是字节(bytes)。2147483647 是 2G。
  2. group_replication_compression_threshold:
    1. 值:1000000
    2. 含义:这个参数表示在进行组复制时,事务大小超过该阈值(在这里是 1,000,000 字节,即约 1MB)会被考虑进行压缩。换句话说,只有当事务大小超过 1MB 时,数据才会被压缩以减少网络传输的负担。

查看max_binlog_cache_size的值为4G,max_binlog_cache_size 参数,它限制了在 binlog(binary log)缓存中存储的最大字节数。

greatsql> SHOW variables LIKE '%max_binlog%';
+----------------------------+------------+
| Variable_name              | Value      |
+----------------------------+------------+
| max_binlog_cache_size      | 4294967296 |
| max_binlog_size            | 1073741824 |
| max_binlog_stmt_cache_size | 268435456  |
+----------------------------+------------+
3 rows in set (0.02 sec)

3.分析存储过程信息

查看此存储过程相关信息(INFORMATION_SCHEMA_ROUTINES):

greatsql> SELECT * FROM ROUTINES WHERE ROUTINE_DEFINITION LIKE '%t1%' \G  
*************************** 1. row ***************************  
            SPECIFIC_NAME: sp_t1  
          ROUTINE_CATALOG: def  
           ROUTINE_SCHEMA: ywdb1  
             ROUTINE_NAME: sp_t1  
             ROUTINE_TYPE: PROCEDURE  
           DTD_IDENTIFIER: NULL  
 CHARACTER_MAXIMUM_LENGTH: NULL  
   CHARACTER_OCTET_LENGTH: NULL  
        NUMERIC_PRECISION: NULL  
            NUMERIC_SCALE: NULL  
       DATETIME_PRECISION: NULL  
       CHARACTER_SET_NAME: NULL  
           COLLATION_NAME: NULL  
             ROUTINE_BODY: SQL  
       ROUTINE_DEFINITION: BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN -- 发生错误时回滚事务  
ROLLBACK;  
-- 这里可以添加错误处理逻辑  
END;  
START TRANSACTION;
DELETE FROM t1 WHERE TIMEKEY = concat(substr(_sj,1,4),'-',substr(_sj,5,2));
INSERT INTO `ywdb1`.`t1` (
  `zbbh`,
  `zclb`,
  `zcbl`,
  `zcblms`,
  `zjzh`,
  `zjzhms`,
  `cbzh`,
  `ljzjzh`,
  `xmbh`,
  `xmmc`,
  `sfgj`,
  `dd`,
  `ddsm`,
  `cb`,
  `cz`,
  `bqzje`,
  `bnzje`,
  `ljzje`,
  `zcjz`,
  `zcje`,
  `bqzzb`,
  `bnjzzb`,
  `bfqj`
)
SELECT
  `TIMEKEY`,
  `zbbh`,
  `zclb`,
  `zcbl`,
  `zcblms`,
  `zjzh`,
  `zjzhms`,
  `cbzh`,
  `ljzjzh`,
  `xmbh`,
  `xmmc`,
  `sfgj`,
  `dd`,
  `ddsm`,
  `cb`,
  `cz`,
  `bqzje`,
  `bnzje`,
  `ljzje`,
  `zcjz`,
  `zcje`,
  `bqzzb`,
  `bnjzzb`,
  `bfqj`
FROM ywdb2.t2
WHERE TIMEKEY = concat(substr(_sj,1,4),'-',substr(_sj,5,2))
GROUP BY `TIMEKEY`, `zbbh`, `zclb`, `zcbl`, `zcblms`, `zjzh`, `zjzhms`, `cbzh`, `ljzjzh`, `xmbh`, `xmmc`, `sfgj`, `dd`, `ddsm`, `cb`, `cz`, `bqzje`, `bnzje`, `ljzje`, `zcjz`, `zcje`, `bqzzb`, `bnjzzb`, `bfqj`;
--提交事务
COMMIT;
END
           EXTERNAL_NAME: NULL
       EXTERNAL_LANGUAGE: SQL
         PARAMETER_STYLE: SQL
        IS_DETERMINISTIC: NO
         SQL_DATA_ACCESS: CONTAINS SQL
                SQL_PATH: NULL
           SECURITY_TYPE: DEFINER
                 CREATED: 2025-02-17 15:05:54
            LAST_ALTERED: 2025-02-17 15:05:54
                SQL_MODE: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_
ENGINE_SUBSTITUTION
         ROUTINE_COMMENT: 
                 DEFINER: root@%
    CHARACTER_SET_CLIENT: utf8mb4
    COLLATION_CONNECTION: utf8mb4_0900_ai_ci
      DATABASE_COLLATION: utf8mb4_0900_bin

而业务上,对ETL表后续的清洗操作,确实涉及大事务的动作。

4.查看涉及表大小

greatsql> SELECT count(*) FROM ywdb1.t1;
+-------------+
|  count(*)   | 
+-------------+
|  3663246   |
+------------ +
1 rows in set (47.42 sec)
greatsql> SELECT count(*) FROM ywdb2.t2;
+-------------+
|  count(*)   | 
+-------------+
|  71580710   |
+------------ +
1 rows in set (34 min 54.12 sec)

因为ywdb2.t2长时间没有跑出结果,先直接查看ywdb2.t2的ibd文件大小(单表大小161G)。

$ du -sh *
161G t2.ibd

可以看到不管是delete ,还是依据ywdb2.t2这个大表来做insert … select … ,都是比较大体量的大事务,事务行数超过500W条以上 (单月账期的数据量)。

三、存储过程改造方法

1.改造思路

改写应用程序,利用频繁提交等方式,将大事务变为小事务。

2.改造方式

INSERT...SELECT...语句,存储过程内改成循环,并一段10000条提交一次。(使用游标)

以存储过程ywdb1.sp_t1 的修改为例:

greatsql> USE test_db1;
greatsql> CREATE TABLE test_t111 LIKE ywdb1.t1;
greatsql> CREATE TABLE test_t222 LIKE ywdb2.t2;
greatsql>
delimiter //
CREATE DEFINER=`root`@`%` PROCEDURE `test_sp_t1`(_sj varchar(10))
BEGIN 
  -- 声明变量
  DECLARE done int DEFAULT FALSE; 
  
  DECLARE v_timekey varchar(50);
  DECLARE v_zbbh varchar(100) ;
  DECLARE v_zclb varchar(100);
  DECLARE v_zclbms varchar(100);
  DECLARE v_zjzh varchar(100);
  DECLARE v_zjzhms varchar(500);
  DECLARE v_cbzh varchar(100);
  DECLARE v_cbzhms varchar(100);
  DECLARE v_ljzjzh varchar(100);
  DECLARE v_ljzjzhms varchar(100);
  DECLARE v_xmbh varchar(100);
  DECLARE v_xmmc varchar(100);
  DECLARE v_sfgj varchar(100);
  DECLARE v_dd varchar(100);
  DECLARE v_ddsm varchar(100);
  DECLARE v_cb decimal(18,4);
  DECLARE v_cz decimal(18,4);
  DECLARE v_bqzje decimal(18,4);
  DECLARE v_bnzje decimal(18,4);
  DECLARE v_ljzje decimal(18,4);
  DECLARE v_zcjz decimal(18,4);
  DECLARE v_zcje decimal(18,4);
  DECLARE v_bqjzzb decimal(18,4);
  DECLARE v_bnjzzb decimal(18,4);
  DECLARE v_ljjzzb decimal(18,4);
  DECLARE v_bfqj varchar(20);
 
  DECLARE count_num int DEFAULT 0;  -- 计数器,用于分批提交
  -- 声明游标,用于从源表中选择数据
  DECLARE cur_sel CURSOR FOR SELECT   
  `TIMEKEY`,  
  `zbbh`,  
  `zclb`,  
  `zclbms`,  
  `zjzh`,  
  `zjzhms`,  
  `cbzh`,  
  `cbzhms`,  
  `ljzjzh`,
  `ljzjzhms`,
  `xmbh`,
  `xmmc`,
  `sfgj`,
  `dd`,
  `ddsm`,
  `cb`,
  `cz`,
  `bqzje`,
  `bnzje`,
  `ljzje`,
  `zcjz`,
  `zcje`,
  `bqjzzb`,
  `bnjzzb`,
  `ljjzzb`,
  `bfqj`
FROM test_db1.test_t222
WHERE TIMEKEY = concat(substr(_sj,1,4),'-',substr(_sj,5,2)); -- 根据传入的日期参数过滤数据

-- 声明游标读取结束时的处理程序 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=TRUE;

-- 删除目标表中符合条件的数据 
DELETE FROM test_t111 WHERE TIMEKEY = concat(substr(_sj,1,4),'-',substr(_sj,5,2)); 

-- 开始事务 
START transaction;

-- 打开游标
  OPEN cur_sel;
  
-- 循环读取游标数据
 read_loop:LOOP
   FETCH cur_sel INTO v_timekey, v_zbbh,v_zclb,v_zclbms,v_zjzh,v_zjzhms,v_cbzh,v_cbzhms,v_ljzjzh,v_ljzjzhms,v_xmbh,v_xmmc,v_sfgj,v_dd,v_ddsm, v_cb,v_cz,v_bqzje,v_bnzje,v_ljzje,v_zcjz,v_zcje,v_bqjzzb, v_bnjzzb,v_ljjzzb,v_bfqj;
   
-- 如果游标读取结束,退出循环 
 IF done THEN
   leave read_loop;
 END IF;
 
-- 计数器加 1  
SET count_num=count_num+1;

-- 将读取的数据插入目标表  
INSERT INTO `test_db1`.`test_t111`(
  `TIMEKEY`,
  `zbbh`,
  `zclb`,
  `zclbms`,
  `zjzh`,
  `zjzhms`,
  `cbzh`,
  `cbzhms`,
  `ljzjzh`,
  `ljzjzhms`,
  `xmbh`,
  `xmmc`,
  `sfgj`,
  `dd`,
  `ddsm`,
  `cb`,
  `cz`,
  `bqzje`,
  `bnzje`,
  `ljzje`,
  `zcjz`,
  `zcje`,
  `bqjzzb`,
  `bnjzzb`,
  `ljjzzb`,
  `bfqj`) VALUES (v_timekey, v_zbbh,v_zclb,v_zclbms,v_zjzh,v_zjzhms,v_cbzh,v_cbzhms,v_ljzjzh,v_ljzjzhms,v_xmbh,v_xmmc,v_sfgj,v_dd,v_ddsm, v_cb,v_cz,v_bqzje,v_bnzje,v_ljzje,v_zcjz,v_zcje,v_bqjzzb, v_bnjzzb,v_ljjzzb,v_bfqj
  );
 
 -- 如果计数器达到 10,000,提交事务并重新开始新事务
  IF count_num=10000 THEN
     COMMIT;
     START transaction;
     SET count_num=0;
  END IF;
  END LOOP read_loop;
  
  -- 提交剩余的事务
   COMMIT;
   
  -- 关闭游标
    CLOSE cur_sel;
END
//
 
delimiter ;
greatsql>
greatsql> CALL test_sp_t1(20250301);

四、总结

改造后的存储过程相较于原存储过程有以下几个优势:

1. 分批次提交事务

  • 原存储过程:在整个操作完成后才提交事务,这意味着在处理大量数据时,事务会占用大量资源,可能导致锁争用、内存占用过高等问题。
  • 改造后存储过程:每处理10000条记录后提交一次事务,减少了单次事务的数据量,降低了锁争用和内存占用,提高了系统的并发性和稳定性。

2. 游标的使用

  • 原存储过程:使用简单的INSERT INTO ... SELECT语句一次性插入所有数据,如果数据量非常大,可能会导致内存溢出或性能下降。
  • 改造后存储过程:使用游标逐条处理数据,适合处理大数据量的场景,能够更好地控制内存使用和性能。

3. 灵活性

  • 改造后存储过程:通过游标和分批次提交的方式,可以更灵活地处理不同规模的数据集,避免了单次操作数据量过大带来的问题。

4. 性能优化

  • 改造后存储过程:通过减少单次事务的数据量和分批提交,减少了数据库的锁争用和内存占用,从而提高了整体性能,特别是在高并发环境下。

5. 可维护性

  • 改造后存储过程:通过使用游标和分批次提交,代码结构更加清晰,便于后续的维护和优化。

​

总之,改造后的存储过程在处理大数据量时具有更好的性能、稳定性和可维护性。通过分批次提交事务、使用游标逐条处理数据以及优化事务提交策略,能够有效降低系统资源的占用,提高并发处理能力,特别适合在高并发、大数据量的场景下使用。

【项目实战】接口性能调优之大事务优化 大事务,Large Transactions大事务,通常指的是涉及大量数据修改、多个表操作或者长时间运行的事务,在数据库系统中。 阅读详情

相关推荐

西门子S7-1200控制伺服/步进电机方法与接线(全)

西门子S7-1200控制伺服/步进电机方法与接线(全) 伺服/步进电机在非标自动化控制中十分常用,但作者发现在各类开源网站上很少有人做西门子1200PLC控制伺服/步进电机的教程,于是今天想着跟大家分享一下。 本文共分为一下几个四个内容。 文章目录西门子S7-1200控制伺服/步进电机方法与接线(全)前言一、准备二、接线1.PLC接线:2.伺服接线:3. 步进电机的接线:三、代码组态代码四、可能出现的问题 前言 工程控制常用到三项异步电机、直流电机等,但他们都无法准确的控制电机角度;于是有了步进电机、

weixin_46060068的博客 7万+

大型企业中复杂数据库存储过程的修改方法:7步法教你高效完成任务

在企业的数据库中,根据不同的业务场景、统计需求、生产管理需要等,往往会有众多的存储过程。特别是在大型企业中,业务变化快,人员复杂,使得存储过程数量很多,不同代码编写风格有所差异等。最终导致存储过程修改困难。 一、示例 下面示例存储过程,每天对所有的宽带行进分类,生成日报供后续经营情况分析使用。 create or replace procedure prc_cm_kd_type ( ...

灰哥数据智能的专栏 1221

【PLIO学习总结】laserMapping中的时间戳与状态更新逻辑

本文仅用于个人学习总结记录。如有错误,请批评指正。

larrydong的博客 1648

mysql seconds_【华为云技术分享】MySQL Seconds_Behind_Master简要分析

Seconds_Behind_Master对于mysql主备实例,seconds_behind_master是衡量master与slave之间延时的一个重要参数。通过在slave上执行"show slave status;"可以获取seconds_behind_master的值。原始实现Definition:The number of seconds that the slave SQL thre...

weixin_42497299的博客 300

【医学影像】超声(UltraSound)影像的增强与目标检测

文章目录1 综述1.1 超声发展简史1.2 超声类型2 超声影像的去噪与增强2.1 各向异性扩散去噪模型2.2 色彩恢复的视网膜增强算法SSR和MSR2.3 MSRCR增强算法(基于MSR算法改进版)2.4 参考文献3 超声影像的目标识别3.1 基于跨模态数据迁移进行DL训练3.2 参考文献 1 综述 因工作需要,最近调研了超声(UltraSound)影像的相关知识,包含超声类型、超声影像的去噪和增强,目标检测等,并对相关资料文献进行梳理整合。 本人另外一篇博文主要讲了UltraSound 影像与CT/MR

muyijames的博客 1万+

基于STM32单片机设计的智能水温控制系统

本项目研究并实现了一种基于STM32单片机的智能水温控制系统。系统以STM32F103RCT6作为主控制器,通过DS18B20温度传感器实时采集水温数据,利用PID控制算法精确调节5V直流防水型70W加热棒的功率输出,确保水温恒定在设定范围内。此外,采用OLED显示屏显示当前水温和预设上限阀值,并集成ESP8266-WiFi模块与自研Android手机APP进行远程通信和控制。用户可通过本地按键或手机APP设置温度阀值,实现实时监控与智能化管理。整个系统设计旨在提高水资源利用效率,提升生活及工业用水环境的舒

8790

车金融|我在M公司的那两年

回顾那段公司的工作经历,经过两年多时间的洗礼,我觉得最大的收获就是遇到一位好老板,得以器重与栽培。自委以重任后,带领金融产品团队进行了一系列的系统重构和改造优化工作,重新塑造了一系列车金融相关业务核心系统,从而从根本上改善原来的糟糕面貌,根除了一系列诟病和问题,为业务长期发展奠定坚实基础。 温馨提示:全文共计4600余字,乃上班地铁途中码字编写,实属不易,感谢关注。起草于2020年11月16日,终稿于2020年12月5日。 车金融|金融产品中心的前世今生 车金融|GPS审核系统的前世今生 车金融|基础.

秋夜无霜 558

Detector-Free SfM 项目复现完整指南:从环境搭建到代码解析与可视化

本文提供了Detector-Free SfM项目的完整复现指南,涵盖技术背景、环境配置、代码解析和可视化方案。重点包括: 技术背景:Detector-Free SfM通过两阶段策略(粗重建+迭代精化)解决了传统SfM在弱纹理区域的瓶颈问题,采用深度学习匹配器替代传统特征点检测。 环境配置: 详细硬件要求与推荐配置(GPU/CPU/内存) 完整的Ubuntu系统设置步骤 Conda环境创建与依赖安装流程 关键组件安装指南(PyTorch、COLMAP等) 常见错误解决方案 项目特点: 支持多种Detector

huanghm88的专栏 121

故障分析 | 如何通过 blktrace 排查磁盘异常?

作者:张昊DBA,主要负责 MySQL 故障处理、DMP 产品支持,擅长 MySQL。本文来源:原创投稿* 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。1背景描述客户业务反馈经常出现运行效率低的情况希望我们从数据库进行排查,之前已经定位到是磁盘问题,但是当时没有继续深入排查。详细背景:技术分享 | 客户说 insert 慢,我该怎么办2日志分析2.1 慢日志分析发现...

杨建荣的学习笔记 932

2026 企查查/天眼查:IP频率限制 + 验证码策略,企业工商数据采集实战

企业工商数据采集技术解析与解决方案 本文深度剖析了2026年企查查和天眼查平台的反爬机制与技术对抗方案。主要内容包括: 反爬机制分析: 采用JA4+ TLS指纹识别、极验v6验证码等多层防护 IP限制策略严格区分未登录/普通/VIP账号 精准识别并封禁数据中心IP 核心解决方案: 构建高可用住宅代理池,动态轮换真实用户IP 基于YOLOv8的验证码缺口识别技术(准确率99%) 分布式架构设计,支持千万级数据采集 多账号池管理与行为模拟技术 技术亮点: 动态住宅IP池实现1%以下封禁率 Playwright浏

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1327

天龙八部TLBB系列 - 网单用数据库修改为其他门派

专注于Android/Unity和各种游戏开发技巧,以及各种资源分享(网站、工具、素材、源码、游戏等) --- 天龙八部修改门派

空名先生 9430

使用FORALL + BULK COLLECT来批量插入优化大事务

开发人员找到我说,报表系统中有一个存储过程最近总是报错ORA-02050:transaction .. . rolled back,some remote DBs may be in-doubt。 根据错误信息可知,可能是由于远程数据库处理失败,导致事务失败而回滚。原因可能是网络不稳定,也可能是remote节点的连接超时,也有可能被kill了等。 系统室负责人说了,公司的网络绝对没问题,报错肯定...

mqcLuck 1192

Python从0到100完整学习指南(必看导航)

想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、 计算机视觉、机器学习、神经网络以及人工智能相关知识,成为学业升学和工作就业的先行者!

拥有百余位万粉技术博主、200余位可合作代发博主,私域技术社群规模达千人,商务合作私信 6万+

如何处理SQL Server事务复制中的大事务操作

如何处理SQL Server事务复制中的大事务操作事务复制的工作机制事务复制是由 SQL Server 快照代理、日志读取器代理和分发代理实现的。快照代理准备快照文件(其中包含了已发布表和数据库对象的架构和数据),然后将这些文件存储在快照文件夹中,并在分发服务器中的分发数据库中记录同步作业。日志读取器代理监视为事务复制配置的每个数据库的事务日志,并将标记为要复制的事务从事务日志复制到分发数据库中,...

weixin_34387468的博客 425

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

存储过程编写经验和优化措施

  一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。     二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,就会遇...

weixin_30684743的博客 66

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

存储过程优化

存储过程编写经验和优化措施 来自http://www.cnblogs.com/sangrei/archive/2007/06/07/774469.html 一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。     二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会

Hello,everybody!Here is lonison 770

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

关于存储过程优化

存储过程编写经验和优化措施 阅读提示:本文介绍MS SQL的存储过程编写经验和优化措施 一、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。  二、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系统维护困难和大

chinaly的专栏 613

Oracle存储过程编写经验和优化措施

一、前言 在经过一段时间的存储过程开发之后,写下了一些开发时候的小结和经验与大家共享,希望对大家有益。 二、适合读者对象 数据库开发程序员,数据库的数据量很多,涉及到对SP(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。 三、介绍 在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作。如果项目的SP较多,书写又没有一定的规范,将会影响以后的系...

程序猿麦小七 2318

存储过程编程经验(转贴)

一、前言:在经过一段时间的存储过程开发之后,写下了一些开发时候的小结和经验与大家共享,希望对大家有益,主要是针对sybase和sql server数据库,但其它数据库应该有一些共性。 二、适合读者对象:数据库开发程序员,数据库的数据量很多,涉及到对sp(存储过程)的优化的项目开发人员,对数据库有浓厚兴趣的人。 三、介绍:在数据库的开发过程中,经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用

在水一方 853
上一篇: 在Oracle到GreatSQL迁移中排序规则改变引发的乱码问题分析及解决
下一篇: MySQL派生条件下推优化导致自定义变量结果错误问题分析
GreatSQL社区
博客等级 码龄5年 1210粉丝 390原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值