数据库操作,需要执行1000条SQL语句。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库操作,需要执行1000条SQL语句。相关的知识,希望对你有一定的参考价值。

数据库操作,需要执行1000条SQL语句,其中包括update、insert、select,怎样执行这1000条语句效率比较高?
有1000条SQL语句需要执行。
1方案、连接数据库,执行1条SQL语句,断开连接。再连接数据库,执行1条……,如此反复将1000条语句执行完毕。(断开式连接)
2方案、连接数据库,执行1条SQL语句,执行下一条SQL语句,执行完1000条,断开连接。(长连接)

数据库有1000万条数据,我执行这1000条语句经常遇到超时的情况。目前是按照第1种方案写的代码。
目前想更改为第2种方案。
怎么去执行这1000条语句,才能更高效呢?
目前程序多个模块使用的情况下,在瞬时能提交七八千条SQL命令到数据库。所以程序经常提示数据库超时时间已到的异常。

如果这些数据库操作是有规律的,按规律性编写一句或几句SQL语句然后运行,如果不能办到,那么也可以编写一段程序逐条执行这些数据库操作。
如果这1000条数据库操作无规律可言,那么没有捷径可走,只能一条一条地去执行了。
参考技术A

    SQL 关键字 循环 While

    SQL 如下:

    declare @Sum int,@Start int

    set @Sum=1000

    set @Start=0

    while (@Start<@Sum)

    begin

      -- 执行需要的SQL 语句

       set @Start=@Start+1

    end

参考技术B 不是太明白你这个问题,怎么样算是执行效率比较高?你期望看到什么效果?现在是什么情况?

按照你补充的信息来看,第一种方案肯定是不行的。 没有这么做的。你现在的问题是遇到了超时的问题。解决方案应该是
1 定期提交,不要等到1000条全执行完再提交,而是分批提交
2 设置sqlnet的参数,增大超时时间,避免超时问题
参考技术C 自己对语据进行优化呀.

日志系统:一条SQL更新语句是如何执行的

一条查询语句一般经过连接器、分析器、优化器、执行器等模块,最后到达存储引擎。
一条更新语句也需要经连接器连接数据库、分析器会通过词法和语法解析知道这是一条更新语句、优化器决定要使用的索引、然后执行器执行负责具体执行,找到这一行,然后更新。

更新语句和查询语句不一样的是,更新流程还涉及两个重要的日志模块,redo log(重做日志) 和 binlog (归档日志)。

MySQL 写 redo log 使用的是 WAL (Write-Ahead Logging)先写日志再写磁盘。

一条记录需要更新的时候,InnoDB 引擎会先把记录写到 redo log 里面,并更新内存,这个更新就完成了,同时,InnoDB 引擎会在适当的时候将操作记录更新到磁盘里面。这个更新往往实在系统比较空闲的时候,redo log 写满的时候也会更新到磁盘里面。

Innodb 的 redo log 是固定大小的,从头开始写,写到末尾就又回到开头循环写。

redo log 和 binlog 不同点
1,redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎都可以使用。
2,redo log 是窝里日志,记录的是 “在某个数据页上做了什么修改” ;binlog 是逻辑日志,记录的是这个语句的原始逻辑
3,redo log 是循环写的,空间固定会用完;binlog 是可以追加写的。

执行器和 InnoDB 引擎在执行简单 Update 语句时的内部流程(实例和执行流程图)

binlog 和 redo log 使用的是两阶段提交

不是用两阶段提交的后果

redo log 用于保证 crash-safe 能力, innodb_fiush_log_at_trx_commit 这个参数设置成 1 的时候,表示每次事务的 redo log 都直接持久化到硬盘,这个值设置成 1 ,可以保证 MySQL 异常重启之后数据不丢失

sync_binlog 这个参数设置成 1 的时候,表示每次事务 binlog 都持久化到硬盘,可以保证 MySQL 异常重启之后 binlog 不丢失。

两阶段提交是跨系统维持数据逻辑一致性时常用的一个方案

以上是关于数据库操作,需要执行1000条SQL语句。的主要内容,如果未能解决你的问题,请参考以下文章

SQLSever--事务与索引

sql语句查询如何显示第一条数据

如何多条SQL语句执行?

oracle 我有1000条查询语句,通过执行每一条sql语句,返回所有的查询结果为空的记录,能实现吗?

mysql增删改查语句

MSYQL操数据DML