精华内容
下载资源
问答
  • 编译SQLINSERT语句有助于加快速度。这也需要更多的努力来支撑一切,防止可能的注射,因为现在一切都在你的肩上...从非编译的事务插入到已编译的事务插入,对于我的大型(200 K+条目)来说,速度大约提高了3倍(每插入2m...

    编译SQLINSERT语句有助于加快速度。这也需要更多的努力来支撑一切,防止可能的注射,因为现在一切都在你的肩上。

    另一种也可以加快速度的方法是缺乏文档的android.database.DatabaseUtils.InsertHelper类。我的理解是,它实际上包装了编译好的INSERT语句。从非编译的事务插入到已编译的事务插入,对于我的大型(200 K+条目)来说,速度大约提高了3倍(每插入2ms到每插入0.6ms),但简单的SQLite插入。

    样本代码:SQLiteDatabse db = getWriteableDatabase();//use the db you would normally use for db.insert, and the "table_name"//is the same one you would use in db.insert()InsertHelper iHelp = new InsertHelper(db, "table_name");//Get the indices you need to bind data to//Similar to Cursor.getColumnIndex("col_name");                 int first_index = iHelp.getColumnIndex("first");int last_index = iHelp.getColumnIndex("last");try{

    db.beginTransaction();

    for(int i=0 ; i

    {

    //need to tell the helper you are inserting (rather than replacing)

    iHelp.prepareForInsert();

    //do the equivalent of ContentValues.put("field","value") here

    iHelp.bind(first_index, thing_1);

    iHelp.bind(last_index, thing_2);

    //the db.insert() equilvalent

    iHelp.execute();

    }

    db.setTransactionSuccessful();}finally{

    db.endTransaction();}db.close();

    展开全文
  • H2数据库连接缓慢,无响应

    千次阅读 2017-11-23 17:53:13
    项目中遇到h2数据库800M后页面无响应,用Dbever工具连接h2数据库文件没有任何异常,仔细查询项目代码后发现是因为我们首页有糟糕的sql,在数据量大时耗时3分钟以上,默认h2是单线程模式,在有耗时sql执行时,所有...

    jdbc:h2:tcp://localhost:9092/D:/db;MULTI_THREADED=1;DB_CLOSE_ON_EXIT=FALSE;MVCC=TRUE

    项目中遇到h2数据库800M后页面无响应,用Dbever工具连接h2数据库文件没有任何异常,仔细查询项目代码后发现是因为我们首页有糟糕的sql,在数据量大时耗时3分钟以上,默认h2是单线程模式,在有耗时sql执行时,所有后续查询都排队等候导致页面长时间无响应

    可加入以下参数解决,后两个可根据需要取舍;

    MULTI_THREADED:默认下为0(禁用),也就是说无论你连接池开多大,sql执行都是单线程串行执行,当有一个耗时sql执行时,其他连接的sql一样要等候,改为1开启多线程模式,不会导致耗时sql影响其他查询,不过文档描述此参数目前是实验性的,稳定性还不得而知


    DB_CLOSE_ON_EXIT:退出时关闭数据库默认为TRUE,默认值存在的问题是当程序退出时可能会有一些日志记录,或者清理数据库的操作,此时数据库先关闭会报错:database already closed!


    MVCC=TRUE:多版本并发控制,默认为false,开启后并发更新不会采用老式的加写锁模式,会改为读锁,更新的操作都会带着自己要更新的值与更新前值的版本号,当版本号对应时更新成功同时修改值对应的版本号,其他并发的数据再来时因为所持有的版本号已经不对应,所以会更新失败,类似于java的乐观锁机制,目的就是容忍小部分的失败换取更大的吞吐量(没有锁的上下文切换换耗时)

    展开全文
  • 一般情况下mysql上百万数据读取和插入更新是没什么问题了,但到了上千万级就会出现很慢,下面我们来看mysql千万级数据库插入速度和读取速度的调整记录吧。     (1)提高数据库插入性能中心思想:尽量将数据一...

    一般情况下mysql上百万数据读取和插入更新是没什么问题了,但到了上千万级就会出现很慢,下面我们来看mysql千万级数据库插入速度和读取速度的调整记录吧。

     

     

    (1)提高数据库插入性能中心思想:尽量将数据一次性写入到Data File和减少数据库的checkpoint 操作。这次修改了下面四个配置项: 
    1)将 innodb_flush_log_at_trx_commit 配置设定为0;按过往经验设定为0,插入速度会有很大提高。

    0: Write the log buffer to the log file and flush the log file every second, but do nothing at transaction commit. 
    1:the log buffer is written out to the log file at each transaction commit and the flush to disk operation is performed on the log file 
    2:the log buffer is written out to the file at each commit, but the flush to disk operation is not performed on it 
    2)将 innodb_autoextend_increment 配置由于默认8M 调整到 128M

    此配置项作用主要是当tablespace 空间已经满了后,需要MySQL系统需要自动扩展多少空间,每次tablespace 扩展都会让各个SQL 处于等待状态。增加自动扩展Size可以减少tablespace自动扩展次数。

    3)将 innodb_log_buffer_size 配置由于默认1M 调整到 16M

    此配置项作用设定innodb 数据库引擎写日志缓存区;将此缓存段增大可以减少数据库写数据文件次数。

    4)将 innodb_log_file_size 配置由于默认 8M 调整到 128M

    此配置项作用设定innodb 数据库引擎UNDO日志的大小;从而减少数据库checkpoint操作。

    经过以上调整,系统插入速度由于原来10分钟几万条提升至1秒1W左右;注:以上参数调整,需要根据不同机器来进行实际调整。特别是 innodb_flush_log_at_trx_commit、innodb_log_buffer_size和 innodb_log_file_size 需要谨慎调整;因为涉及MySQL本身的容灾处理。

    (2)提升数据库读取速度,重数据库层面上读取速度提升主要由于几点:简化SQL、加索引和分区; 经过检查程序SQL已经是最简单,查询条件上已经增加索引。我们只能用武器:表分区。

    数据库 MySQL分区前准备:在MySQL中,表空间就是存储数据和索引的数据文件。 
    将S11数据库由于同享tablespace 修改为支持多个tablespace;

    将wb_user_info_sina 和 wb_user_info_tx 两个表修改为各自独立表空间;(Sina:1700W数据,2.6G 大数据文件,Tencent 1400W,2.3G大数据文件); 
    分区操作: 
    将现有的主键和索引先删除 
    重现建立id,uid 的联合主键 
    再以 uid 为键值进行分区。这时候到/var/data/mysql 查看数据文件,可以看到两个大表各自独立表空间已经分割成若干个较少独立分区空间。(这时候若以uid 为检索条件进行查询,并不提升速度;因为键值只是安排数据存储的分区并不会建立分区索引。我非常郁闷这点比Oracle 差得不是一点半点。) 
    再以 uid 字段上进行建立索引。再次到/var/data/mysql 文件夹查看数据文件,非常郁闷地发现各个分区Size竟然大了。MySQL还是老样子将索引与数据存储在同一个tablespace里面。若能index 与 数据分离能够更加好管理。

    经过以上调整,暂时没能体现出系统读取速度提升;基本都是在 2~3秒完成5K数据更新。

    MySQL数据库插入速度调整补充资料:

    MySQL 从最开始的时候 1000条/分钟的插入速度调高至 10000条/秒。 相信大家都已经等急了相关介绍,下面我做调优时候的整个过程。提高数据库插入性能中心思想: 
    1、尽量使数据库一次性写入Data File 
    2、减少数据库的checkpoint 操作 
    3、程序上尽量缓冲数据,进行批量式插入与提交 
    4、减少系统的IO冲突

    根据以上四点内容,作为一个业余DBA对MySQL服务进行了下面调整: 
    修改负责收录记录MySQL服务器配置,提升MySQL整体写速度;具体为下面三个数据库变量值:innodb_autoextend_increment、innodb_log_buffer_size、innodb_log_file_size;此三个变量默认值分别为 5M、8M、8M,根据服务器内存大小与具体使用情况,将此三只分别修改为:128M、16M、128M。同时,也将原来2个 Log File 变更为 8 个Log File。此次修改主要满足第一和第二点,如:增加innodb_autoextend_increment就是为了避免由于频繁自动扩展Data File而导致 MySQL 的checkpoint 操作; 
    将大表转变为独立表空并且进行分区,然后将不同分区下挂在多个不同硬盘阵列中。

    完成了以上修改操作后;我看到下面幸福结果:

    获取测试结果: 
    Query OK, 2500000 rows affected (4 min 4.85 sec) 
    Records: 2500000 Duplicates: 0 Warnings: 0 
    Query OK, 2500000 rows affected (4 min 58.89 sec) 
    Records: 2500000 Duplicates: 0 Warnings: 0 
    Query OK, 2500000 rows affected (5 min 25.91 sec) 
    Records: 2500000 Duplicates: 0 Warnings: 0 
    Query OK, 2500000 rows affected (5 min 22.32 sec)

    Records: 2500000 Duplicates: 0 Warnings: 0 
    最后表的数据量: 
    +------------+ 
    count(*) | 
    +------------+ 
    | 10000000| 
    +------------+ 
    从上面结果来看,数据量增加会对插入性能有一定影响。不过,整体速度还是非常面议。一天不到时间,就可以完成4亿数据正常处理。预计数据库瓶颈已经被巧妙解决,结果变成程序“猿”苦逼地向我埋怨,大哥不用这么狠啊。

    展开全文
  • 文章目录Python连接DB2使用ibm_db和ibm_db_sa两个包使用ibm_db_sa和sqlalchemy两个包Python处理插入数据库报数据类型不一致问题Python执行SQL语句成功但是数据库没有数据Python插入大体量数据时到一定数量崩溃 ...

    Python连接DB2

    IBM的DB2数据库用python做连接真的不是一般的麻烦,一个是因为这个数据库并不是现在主流的数据库,另一方面是因为Sqlalchemy没有在其内部代码中加入此方法,所以导致连接特别麻烦。通过查阅官方的帮助文档和CSDN上的一些教程,整理出了以下两种连接方法:

    使用ibm_db和ibm_db_sa两个包

    1. 安装两个包
    pip install ibm_db
    pip install ibm_db_sa
    
    1. 使用以下代码即可创建连接
    import ibm_db,ibm_db_dbi
    
    x=ibm_db.connect("DATABASE=KOALA;HOSTNAME=BTPROD.LENOVO.COM;PORT=50001;PROTOCOL=TCPIP;UID=xux17;PWD=*****","","")
    conn2=ibm_db_dbi.Connection(x)
    

    使用此方法可以执行原生SQL语句,但是没有办法和pandas包直接进行使用,如果要使用pandas的read_sql方法,更推荐下面那种方法。但是如果是想要进行数据转储,使用这种方法,可以考虑使用游标,依次批量读取数据。

    x=ibm_db.connect("DATABASE=KOALA;HOSTNAME=BTPROD.LENOVO.COM;PORT=50001;PROTOCOL=TCPIP;UID=xux17;PWD=***;","","")
    
    conn2=ibm_db_dbi.Connection(x)
    
    sql="SELECT * FROM PC_KPI.PC_INCIDENT_ROOT"
    
    conn1=pymssql.connect(host='10.103.66.45',port=1444,user='sa',password='****,database='Integration')
    cor1=conn1.cursor()
    cor2=conn2.cursor()
    d=cor2.execute(sql)
    data=cor2.fetchmany(1000)
    sql2="""
    INSERT INTO [dbo].[PC_KPI.PC_INCIDENT_ROOT2]
               ([INCIDENT_ID]
               ,[MACHINE_TYPE]
               ,[SERIAL_NBR]
               ,[COUNTRY_CODE]
               ,[CLAIM_NBR]
               ,[SERVICE_DELIVERY_TYPE]
               ,[ENTITLEMENT_TYPE]
               ,[CLAIM_CREATE_TS]
               ,[CLAIM_STATUS]
               ,[CLAIM_CLOSE_TS]
               ,[CLOSE_CODE]
               ,[SEVERITY]
               ,[RES_TYPE_DESC]
               ,[RES_CAT_DESC]
               ,[RES_PROB_DESC]
               ,[RES_RSLT_DESC]
               ,[CALL_RCVD_TYPE])
         VALUES
         (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)
    """
    i=1
    while data:
        cor1.executemany(sql2,data)
        conn1.commit()
        print('process %drows'%(i*1000))
        i+=1
        data=cor2.fetchmany(1000)
    

    使用ibm_db_sa和sqlalchemy两个包

    使用这种方法的好处是可以直接将读取的数据使用pandas进行处理,方便后续的分析和数据处理。但是由于sqlachemy本身并没有内置此接口,因此安装完包后需要进行一定的处理:

    1. 安装以下包
    pip install ibm_db,ibm_db_sa
    
    1. 我的是python3.6,可以直接使用sqlalchemy创建连接,如果你的不可以,可以参考这个链接,进行配置
    import imb_db_sa
    from sqlalchemy import create_engine
    import pandas as pd
    
    DB_CONNECT_STRING1 = 'ibm_db_sa://sa:1qaz2wsx!@10.103.66.45:1444/integration?charset=utf8'
    engine1 = create_engine(DB_CONNECT_STRING1, echo=False)
    DB_Session1 = sessionmaker(bind=engine1)
    session1 = DB_Session1()
    

    Python处理插入数据库报数据类型不一致问题

    最近在做数据集市的过程中,经常发现进来的数据不规范,各列的数据类型极其不一致。导致这个问题的原因主要是因为前期数据生成时没有做好数据规范,这就使得后期进行分析的数据经常报各种错误。Python对于从数据源中读取的数据,会根据前期的数据给定该列的数据类型,但是极有可能在读取的数据中,含有不属于该列的数据类型,比如在日期型的数据列中包含了数字型,这就会导致在后期插入数据库时,报类型类型转换错误,从而使得数据插入失败。对于以上问题,有以下集中解决方法:

    1. 逐行插入,这样在数据报错的过程中也找到了错误行,可以针对性的进行修改并在此行重新开始插入。缺点就是需要一直盯着程序
    2. 在插入前进行数据排查,查看是否有奇异值,从而进行修改和更新。这个方法如果分析到位,可以直接完成自动化,省去了人工转换。但是需要分析者对数据和业务有足够的了解,不然无法进行排查
    3. 将所有字段在to_sql中都指定类型为varchar,这样即便有奇异值也不会报错,可以较轻松的完成数据插入,而且对于数据库中也不会影响大多数字段的分析。但是对于日期型的数据,不建议这样操作,因为之后如果需要进行时间比较,这样的数据还是会报错的

    Python执行SQL语句成功但是数据库没有数据

    在用python执行SQL的时候,出现了一种特殊的情况:使用sqlalchemy创建的就连接器出现了这种问题:

    1. 执行原生SQL的insert语句会程序会显示插入进度,但是程序结束后数据库没有数据
    2. drop掉表后,使用原始SQL into语句将查询结果直接保存为表格不会报错,数据有保存

    查阅了很多博客和资料后,没有发现解决方法。有说法说执行原生SQL语句结束后需要进行commit之后才会生效,但是sqlalchemy并没有commit方法,而且如果是这样的话,不会出现我的第二种情况。

    针对这个问题,我的解决方法是:

    1. 使用pandas的read_sql先接收一遍查询的结果数据,然后使用to_sql做一遍插入。缺点是这样会导致数据插入数据库缓慢,而且会比较占程序内存
    2. 使用数据库原生的包创建连接,比如pymssql创建SQLserver的连接,这样执行SQL之后commit会生效。缺点是没办法很好的跟pandas进行结合

    Python插入大体量数据时到一定数量崩溃

    在对公司数据进行数据集市建立的时候,发现使用Python进行不同种类数据库的数据迁移时,程序在处理到一定数据量之后Python会直接崩溃。针对这个问题,一直没有找到很好的解决方法,毕竟如果是数据问题,应该是报数据类型转换错误,而不是直接Python崩溃;如果是数据体量过大,那么我之前插入的几百万的数据应该更早的会崩溃。

    个人总结出现这个情况的有可能的几个原因:

    1. 数据中有特殊的数据错误,比如我的转换一直出错,是因为DB2和sqlserver涉及到24点和0点的时间转换不一致。这样的数据不是错误数据类型,但是会导致数据无法转换。要完成插入,只能直接转换成字符串,但是最后还是免不了要解决这个问题
    2. 可能是Python进程过多,导致程序冲突崩溃
    展开全文
  •  23、如果要插入大的二进制值到Image列,使用存储过程,千万不要用内嵌INsert来插入(不知JAVA是否)。因为这样应用程序首先将二进制值转换成字符串(尺寸是它的两倍),服务器受到字符后又将他转换成二进制值.存储过程...
  • 大事务造成线上insert插入缓慢 问题描述 最近有用户反馈,线上很多订单下单特别慢,每天集中在早上9-10点钟,我跟踪生产tomcat日志,发现一段insert sql执行时间大概要60s的样子。怀疑应该是生产有大事务执行导致表...
  • SpringBoot 集成 ShardingSphere 实现数据库批量插入
  • 1)Web.config中添加连接数据库的语句 ...2)在表现层Default.aspx.cs中添加多条需要插入数据库的数据。 public void Add()  {  List modellist = new List();  modellist.Add(new Maticsoft.Model.ClassDemo("张三
  • 目前的业务是处理千万级的数据,将里面的字段拆分出来,插入到新表中,新表中的数据可能会过亿,在前期使用MySqlBulkLoader插入的时候,速度非常快,插入十万条数据少于1s,但是后期插入速度就非常缓慢了,插入十万...
  • 比如在java代码里面插入的时间是:2019-05-07 17:29:56 但是在数据库里面显示的时间却是:2019-05-07 09:29:56 原因 因为时区设置的问题。 UTC代表的是全球标准时间 ,但是我们使用的时间是北京时区也就是东八区,...
  • 很多时候为了测试数据库设计是否恰当,优化SQL语句,需要在表中插入大量的数据,怎么插入大量的数据就是个问题了。 最开始想到的办法就是写一个程序通过一个很大的循环来不停的插入,比如这样: 1 2 3...
  • postgres数据库大批量单表导入数据引发性能故障 因公司经营管理策略原因,我们地区部门还是以开发外包和产品服务为主,对测试外包服务销售工作要求占比不高,而测试部门本来有四五个性能测试人员,加上老员工都比较...
  • 目前有一个需求,用户需要在短时间内将几万条数据导入 MSSQL 数据库。 如果有一条无法导入,需要知道是哪条数据出的错。 导入之前最好还要根据条件验证一下数据是否存在,存在就删除。 现在我一条一条判断...
  • MySQL查询卡顿排查问题描述数据库排查查看慢查询日志基于慢查询日志查看结果的思考排除疑惑,确定排查方向关于 MyISAM 表的锁机制与分析MyISAM 表的锁机制一些有助于排查的语句SHOW STATUS LIKE 'table%'SHOW OPEN ...
  • title: SQLServer · 最佳实践 · 透数据库实现大容量插入的几种方式 author: 石沫 背景 很多用户在使用阿里云云数据库SQL Server时,为了加快插入速度,都尝试使用大容量插入的方式,大家都知道,对于完整恢复模式...
  • 公司有一个项目,需要频繁的插入数据到MySQL数据库中,设计目标要求能支持平均每秒插入1000条数据以上。目前功能已经实现,不过一做压力测试,发现数据库成为瓶颈,每秒仅能插入100多条数据,远远达不到设计目标。 ...
  • 今天讨论的内容是冷热分离,也许概念并不陌生,对其使用场景也比较熟悉,但涉及...比如业务员多次查询时,数据库的 CPU 会立马狂飙,服务器线程也降不下来。 当时,我们尝试了优化表结构、业务代码、索引、SQL 语句等.
  • 数据库

    2017-08-18 08:26:17
    数据库 锁定 本词条由“科普中国”百科科学词条编写与应用工作项目审核。 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十...
  • 1.新建数据表 我们知道最直接最简单的方法就是把该表的数据量变小,那么把表数据变少有什么办法呢?最简单最直接的方法就是再...如果在开始创表时分区就好多了,因为如果你想在插入很多数据以后的表中分区,这就复杂...
  • (1、首先明确一点,如果每条数据需要一秒的时间,假如是一亿条数据至少需要2年左右,意味着你两年都不能使用这个数据库,在现实生活中,你认为可能这样做吗? 2、解决这类问题的最好办法就是:时间换空间,例如:...
  • 原因是MySQL 8.0一些设置是默认开启的(5.7是默认关闭的),而这些设置有可能会严重影响数据库性能。 本题中,影响插入效率的因素是,8.0默认开启了 log-bin 功能,在确定不用不到该功能的前提下,只要在配置中关闭...
  • 使用Java代码对HBASE数据库进行查询期间没有报错,但就是不管为查询多少条数据都是花了20s 在 hbase-env.sh文件里面加了下面配置: export JAVA_HOME=/usr/local/jdk1.8 export HBASE_MANAGES_ZK=true 在hbase-site...
  • 上一篇聊到过,冷热分离解决方案的性价比高,但它并不是一个最优的方案,仍然存在诸多不足,比如:查询冷数据慢、业务无法再修改冷数据、冷数据多到... 原文链接:数据库表数据量大读写缓慢如何优化(2)【查询分离】
  • redis非关系型数据库详解

    万次阅读 2021-02-26 17:03:34
    不一定遵循传统数据库的一些基本要求,比如说,不遵循sql标准,事务,表结构等等,redis严格上不是一种数据库,应该是一种数据结构化存储方法的集合。 redis提供了一堆操作方法【一堆命令操作数据】,我们使用这些...
  • 症状:在大量PDB(可插拔数据库)驻留(例如超过200个)的多租户数据库中,以下字典表报告具有明显不佳的性能:cdb_free_space,cdb_data_files,cdb_temp_files,cdb_free_space,gv$sort_segment,cdb_undo_...
  • 问题: 用mybatis批量插入近200条的数据大概用时5s!...数据库连接参数配置了rewriteBatchedStatements=true最终得以解决! 经过测试速度达到了毫秒级别, 100000条数据的情况下也控制在20s以下! ...
  • 公司有一个项目,需要频繁的插入数据到MySQL数据库中,设计目标要求能支持平均每秒插入1000条数据以上。目前功能已经实现,不过一做压力测试,发现数据库成为瓶颈,每秒仅能插入100多条数据,远远达不到设计目标。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,354
精华内容 6,141
关键字:

数据库插入缓慢