精华内容
下载资源
问答
  • 分表的看另一篇文章。 2、然后,需求变了,卧槽~~~需求又变了!!!不用分表了,需要把所有的分表数据,插入一张中。当然,这所有的字段要求一致。 ///稍等,待会再写,先写一篇,如果不用分布式,处理...

    前提条件&产生问题原因:

    1、由于数据量比较大,又没有使用hadoop等方式处理数据。所以使用分表的形式。分表的看另一篇文章。

    2、然后,需求变了,卧槽~~~需求又变了!!!不用分表了,需要把所有的分表数据,插入到一张表中。当然,这所有表的字段要求一致。


    ///稍等,待会再写,先写一篇,如果不用分布式,处理大量数据的问题。

    //回来了写完了,


    package com.tujia.ecd.table;
    
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.HashSet;
    import java.util.List;
    import java.util.Set;
    
    import org.junit.Before;
    import org.junit.Test;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    import org.springframework.jdbc.core.JdbcTemplate;
    import org.springframework.jdbc.core.PreparedStatementCreator;
    import org.springframework.jdbc.core.RowMapper;
    
    import com.tujia.ecd.entity.BabyProjects;
    
    
    public class ExaminationRemind {
    
    	//private JdbcTemplate localTemplate;
    	private JdbcTemplate onlineTemplate;
    	
    	@Before
    	public void setup(){
    		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    		//localTemplate = (JdbcTemplate) context.getBean("ecdItemRecordSlaverTemplate");
    		onlineTemplate = (JdbcTemplate) context.getBean("ecdItemRecordSlaverTemplate");
    		
    	}
    	
    	@Test
    	public void examinationRemind(){
    		
    		int tableNumByDocid = 512;
    		String tableNameByDocid = "baby_projects_odocid";
    		
    		int tableNumByProjectid = 512;
    		String tableNameByProjectid = "baby_projects_projectid";
    		
    		int tableNumByUid = 512;
    		String tableNameByUid = "baby_projects_uid";
    		
    		//int record_visit = 512;
    		//String record_visit_uid = "record_visit_uid";
    		
    		List<BabyProjects>  showList = new ArrayList<BabyProjects>();
    		
    		List<BabyProjects> showAllBabyProjectByDocid = showAllBabyProject(tableNameByDocid,tableNumByDocid);
    		List<BabyProjects> showAllBabyProjectByProjectid = showAllBabyProject(tableNameByProjectid,tableNumByProjectid);
    		List<BabyProjects> showAllBabyProjectByUid = showAllBabyProject(tableNameByUid,tableNumByUid);
    		
    		//List<BabyProjects> showAllrecord_visit = showAllBabyProject(record_visit_uid,record_visit);
    		
    		showList.addAll(showAllBabyProjectByDocid);//35
    		showList.addAll(showAllBabyProjectByProjectid);//1121
    		showList.addAll(showAllBabyProjectByUid);//1121
    		
    		System.out.println("查询出的数量是:"+showAllBabyProjectByUid.size()+"条");
    		
    		//List<BabyProjects> showAllRepeat = removeRepeat(showList);
    		
    		//System.out.println("去掉重复后的数量:"+showAllRepeat.size()+"条");
    		
    		addAll(showAllBabyProjectByProjectid);
    	}
    	
    	public List<BabyProjects> showAllBabyProject(final String tableName,final int tableNum){
    		List<BabyProjects>  showList = new ArrayList<BabyProjects>();
    		
    		for(int i=0;i<tableNum;i++){
    			 String tab = String.format(tableName+"_%02x",i);
    			 String sql = "select * from "+tab+" ";
    			 
    			 List<BabyProjects> oneTable = onlineTemplate.query(sql, new RowMapper<BabyProjects>(){
    
    					@Override
    					public BabyProjects mapRow(ResultSet rs, int num) throws SQLException {
    						BabyProjects babyProject = new BabyProjects();
    						babyProject.setProjectprice(rs.getString("projectprice"));
    						babyProject.setId(rs.getLong("id"));
    						babyProject.setProjectid(rs.getLong("projectid"));
    						babyProject.setProjectName(rs.getString("projectname"));
    						babyProject.setOdocid(rs.getLong("odocid"));
    						babyProject.setOtime(rs.getLong("otime"));
    						babyProject.setUid(rs.getLong("uid"));
    						babyProject.setRecordid(rs.getLong("recordid"));
    						//babyProject.setDocName(rs.getString(""));
    						babyProject.setTreatid(rs.getLong("treatid"));
    						babyProject.setHid(rs.getInt("hid"));
    						//babyProject.setProjectCode(rs.getString(""));
    						
    						
    						return babyProject;
    					}			
    				});
    			 showList.addAll(oneTable);
    		}
    		
    		return showList;
    	}
    	
    	public void addAll(final List<BabyProjects> listAll){
    		
    		for(final BabyProjects babyProject : listAll){
    			
    			final String sql = "insert into baby_projects (projectprice,id,projectid,projectname,odocid,otime,uid,recordid,treatid,hid,status) values(?,?,?,?,?,?,?,?,?,?,1)";
    			
    			onlineTemplate.update(new PreparedStatementCreator() {
    
    				@Override
    				public java.sql.PreparedStatement createPreparedStatement(
    						java.sql.Connection con) throws SQLException {
    					java.sql.PreparedStatement ps = con.prepareStatement(sql);
    					int i = 0;
    					ps.setString(++i, babyProject.getProjectprice());
    					ps.setLong(++i, babyProject.getId());
    					ps.setLong(++i, babyProject.getProjectid());
    					ps.setString(++i, babyProject.getProjectName());
    					ps.setLong(++i, babyProject.getOdocid());
    					ps.setLong(++i, babyProject.getOtime());
    					ps.setLong(++i, babyProject.getUid());
    					ps.setLong(++i, babyProject.getRecordid());
    					ps.setLong(++i, babyProject.getTreatid());
    					ps.setLong(++i, babyProject.getHid());
    					
    					return ps;
    				}
    			});
    		}
    	}
    	
    	public List<BabyProjects> removeRepeat(final List<BabyProjects> listAll){
    		List<BabyProjects>  showList = new ArrayList<BabyProjects>();
    		Set<BabyProjects> h  = new HashSet<BabyProjects>(listAll); 
    		showList.addAll(h);
    		return showList;
    	}
    	
    	/*
    	 * public   static   void  removeDuplicate(List list)   { 
        HashSet h  =   new  HashSet(list); 
        list.clear(); 
        list.addAll(h); 
        System.out.println(list); 
    } 
    	 * 
    	 * public void addAll(List<BabyProjects> listAll){
    		
    		for(BabyProjects babyProject : listAll){
    			
    			templateSqlPrepare<BabyProjects> tsp =  (babyProject, "baby_projects");
    			localTemplate.update(tsp.getPreparedStatementCreator(tsp.getSqlForInsert()));
    		}
    	}*/
    
    }
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    恩,就是上面的代码,很多东西,都跟我写的另一篇,分表,重复了,所以,这里我就不多说了,偷懒一下~~。

    : p


    展开全文
  • sqlserver导出大量数据到Excel 记录导出数据遇到的坑~~~ sqlserver 导出数据到Excel最简单的方法是将查询出来的结果,右键–>另存为excel或者txt。但是这种方式的明显缺点,如果内容中有特殊的字符,往往会影响...

    sqlserver导出大量数据到Excel

    记录导出数据遇到的坑~~~
    sqlserver 导出数据到Excel最简单的方法是将查询出来的结果,右键–>另存为excel或者txt。但是这种方式有明显缺点,如果内容中有特殊的字符,往往会影响我们导出的excel准确性。比如有回车符的时候excel格式也会窜行,影响数据识读性。这就导致了我sql查询出的结果是2万条,但是实际导出的时候看行号却少了几百条。
    另一种方式更加标准化一些,利用sqlserver自带的导出功能。右键数据库–>任务–>导出数据–>指定数据源和目标文件。
    这里要注意一下,在指定文件的时候往往导出Excel文件后缀会默认为.xls,无论这里选择了97-03版本还是07版本,这里都是.xls。据观察.xls和.csv在存储相同数量的文件时,文档大小要远大于.xlsx。所以,在这里要手动调整一下文档的后缀名为.xlsx。这样在遇到“电子表满”的问题前可以存储更多的数据在这里插入图片描述(当然我的数据库是管理工具是2014版的,新版本可能没这个问题,不过我没有尝试。)
    上步操作可以增加导出数据的量,但是导出大量数据时往往会很慢,这时可以利用另一个操作。“编辑映射”
    在这里插入图片描述在这里插入图片描述 数据库导出时往往把一个很小的字段指定的类型非常长。这样会影响我们的导出速度,可以手动更改一下,比如讲Longtext改为varcha,并根据实际情况定义一下长度。这样会大大提高导出速度。
    导出数据条数和字段多少、长度都有关系,具体没有测试过它的极限,仍有可能因为大量数据导出时出现“电子表满”的情况,但是已经完美解决了我遇到的问题

    最后总结一点,其实前面巴拉巴拉的经验都没啥用,安装一个神器,百度SQLPrompt插件,查询后右键就能直接另存。。。

    展开全文
  • 一个小程序,由于数据库服务器容量有限,若长时间从拥有大量数据的数据库中读数据,无疑会给服务器带来很大负担,所以,应先将一个数据库中经常用到的数据统计到另一个数据库或另一个中,以后可以查询这些就可以了...
  • 这天xxx接到个需求,需要将A的数据迁移到表B中去做个备份。本想通过程序先查询查出来然后批量插入。但xxx觉得这样有点慢,需要耗费大量的网络I/O,决定采取别的方法进行实现。 通过在Baidu的海洋里遨游,他...

    Insert into select请慎用。

     

    这天xxx接到一个需求,需要将表A的数据迁移到表B中去做一个备份。本想通过程序先查询查出来然后批量插入。但xxx觉得这样有点慢,需要耗费大量的网络I/O,决定采取别的方法进行实现。

     

    通过在Baidu的海洋里遨游,他发现了可以使用insert into select实现,这样就可以避免使用网络I/O,直接使用SQL依靠数据库I/O完成,这样简直不要太棒了。

     

    然后他就被开除了。

     

    # 事故发生的经过。

     

    由于数据数据库中order_today数据量过大,当时好像有700W了并且每天在以30W的速度增加。

     

    所以上司命令xxx将order_today内的部分数据迁移到order_record中,并将order_today中的数据删除。

     

    这样来降低order_today表中的数据量。

     

    由于考虑到会占用数据库I/O,为了不影响业务,计划是9:00以后开始迁移,但是xxx在8:00的时候,尝试迁移了少部分数据(1000条),觉得没啥问题,就开始考虑大批量迁移。

    在迁移的过程中,应急群是先反应有小部分用户出现支付失败,随后反应大批用户出现支付失败的情况,以及初始化订单失败的情况,同时腾讯也开始报警。

     

    然后xxx就慌了,立即停止了迁移。

     

    本以为停止迁移就就可以恢复了,但是并没有。后面发生的你们可以脑补一下。

     

    # 事故还原

     

    在本地建立一个精简版的数据库,并生成了100w的数据。模拟线上发生的情况。

     

    建立表结构

     

    订单表

    ​​​​​​​

    CREATE TABLE `order_today` (    `id` varchar(32) NOT NULL COMMENT '主键',    `merchant_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商户编号',    `amount` decimal(15,2) NOT NULL COMMENT '订单金额',    `pay_success_time` datetime NOT NULL COMMENT '支付成功时间',    `order_status` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '支付状态  S:支付成功、F:订单支付失败',    `remark` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '备注',    `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',    `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间 -- 修改时自动更新',    PRIMARY KEY (`id`) USING BTREE,    KEY `idx_merchant_id` (`merchant_id`) USING BTREE COMMENT '商户编号'  ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
    
     

    订单记录表

    •  
    CREATE TABLE order_record like order_today;
    
     

    今日订单表数据

     

     

    模拟迁移

     

    把8号之前的数据都迁移到order_record表中去。

    INSERT INTO order_record SELECT      *   FROM      order_today   WHERE      pay_success_time < '2020-03-08 00:00:00';
    
     

    在navicat中运行迁移的sql,同时开另个一个窗口插入数据,模拟下单。

     

    从上面可以发现一开始能正常插入,但是后面突然就卡住了,并且耗费了23s才成功,然后才能继续插入。这个时候已经迁移成功了,所以能正常插入了。

     

    # 出现的原因

     

    在默认的事务隔离级别下:insert into order_record select * from order_today 加锁规则是:order_record表锁,order_today逐步锁(扫描一个锁一个)。

     

    分析执行过程。

     

     

    通过观察迁移sql的执行情况你会发现order_today是全表扫描,也就意味着在执行insert into select from 语句时,mysql会从上到下扫描order_today内的记录并且加锁,这样一来不就和直接锁表是一样了。

     

    这也就可以解释,为什么一开始只有少量用户出现支付失败,后续大量用户出现支付失败,初始化订单失败等情况,因为一开始只锁定了少部分数据,没有被锁定的数据还是可以正常被修改为正常状态。

     

    由于锁定的数据越来越多,就导致出现了大量支付失败。最后全部锁住,导致无法插入订单,而出现初始化订单失败。

     

    # 解决方案

     

    由于查询条件会导致order_today全表扫描,什么能避免全表扫描呢,很简单嘛,给pay_success_time字段添加一个idx_pay_suc_time索引就可以了,由于走索引查询,就不会出现扫描全表的情况而锁表了,只会锁定符合条件的记录。

     

    最终的sql

    •  
    •  
    •  
    •  
    •  
    •  
    INSERT INTO order_record SELECT      *   FROM      order_today FORCE INDEX (idx_pay_suc_time)  WHERE      pay_success_time <= '2020-03-08 00:00:00';
    
     

    执行过程

     

     

    # 总结

     

    使用insert into tablA select * from tableB语句时,一定要确保tableB后面的where,order或者其他条件,都需要有对应的索引,来避免出现tableB全部记录被锁定的情况。

     

    # 参考文章

     

    insert into … select 由于SELECT表引起的死锁情况分析:

    展开全文
  • 将一个大量数据,复制到另一中; 将一个的数据复制到本身中以产生大量数据; 将 test 中的 name age 数据查询出来并插入到 user 中 insert into user (name, age) select name,age from test; 也...

    所谓儒虫复制,就是针对一个表的数据,进行快速的复制并插入到所需要的表中,以期在短时间内具备“大量数据”,以用于测试或其他特殊场合,比如:

    • 将一个表的数据迁移到另外一个表的,或者迁移一部分指定数据到另外一个表。

    • 将一个表的大量数据,复制到另一个表中;

    • 将一个表的数据复制到本身表中以产生大量数据;

    将 test 表中的 name age 数据查询出来并插入到 user 表中
    insert into user (name, age) select name,age from test;
    
    也可以查出自身数据插入到自身表中,这样可以快速产生大量的测试数据
    insert into user (name, age) select name,age from user;
    
    要求:
      1、插入语句的字段个数,跟 select 语句的字段个数相等。
      2、插入语句的字段类型,跟 select 语句的字段类型相同。
      3、表之间的字段名可以不相同,只要满足以上两点就行了。
    

    测试数据,将 test 表的数据迁移到 user 表中:

    mysql> desc test;
    +-------+---------------------+------+-----+---------+----------------+
    | Field | Type                | Null | Key | Default | Extra          |
    +-------+---------------------+------+-----+---------+----------------+
    | id    | int(11)             | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(20)         | YES  |     | NULL    |                |
    | sex   | varchar(1)          | YES  |     | NULL    |                |
    | age   | tinyint(3) unsigned | YES  |     | NULL    |                |
    +-------+---------------------+------+-----+---------+----------------+
    
    mysql> desc user;
    +-------+---------------------+------+-----+---------+----------------+
    | Field | Type                | Null | Key | Default | Extra          |
    +-------+---------------------+------+-----+---------+----------------+
    | id    | int(11)             | NO   | PRI | NULL    | auto_increment |
    | name  | varchar(20)         | YES  |     | NULL    |                |
    | age   | tinyint(3) unsigned | YES  |     | NULL    |                |
    +-------+---------------------+------+-----+---------+----------------+
    
    mysql> select * from test;
    +----+-------+------+------+
    | id | name  | sex  | age  |
    +----+-------+------+------+
    |  1 | name1 | 男   |    5 |
    |  2 | name2 | 女   |   10 |
    |  3 | name3 | 男   |   15 |
    |  4 | name4 | 男   |   20 |
    +----+-------+------+------+
    
    mysql> select * from user;
    Empty set (0.00 sec)
    
    mysql> insert into user (name, age) select name, age from test;
    Query OK, 4 rows affected (0.00 sec)
    
    mysql> select * from user;
    +----+-------+------+
    | id | name  | age  |
    +----+-------+------+
    |  1 | name1 |    5 |
    |  2 | name2 |   10 |
    |  3 | name3 |   15 |
    |  4 | name4 |   20 |
    +----+-------+------+
    
    展开全文
  • 我自己的解决方案是:因为查询单词必须用到用户id,所以不能在服务器启动的时候去查询数据,我是在用户登录成功跳转主页之前将用户学习过的单词和未学习过的单词查询出来保存两个List集合中(当然,这里查询的...
  • 、复刻一张数据到另一张(结构相同) 从当前表查询所有数据到快照(注:快照只比当前个快照时间字段CKTIME)。由于使用框架查询出来之后再插入到快照会牺牲掉很大性能,所以直接采用sql脚本的...
  • 场景:工作中需要通过另一算出某字段的和,再更新其关联的某个字段。数量量约700万,验收环境,2G内存。 方案一(不建议使用):通过分页查询(也可以org.apache.ibatis.session.ResultHandler的流操作平滑的...
  • 面临的问题:个po对象将数据转换bo对象中。两个对象没有任何联系只有部分属性名字相同。 解决办法。 个个get,set。个两个还好,属性一旦过多,就会累死个人。 反射。(注:很简单,大佬们勿喷) 简单讲...
  • 使用中未出现问题,今天偶然发现,新增功能中添加个textarea文本框后,在输入的内容中如果出现回车的情况,则数据存入数据库中,再提取前端,通过poi生成excel以后,表格出现乱序情况。如图所示: 原本应该...
  •  ·利用大量数据透视的诀窍;  ·在数秒钟内创建功能强大的汇总报表:  ·方便地构建高级(ad-hOC)查询工具:  ·增强执行报表的能力;  ·筛选出前10位客户或者产品的报表:  ·将动态图表添加报表中; ...
  •  ·利用大量数据透视的诀窍;  ·在数秒钟内创建功能强大的汇总报表:  ·方便地构建高级(ad-hOC)查询工具:  ·增强执行报表的能力;  ·筛选出前10位客户或者产品的报表:  ·将动态图表添加报表中; ...
  •  ·利用大量数据透视的诀窍;  ·在数秒钟内创建功能强大的汇总报表:  ·方便地构建高级(ad-hOC)查询工具:  ·增强执行报表的能力;  ·筛选出前10位客户或者产品的报表:  ·将动态图表添加报表中; ...
  •  ·利用大量数据透视的诀窍;  ·在数秒钟内创建功能强大的汇总报表:  ·方便地构建高级(ad-hOC)查询工具:  ·增强执行报表的能力;  ·筛选出前10位客户或者产品的报表:  ·将动态图表添加报表中; ...
  • 图是除了树之外的另一大类非线性表数据结构,应对现实生活中有大量的应用,比如微博、微信、QQ等怎么表示其好友关系,关注、被关注(粉丝),亲密度等;地图出行,怎么查询到一个地方的最近距离,这些问题抽象...
  • 今年的PG用户大会,华为的许中清分享了《PostgreSQL分区实践》(当时我在另一个会场)。其中最后一页的测试结果表明,100分区的继承分区查询更新删除比不分区的普通慢了2个数量级。虽然PG的手册中也说: ...
  • Hacking swing: 个JDBC控件模型

    千次阅读 2006-01-28 00:58:00
    如果你已经用过数据库了,你很可能已经用过为数据库提供的维护和查询表的工具:命令行工具很适合作简单而直接的工作,但是很难完成大量数据的处理工作。在查询中写条返回10或20列的数据就已经很困难了-更糟的是...
  • ImportTsv-HBase数据导入工具

    万次阅读 2015-07-28 22:08:38
    HBase官方提供了基于Mapreduce...但是如果次性导入大批量数据,可能占用大量Regionserver资源,影响存储在该Regionserver上其他查询,本文将会从源码上解析ImportTsv数据导入工具,探究如何高效导入数据到HBase。
  • mongo 批量查询越来越慢原因分析

    千次阅读 2018-05-18 15:23:58
    现在想将里面的数据规整一下放到另一张表里(数据类型规整),于是写 了java个程序进行类型转换,然后条条的查出来处理后再插入到mongo里,在此之前也有过这样的经历,但是并不是次性存入这样大量数据,...
  • mysql中最差的情况下就是全扫描,一行一行数据找直到找到全部符合条件的项目,显然在大量数据情况下查找数据是非常慢的,所以就有了另一种查找方式–索引查找,索引相当于书籍的目录,图书馆的书籍ISBN号,一个...
  • 本次数据分析目标是对大量的txt文本匹配查询一系列词汇出现的总频次,并从另一个大型二维数组(第一列元素存储了一系列文件名,需要将第二列和第三列元素相应添加Excel表格中)中对每个文件名做相应的匹配查询 ...
  • 在第二章里,要学习的是线性表的两种表示方法,一种是顺序存储表示,另一种是链式存储表示,两者各有各的优点,顺序存储在按下标查询时有优势,链式存储在进行插入,删除,扩容等方面具有优势。 顺序可以做到...
  • 另一种方案是把文本里的数据保存为索引,按地名相同放在一起,然后查找的时候就是采用索引查找,也叫分块查找。最后,通过实际的数据比较及性能测试,可以确定的是,索引查找效率明显高于顺序查找。 通过...
  • 工作日活跃用户350人左右,在没有与其他ERP数据对接的情况下,每天都会产生大量数据,其中最大的流程在很短时间就突破6千万条数据,而每个用户,点开每条协同都会单独在这个张表中查询自己的数据,很快数据库就会...
  • jion优化基础

    2014-11-27 11:09:41
    在数据库的应用中,我们经常需要对多进行连操作来...数据库中的join操作,实际上是对一个另一的关联,而很多错误的理解为,先把这两个来一个迪卡尔积,然后扔内存,用where和having条件来慢慢筛选,
  • 使用join连接2个以上大量数据,且基础数据变化不大的查询一律使用视图,并为此视图建立索引。理由来自SQL Server联机帮助手册: “对于标准视图而言,为每个引用视图的查询动态生成结果集的开销很大,特别是...
  • 校园导航系统(实现简单查询

    热门讨论 2011-05-24 15:27:30
    猜测出大致的错误位置,选则一些主要变量,在关键部位插入打印语句,打印出这个主要变量,看其是否与理论上的一样,在多个位置插入,如果有个位置的值与理论值一样,另一个位置与理论值不一样,则错误就落在这两个...
  • 备份数据库的另一个技术是使用mysqldump程序或mysqlhotcopy脚本。 1. 完全备份数据库: 2. shell> mysqldump --tab=/path/to/some/dir --opt db_name 或: shell> mysqlhotcopy db_name /path/to/some/dir 只要...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 218
精华内容 87
关键字:

查询大量数据到另一表