精华内容
下载资源
问答
  • 对于大数据量,多层分组的的汇总报表不能采用分页标签,可以采用如下的优化方案: 一、先初步对报表进行优化: 1、尽量在sql实现group分组,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快,且 取到...

    对于大数据量,多层分组的的汇总报表不能采用分页标签,可以采用如下的优化方案:

    一、先初步对报表进行优化:

    1、尽量在sql实现group分组,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快,且 取到报表服务器端的记录数大大减少,取数速度大大加快,因此在报表端进行分组运算的时候只要对 很少的记录数进行,报表的运算速度大大加快了。

    2、修改背景色的表达式尽量少采用row(),比如在每一行的一个格子里算出来行号,然后在背景 色表达式判断。 背景色的奇偶行判断,比如:if(row()%2==0,-3342337),主要是row(),是因为这种函数无法优化计 算,有多少个表达式就要计算多少次,而且必须在扩展完后拖后计算。这样的话,如果扩展比较多的 话,对性能就会有比较大的影响。

    3、对于交叉分组要尽量减少数据集个数,尽量用单数据集。

    二、配置优化:

    以JVM内存设置为1G的服务器为例子,假设并发量最大为5,用户请求的报表为200单元格*1000页(数 据量可能上千万,但通过条件查询,最其中几千条记录),一般大数据量都没有图片,所以以每一个 单元格为0.5k计算,那么在最大并发量下,得出报表系统内存使用量为: 200*1000*5*0.5/1024K=488.28125M 根据以上计算,我们在实际生产系统中,我们建议:

    cachedReportTimeout设置成180分钟,用户数据量大的情况下,增大报表缓存时间。
    alwaysReloadDefine设置为no,开启缓存,这样客户在翻页时,不再与数据库交互,减轻数据库服务器的负担。
    同时在tag标签中把useCache设置为yes。
    timeout可以根据自己的实时要求进行设置,如果数据一天都不会变的话,建议设置为-1 。
    maxConcurrentForReport为5,即并发量为5。
    maxWaitForReport设置为10 ,即等待队列里允许的最大报表量。
    maxWaitTimeForReport设置为300秒钟,6分钟内得不到响应,用户需要再次请求。
    maxCellNum,在内存中,同时计算的单元格数量建议为200单元格*500页=100000格。
    如果不能用缓存,可以将缓存开关关掉,重点关注一下并发和最大格子数的设置。

    另外,报表里,报表属性-格子数,这个属性可以写成这样的表达式:ds1.count()*13,如果还有一些固定格子,可以写成ds1.count()*13+固定格子数。

    展开全文
  • 这篇文章我将会写这两天在一个人才服务业务管理系统项目中碰到的一个关于对MySQL数据库中数据进行统计的小问题。 首先,我这边有两张表,一张是户口表,一张是档案表。具体需求如下: 从前天传来一个时间范围的参数...

    (比较重点的我都会以红字标出)前两天刚入职,比较忙所以没有写文章。这篇文章我将会写这两天在一个人才服务业务管理系统项目中碰到的一个关于对MySQL数据库中数据进行统计的小问题。

    首先,我这边有两张表,一张是户口表,一张是档案表。

    具体需求如下:

    从前天传来一个时间范围的参数,按照时间统计各类学历的党员和户口情况数量

    然后得到统计结果返回给前台页面


    由于学历类别这边的基本是固定不变的,所以我的查询语句也就直接写死,不去动态的获取每种学历的education字段的值了。

    由于这边需要考虑横纵两列的条件还要外加一个时间段的条件跟多张表查询,所以整个代码的编写可能会有些复杂,相关的关键代码我也会在下面展示出来给到大家以供参考

    首先我在model层写了一个不用映射在数据库的实体类(因为只是统计用的,所以不同对应到数据库的表里),用来保存查询到的数据,以便于传到前台页面

    实体类代码

    public class Statistics {
    	private String type;// 类型
    	private Long totalStatistic;// 总数
    	private Long doctorStatistic;// 博士
    	private Long masterStatistic;// 硕士
    	private Long regularStatistic;// 本科
    	private Long juniorStatistic;// 专科
    	private Long elseStatistic;// 其他
    }
    当然还需要对应的getter,setter方法,我就不放上来了

    接下来是control层的代码

    	public Object searchByEducationAndAffiliated(HttpServletRequest request, String inTime, String outTime) {
    		
    		if (StringUtils.isBlank(inTime) || inTime.equals("0000/00/00")) {
    			inTime = null;
    		} else {
    			inTime = inTime + " 00:00:00";
    		}
    		if (StringUtils.isBlank(outTime) || outTime.equals("0000/00/00")) {
    			outTime = null;
    		} else {
    			outTime = outTime + " 23:59:59";
    		}
    
    		Map<String, Object> map = new HashMap<String, Object>();
    
    		String[] affiliatedStates = new String[] { "党员", "党员挂靠", "党员解除", "户口", "户口挂靠", "户口解除" };
    		String as = new String();
    		List<Statistics> list = new ArrayList<>();
    		for (int i = 0; i < affiliatedStates.length; i++) {
    			as = affiliatedStates[i];
    			map.put("affiliatedStates", as);
    			Statistics statistic = new Statistics();
    			statistic = accountDao.statisticsByEducationAndAffiliated(map);
    			statistic.setType(as);
    			list.add(statistic);
    		}
    		
    		map.put("inTime", inTime);
    		map.put("outTime", outTime);
    		
    		return list;
    	}

    首先这边有三个传参

    request就不用多解释了,毋庸置疑这是前台传来的一个请求

    inTime跟outTime则表示是一个时间段

    因为考虑到可能有些用户不输入时间或者输入的时间表示当天的一整天这两种情况,所以在刚开始的时候就通过一个判断给这两个参数进行初始化的赋值。

    然后定义了一个Map用来保存传到dao层的方法的参数(由于用了SSM框架,所以原来对数据库进行操作的代码实现就完全放到了Mybatis的xml文件里了),由于要实现的是统计的功能,页面要统计的内容是固定的,所以我直接把页面每行的条件放在了一个数组里,然后用一个for循环,依次传参数给实现方法,通过方法返回一个statistic对象,在把每一个对象放进一个list集合里返回到前台页面获取。
    接下来就是比较重要的部分了,也就是statisticsByEducationAndAffiliated()方法具体的实现

    首先先给到大家xml部分的代码

    	<sql id="baseSelectTotal">
    		select
    		count(*) as totalStatistic,
    		sum(case when education =
    		'188' then
    		1
    		else 0 end) as doctorStatistic,
    		sum(case when education =
    		'190' then
    		1
    		else 0 end) as masterStatistic,
    		sum(case when education =
    		'194' then
    		1
    		else 0 end) as regularStatistic,
    		sum(case when education =
    		'197'
    		or
    		education = '198' 
    		or
    		education = '199'
    		then
    		1 else 0 end) as juniorStatistic,
    		sum(case when
    		education not in ('188', '190', '194', '197', '198','199')
    		or
    		education is
    		null then
    		1
    		else 0 end) as elseStatistic
    		from archives where
    		1=1
    	</sql>

    	<select id="statisticsByEducationAndAffiliated" parameterType="Map" resultType="com.hd.ams.model.Statistics">
    		<if test="affiliatedStates!=null and affiliatedStates =='党员' or affiliatedStates =='党员挂靠' or affiliatedStates =='党员解除'">
    			<include refid="baseSelectTotal" />
    			<if test="inTime!=null">
    				and create_time>=#{inTime}
    			</if>
    			<if test="outTime!=null">
    				and create_time<=#{outTime}
    			</if>
    			<if test="affiliatedStates =='党员'">
    				and affiliated is not null
    			</if>
    			<if test="affiliatedStates =='党员挂靠'">
    				and affiliated = 'yes'
    			</if>
    			<if test="affiliatedStates =='党员解除'">
    				and affiliated = 'no'
    			</if>
    		</if>
    		<if test="affiliatedStates!=null and affiliatedStates =='户口' or affiliatedStates =='户口挂靠' or affiliatedStates =='户口解除'">
    			<!-- select (select count(*) from account where 1=1 <if test="affiliatedStates 
    				=='户口'"> </if> <if test="affiliatedStates =='户口挂靠'"> and state != 'move_out' 
    				</if> <if test="affiliatedStates =='户口解除'"> and state = 'move_out' </if> 
    				<if test="inTime!=null"> and create_time>=#{inTime} </if> <if test="outTime!=null"> 
    				and create_time<=#{outTime} </if> ) as totalStatistic, sum(case when ar.education 
    				= '188' then 1 else 0 end) as doctorStatistic, sum(case when ar.education 
    				= '190' then 1 else 0 end) as masterStatistic, sum(case when ar.education 
    				= '194' then 1 else 0 end) as regularStatistic, sum(case when ar.education 
    				= '197' or ar.education = '198' then 1 else 0 end) as juniorStatistic, ((select 
    				count(*) from account where 1=1 <if test="inTime!=null"> and create_time>=#{inTime} 
    				</if> <if test="outTime!=null"> and create_time<=#{outTime} </if> <if 
    				test="affiliatedStates =='户口'"> </if> <if test="affiliatedStates =='户口挂靠'"> 
    				and state != 'move_out' </if> <if test="affiliatedStates =='户口解除'"> and state 
    				= 'move_out' </if> ) - (select sum(case when ar.education in ('188', '190', 
    				'194','197', '198') and ac.card = ar.card then 1 else 0 end) from account 
    				ac,archives ar where 1=1 <if test="inTime!=null"> and ac.create_time>=#{inTime} 
    				</if> <if test="outTime!=null"> and ac.create_time<=#{outTime} </if> <if 
    				test="affiliatedStates =='户口'"> </if> <if test="affiliatedStates =='户口挂靠'"> 
    				and ac.state != 'move_out' </if> <if test="affiliatedStates =='户口解除'"> and 
    				ac.state = 'move_out' </if> )) as elseStatistic from account ac,archives 
    				ar where 1=1 and ar.card = ac.card <if test="inTime!=null"> and ac.create_time>=#{inTime} 
    				</if> <if test="outTime!=null"> and ac.create_time<=#{outTime} </if> <if 
    				test="affiliatedStates =='户口'"> </if> <if test="affiliatedStates =='户口挂靠'"> 
    				and ac.state != 'move_out' </if> <if test="affiliatedStates =='户口解除'"> and 
    				ac.state = 'move_out' </if> -->
    
    			select count(*) as totalStatistic,
    			sum(case when education = '188' then
    			1
    			else 0
    			end) as doctorStatistic,
    			sum(case when education = '190' then
    			1
    			else
    			0 end) as masterStatistic,
    			sum(case when education = '194' then
    			1
    			else 0 end) as regularStatistic,
    			sum(case when education = '197'
    			or
    			education = '198' 
    			or
    			education = '199'
    			then
    			1 else 0 end) as juniorStatistic,
    			sum(case when
    			education not in ('188', '190', '194','197','198','199')
    			or education is null
    			then
    			1 else 0 end)
    			as elseStatistic
    			from (select ac.create_time,ac.state,ar.education
    			from account ac left join archives ar
    			on ac.card = ar.card group by ac.card) statistics where 1=1
    			<if test="inTime!=null">
    				and create_time>=#{inTime}
    			</if>
    			<if test="outTime!=null">
    				and create_time<=#{outTime}
    			</if>
    			<if test="affiliatedStates =='户口'">
    			</if>
    			<if test="affiliatedStates =='户口挂靠'">
    				and state != 'move_out'
    			</if>
    			<if test="affiliatedStates =='户口解除'">
    				and state = 'move_out'
    			</if>
    		</if>
    	</select>

    看到这里,有些小伙伴可能就有点懵逼了,不要慌,我接下来带大家来一一解读每个语句的具体意思。

    首先在此之前告知大家一个小技巧,如果在xml文件需要多次引用重复的sql语句,可以通过一个<sql>标签将重复的sql语句放入其中,然后在要用到的地方用<include>标签引用(这跟JSP页面引用别的页面有些类似,如果引用的不是当前文件的则refid需要全路径)

    这边xml是通过<mapper>标签可以对应到dao层里具体的某个类 然后通过<select>标签里的每个id属性知道对应的是类里的哪个具体的方法,paramType和resultType则是声明传参的类型和返回的结果类型

    接下来我则使用sum函数再加上case when条件来统计不同学历的学生的数量(这边还不用加上其他查询条件),其中的then 1 else 0的意思是如果满足when的条件则计数,若不满足则不计数,由于党员状态这边的查询只涉及到一张表的统计,所以会比较简单,可以通过多个<if>标签判断传参来确定要执行哪些sql语句直接解决问题。这边可以参照这位前辈的博客文章https://www.cnblogs.com/zcy_soft/archive/2011/03/10/1979357.html

    当统计户口情况的时候,就比较棘手了,涉及到户口表和档案表两张表,刚开始我用的是注释里的sql语句,相当的麻烦,因为是通过card字段进行的表关联,card字段不是唯一的,而且可能为空,所以分学历种类查询中可能就需要分三种情况来处理,总数的查询为一类(直接统计account表里的所有数据记录量),博士、硕士、本科、专科的为一类(按照archives表里的education字段分类统计),其他的为一类(因为其他要包括education没有的情况跟card字段的值为空的情况),总之是比较麻烦的一种选择,不信的小伙伴可以自己试试,查询统计速度相当慢,我甚至还怀疑是自己网络的问题。

    第二种方法是我后来进行sql优化后的方法,直接使用了一个多表的左连接的子查询作为from的条件,其中还用group by对card相同的情况进行了去重,而且也不怕card为null的情况了,因为直接是对连接后得到的虚拟表进行的查询,所以为null还是能够查询到并进行计数的,这边具体的话可以参照这位前辈的博客文章http://blog.csdn.net/Jintao_Ma/article/details/51260458

    这边有个小点需要跟大家提一下就是当我写where加条件的时候都加了个1=1是什么意思,因为这边的条件都是要进行判断才会选择执行哪一句的,每一个条件前面都有一个and,因为where后面的第一个条件是不能加and的,所以我如果不加1=1的话,判断出来是第一个条件则sql语句将会是where and 。。。,这sql语句显然是有错的,所以1=1的作用就是防止出错

    好了 本篇文章就写到这里了。有兴趣一起讨论技术或者 交流的小伙伴可以私信我,周一到周五可能工作会没时间回复大家,但我看到的话一定会回复的



    展开全文
  • 自老版本的windows优化大师中提取出来的精简的程序,我主要是用于硬盘各分区剩余空间的统计,以及总和的统计。网上也有大量软件能做到统计各分区的剩余空间,但一般都没有剩余空间总和的统计。这样造成统计出各分区...
  • SQL优化--SQL优化语句的一般步骤

    万次阅读 2018-07-25 15:55:59
    --SQL优化语句的一般步骤 --1.通过show status命令了解各种SQL的执行频率 --2.定位执行效率较低的SQL语句 --3.通过EXPLAIN分析较低SQL的执行计划 --4.通过show profile分析SQL --5.通过trace分析优化器如何选择...

    使用的是https://dev.mysql.com/doc/sakila-db.zip里面的例子

    --SQL优化语句的一般步骤

    --1.通过show status命令了解各种SQL的执行频率

    --2.定位执行效率较低的SQL语句

    --3.通过EXPLAIN分析较低SQL的执行计划

    --4.通过show profile分析SQL

    --5.通过trace分析优化器如何选择执行计划

    --6.确定问题并采取相应的优化措施

     

    --1.通过show status命令了解各种SQL的执行频率

    --显示了当前session中所有统计参数的值

    show status like 'Com_%'

    Com_xxx表示每个xxx语句执行的次数,比较关注的统计参数

    Com_select  Com_insert  Com_update  Com_delete

    以上参数对所有存储引擎都会进行累计 下面参数只对InnoDB进行累计

    InnoDB_rows_read:select查询返回行数

    InnoDB_rows_inserted:insert查询返回行数

    InnoDB_rows_updated:update操作更新行数

    InnoDB_rows_deleted:执行delete操作删除行数

    通过以上参数了解当前数据库应用是以插入更新为主还是以查询操作为主,各类型的SQL大致的执行比例是多少。更新操作计数是对执行次数的统计 (包括提交和回滚)

    事务型应用 通过Com_commit和Com_rollback可以了解事务提交回滚情况 对于回滚操作很频繁的数据库 意味着应用编写存在问题

     

    Connections:试图连接Mysql服务器次数

    Uptime:服务器工作时间

    Slow_queries:慢查询次数

    --2.定位执行效率较低的SQL语句

    通过以下两种方式定位效率低的SQL语句

    1.通过慢查询日志定位哪些执行效率较低的SQL语句 用--log-slow-queries[=file_name]启动mysqld写一个包含所有执行时间超过Long_query_time秒的SQL语句的日志(查看日志管理部分)

    2.慢查询日志在查询结束后才记录 在应用反映执行效率出现问题无法用慢日志定位问题 使用show processlist命令查看当前MySQL在进行的线程 可以查看报过线程状态 是否锁表等 可以实时查看SQL的执行情况 同时对一些锁表进行优化。

    --3.通过EXPLAIN分析较低SQL的执行计划

    查到低效率SQL语句后 通过EXPLAIN or DESC获取MySQL如何执行select语句信息 包括在select语句执行过程中表如何连接和连接的顺序 

    --example:

    explain select sum(amount) from customer a,payment b where 1=1 and a.customer_id = b.customer_id and email = 'JANE.BENNETT@sakilacustomer.org'\G

    参数介绍:

    select_type:表示SELECT的类型 常见取值有SIMPLE(简单表 不使用表连接或者子查询) PRIMARY(主查询 外层的查询) UNION(UNION中的第二个或者后面的查询语句) SUBQUERY(子查询中的第一个select)

    table:输出结果集的表

    type:表示MySQL在表中找到所需行的方式 或者访问类型 常见类型如图

     

    ALL

    index

    range

    ref

    eq_ref

    const,system

    NULL

    从左至右 性能由差->好

    all:全表扫描 MySQL遍历全表来找到匹配的行

    index:索引全扫描 Mysql遍历整个索引查询匹配行

    range:索引范围扫描 常见于 < <= > >= between

    ref:使用非唯一索引扫描或唯一索引的前缀扫描 返回某个单独值得记录行 ref还经常出现在join操作中

    eq_ref:类似ref 区别使用的是唯一索引 对于每个索引键值 表中只有一个值 (就是多表连接中使用primary key或者unique index作为关联条件)

    const,system:单表中最多有一个匹配行 查询起来很迅速 这个匹配行中的其他列值可以被optimizer在当前查询中当作常量处理

    NULL:不使用访问表或者索引 直接得到结果

    其他值 ref_or_null(类似ref 区别条件中包含对NULL查询) index_merge(索引合并优化) unique_subquery(in的后面是一个查询主键字段的子查询) 

    index_subquery(与unique_subquery类似 区别在in后面是查询非唯一索引字段的子查询等)

     

    possible_keys:表示查询时可能使用的索引

    key:表示实际使用的索引

    key_len:使用到索引字段的长度

    rows:扫描行数量

    EXTRA:执行情况的说明和描述 包含不适合在其他列中显示但对执行计划非常重要的额外信息


    ————————————————

    expain extended命令加上show warnings 能够看到在SQL执行前做了哪些SQL改写

    explain extended select sum(amount) from customer a,payment b where 1=1 and a.customer_id = b.customer_id and email = 'JANE.BENNETT@sakilacustomer.org'\G

    show warnings\G

    从Mysql5.1开始支持分区功能 explain支持分区 EXPLAIN PARTITIONS命令查看SQL访问的分区

    例子:

    create table customer_part (

      `customer_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,

      `store_id` tinyint(3) unsigned NOT NULL,

      `first_name` varchar(45) NOT NULL,

      `last_name` varchar(45) NOT NULL,

      `email` varchar(50) DEFAULT NULL,

      `address_id` smallint(5) unsigned NOT NULL,

      `active` tinyint(1) NOT NULL DEFAULT '1',

      `create_date` datetime NOT NULL,

      `last_update` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

       PRIMARY KEY (`customer_id`)

    )partition by hash(`customer_id`) partitions 8;

    --插入数据  执行计划检查

    insert into customer_part select * from customer;

    explain partitions select * from customer_part where customer_id =130\G;

    有时候需要选择profile联合分析

    --4.通过show profile分析SQL

    select @@have_profiling;

    select @@profiling;

    --默认profiling是关闭的 可以通过set在session级别开启

    set profiling=1;

    select count(*) from payment;

    show profiles语句 看到当前SQL的 Query ID=2

    show profile for语句 能够看到执行过程中线程的每个状态和消耗的时间

    在sending data状态下 mysql线程往往需要做大量的磁盘读取操作 经常是整个查询中耗时最长的

    更清晰查看排序结果 查询INFORMATION_SCHEMA.PROFILE表并按照时间做个desc排序

     

    SET @query_id:=2;

    SELECT STATE,SUM(DURATION) AS Total_R,

        ROUND(

         100 * SUM(DURATION)/

        (SELECT SUM(DURATION)

            FROM INFORMATION_SCHEMA.PROFILING

        WHERE QUERY_ID = @query_id

        ),2) AS Pct_R,

        COUNT(*) AS Calls,

        SUM(DURATION) / COUNT(*) AS "R/Call"

        FROM INFORMATION_SCHEMA.PROFILING

        WHERE QUERY_ID = @query_id

        GROUP BY STATE

        ORDER BY Total_R DESC;

    获取到最消耗时间线程状态后 支持进一步选择all cpu block io context switch page faults等明细类型查看MySQL在使用什么资源上消费了过高时间

    --建一张myisam表

    create table payment_myisam like payment;

    alter table payment_myisam engine=myisam;

    insert into payment_myisam select * from payment;

    show profiles;

    show profile for query 14;

    myisam引擎的表在executing之后直接结束查询 完全不需要访问数据

     

    对Mysql源码有兴趣的 可以通过show profile source for query 查看sql解析执行过程中每个步骤对应的源码文件 函数名以及具体的源文件行数

    mysql> show profile source for query 14\G;

    --5.通过trace分析优化器如何选择执行计划

    5.6提供了对sql跟踪trace 通过trace文件 能够进一步了解为什么优化器选择A执行计划而不是B执行计划

    用法:打开trace 设置格式为JSON 设置trace最大能够使用的内存大小 避免解析过程中因为默认内存过小而不能够完整显示。

    SET OPTIMIZER_TRACE="enabled=on" ,END_MARKERS_IN_JSON=on;

    SET OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000;

    --SQL语句

    select rental_id from rental where 1=1 and rental_date >= '2005-05-25 04:00:00' and rental_date <= '2005-05-25 05:00:00' and inventory_id=4466;

     

    select * from INFORMATION_SCHEMA.OPTIMIZER_TRACE\G;

    --6.确定问题并采取相应的优化措施

     

    CREATE INDEX idx_email on customer(email);

    explain select sum(amount) from customer a,payment b where 1=1 and a.customer_id = b.customer_id and email = 'JANE.BENNETT@sakilacustomer.org'\G

     

     

     

     

     

    展开全文
  • 本文在实现统计各部门员工薪水总和功能的基础上进行,还没实现的话请参考:实现统计各部门员工薪水总和功能 优化项目: 1.使用序列化 2.实现分区Patitioner 3.Map使用Combiner 使用序列化 本案例是在实现...

    本文在实现统计各部门员工薪水总和功能的基础上进行,还没实现的话请参考:实现统计各部门员工薪水总和功能

    优化项目:

    1.使用序列化

    2.实现分区Patitioner

    3.Map使用Combiner

     

    使用序列化

    本案例是在实现统计各部门员工薪水总和功能基础上进行。

    序列化与反序列化:

    序列化是指将Java对象转换为二进制串的过程,方便网络传输;

    反序列化是指将二进制串转换为Java对象的过程。

    MapReduce编程模型及编程思路:

    与 实现统计各部门员工薪水总和功能相比,本案例要多建立一个Employee类,Employee类代码如下:

    package com.myXuliehua;
    
    import java.io.DataInput;
    import java.io.DataOutput;
    import java.io.IOException;
    
    import org.apache.hadoop.io.Writable;
    
    //定义Employee类实现序列化接口
    public class Employee implements Writable{
    	
    	//字段名 EMPNO, ENAME,    JOB,   MGR,   HIREDATE,  SAL, COMM, DEPTNO
    	//数据类型:Int,Char,          Char  , Int,     Date  ,       Int   Int,  Int
    	//数据: 7654, MARTIN, SALESMAN, 7698, 1981/9/28, 1250, 1400, 30
    	
    	//由以上定义变量
    	private int empno;
    	private String ename;
    	private String job;
    	private int mgr;
    	private String hiredate;
    	private int sal;
    	private int comm;//奖金
    	private int deptno;
    	
    
    	//序列化方法:将java对象转化为可跨机器传输数据流(二进制串/字节)的一种技术
    	public void write(DataOutput out) throws IOException {
    		out.writeInt(this.empno);
    		out.writeUTF(this.ename);
    		out.writeUTF(this.job);
    		out.writeInt(this.mgr);
    		out.writeUTF(this.hiredate);
    		out.writeInt(this.sal);
    		out.writeInt(this.comm);
    		out.writeInt(this.deptno);
    		
    	}
    	//反序列化方法:将可跨机器传输数据流(二进制串)转化为java对象的一种技术
    	public void readFields(DataInput in) throws IOException {
    		this.empno = in.readInt();
    		this.ename = in.readUTF();
    		this.job = in.readUTF();
    		this.mgr = in.readInt();
    		this.hiredate = in.readUTF();
    		this.sal = in.readInt();
    		this.comm = in.readInt();
    		this.deptno = in.readInt();
    	}
    	//其他类通过set/get方法操作变量:Source-->Generator Getters and Setters
    	public int getEmpno() {
    		return empno;
    	}
    	public void setEmpno(int empno) {
    		this.empno = empno;
    	}
    	public String getEname() {
    		return ename;
    	}
    	public void setEname(String ename) {
    		this.ename = ename;
    	}
    	public String getJob() {
    		return job;
    	}
    	public void setJob(String job) {
    		this.job = job;
    	}
    	public int getMgr() {
    		return mgr;
    	}
    	public void setMgr(int mgr) {
    		this.mgr = mgr;
    	}
    	public String getHiredate() {
    		return hiredate;
    	}
    	public void setHiredate(String hiredate) {
    		this.hiredate = hiredate;
    	}
    	public int getSal() {
    		return sal;
    	}
    	public void setSal(int sal) {
    		this.sal = sal;
    	}
    	public int getComm() {
    		return comm;
    	}
    	public void setComm(int comm) {
    		this.comm = comm;
    	}
    	public int getDeptno() {
    		return deptno;
    	}
    	public void setDeptno(int deptno) {
    		this.deptno = deptno;
    	}
    	
    }
    

    实现分区Patitioner

    本案例是对使用序列化案例的优化:可指定输出文件的个数,实现结果分区存放。

    MapReduce默认只有一个Reduce输出文件 例如:part-r-00000。

    分区Partitioner可输出多个Reduce,并有多个不同的输出文件     例如:part-r-00000 ,  part-r-00001, part-r-00002。

     

    MapReduce编程模型及编程思路:

    与分区序列化相比,本案例多出一个Patition类 ,Patition类代码如下:

    package com.myPatition;
    
    import org.apache.hadoop.io.IntWritable;
    import org.apache.hadoop.mapreduce.Partitioner;
    //                                    map-outputs:k2,v2-->IntWritable, Employee 
    public class SalaryTotalPartitioner extends Partitioner<IntWritable, Employee>{
    
    	@Override
    	public int getPartition(IntWritable k2, Employee v2, int numPatition) {
    		
    		//如何分区: 每个部门放在一个分区
    		if(v2.getDeptno() == 10) {
    			//放入1号分区中
    			return 1%numPatition;// 1%3=1
    		}else if(v2.getDeptno() == 20){
    			//放入2号分区中
    			return 2%numPatition;// 2%3=2
    		}else {
    			//放入3号分区中
    			return 3%numPatition;// 3%3=0
    		}			
    	}
    }
    

     

    Map使用Combiner

    本案例是在实现统计各部门员工薪水总和功能基础上进行。

    使用Combine是指在Map输出时使用一次Reduce进行合并中间结果,可以减少Shuffle网络传输次数,提高效率。但注意有些场合不能使用Combiner,例如求平均值时。

    MapReduce编程模型及编程思路:

    使用Combine很简单,仅仅只需要在Main类中添加,如上图2.1步骤一句代码。 

     

    附上三个优化案例的详细代码参考:

    链接:https://pan.baidu.com/s/1grC-KLpM6oI2iCY7HkCKwA 
    提取码:140m 

     

    完成! enjoy it!
     

    展开全文
  • SQL Server多表查询的优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容。 1.执行路径 ORACLE的这个功能大大地提高了SQL的执行性能并节省了...
  • MySQL 优化器原来是这样工作的

    千次阅读 2020-07-02 14:55:35
    MySQL 优化器使用基于成本的优化方式(Cost-based Optimization),利用内置的成本模型和数据字典信息以及存储引擎的统计信息决定使用哪些步骤实现查询语句,也就是查询计划。同时,MySQL 为我们提供了控制优化器的...
  • 统计性能优化思路

    千次阅读 热门讨论 2012-08-06 11:58:08
     统计当前店铺下订单信息。根据订单开始时间,结束时间,商品id,商品名称,商品编号来获取。并可以导出基本信息和详细信息。涉及主商品表,子商品表,订单表,订单商品关联表。其中商品表信息和订单表记录数较大。...
  • 小程序客服在小程序运营过程中发挥着——直接对接用户,用户体验,商品变现,体现服务等,我们很有必要对这个数据有所掌握,指导当前工作,优化小程序的整体运营策略。 需要实现的不仅是客服了解自己的工作情况,...
  • Hexo 博客优化之实用功能添加系列(持续更新)

    万次阅读 多人点赞 2018-12-14 22:05:50
    本文将讲述一些Hexo博客主题的美化、实用功能的添加,不同主题可能方法有些不同(本文以作者 luuman 的 spfk 主题为例)实际效果欢迎访问我的博客:https://trhx.top/ 进行查看,本文章会不定时进行更新。...
  • 本文动态统计Dynamic Statistics(动态采样Dynamic Sampling)相关知识
  • 本文将针对Oracle数据库各个版本的优化器(Optimizer )出现的新特性进行简单的介绍,并从架构的角度概述各个版本间的主要变化和12c新特性的概述。
  • 离散数学在计算机科学中的应用

    万次阅读 多人点赞 2018-02-03 11:56:44
    在研究实体集中的域和域之间的可能关系、表结构的确定与设计、关系操作的数据查询和维护功能的实现、关系分解的无损连接性分析、连接依赖等问题都用到二元关系理论。 离散数学在编译原理中的应用 编译程序是...
  • Java+MySQL实现学生管理系统

    万次阅读 多人点赞 2019-06-13 15:43:41
    实现一个学生管理系统,方便老师对学生信息进行统计管理 用户登录功能 学生管理功能 完善界面交互 数据持久可靠 设计思路 使用Java作为开发语言,MySQL作为数据库,Java Swing做图形界面; 分层解耦,分为entity...
  • 史上最强Tomcat8性能优化

    万次阅读 多人点赞 2019-10-25 15:33:32
    文章目录授人以鱼不如授人以渔目的服务器资源Tomcat配置优化Linux环境安装运行Tomcat8AJP连接执行器(线程池)3种运行模式部署测试用的web项目查看服务器信息部署web应用使用Apache JMeter进行性能测试下载安装修改...
  • 大多数制造业企业几年前都开始有条不紊地收集生产过程数据了,因为这样利于帮助做企业诊断和解决生产中遇到的问题。当下,很多企业长其积累下来的大量数据,仅靠...那么统计分析到底有哪些功能呢?下面以智邦国际...
  • 如何优化MySQL千万级大表,我写了6000字的解读

    万次阅读 多人点赞 2019-10-21 20:03:03
    千万级大表如何优化,这是一个很有技术含量的问题,通常我们的直觉思维都会跳转到拆分或者数据分区,在此我想做一些补充和梳理,想和大家做一些这方面的经验总结,也欢迎大家提出建议。 从一开始脑海里开始也是...
  • 为你的CSDN博客添加CNZZ流量统计功能

    千次阅读 2017-04-25 00:15:00
    一、流量统计介绍 流量统计是指通过各种科学的方式,准确的纪录来访某一页面的访问者的流量信息,目前而言,必须具备可以统计。 1、简介 统计独立的访问者数量(独立用户、独立访客); 可以统计独立的IP地址数量;...
  • 天线基础与HFSS天线设计流程

    万次阅读 多人点赞 2019-04-28 15:10:10
    作为一款功能强大的三维电磁设计软件,HFSS可以位天线设计提供全面的解决方案。使用HFSS可以仿真分析和优化各类天线,精确计算天线的各种性能,包括二维、三维远场和近场辐射方向图、天线的方向性系数、增益、轴比、...
  • 本文介绍12c的自动重新优化(Automatic Reoptimization 以后简称AR)功能统计反馈(Statistics Feedback)和性能反馈(Performance Feedback)
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    J2ME优化压缩PNG文件 4个目标文件 内容索引:JAVA源码,综合应用,J2me游戏,PNG,图形处理  这是个J2ME控制台程序,它能剔除PNG文件中的非关键数据段,减少文件大小从而达到压缩图片的目的。而图片的质量并不会受到损失...
  • http://topic.csdn.net/u/20090701/11/2599adb6-32ef-4688-9235-5015461a4a65.html 不显示删除回复显示所有回复显示星级回复显示得分回复 [推荐] 讨论下:你碰到的业务系统中,报表统计功能如何组织()
  • 在过去一周,开发在产品的鞭策下,又带来了哪些功能呢? CSDN APP端 Java精选频道上线 OFFER大挑战等你来! CSDN APP Java精选频道上线,内容涵盖基础知识点,Java学习路线,Java 面试指导,热门框架教程等,独家...
  • 作为 Android 开发者,想必多多少少要接触启动速度优化相关的事情,当用户越来越多,产品的功能也随着迭代越来越多,App 逐渐变得臃肿是一件很常见的现象,甚至可以说是不可避免的现象,随之而来的工作就是优化 App ...
  • 我想在大地上画满窗子,让所有习惯黑暗的眼睛习惯...本节的内容如下:SQL Server统计信息列级统计信息统计信息与执行计划统计信息与内存分配开销预估模型SQL Server统计信息 说到统计信息,就一定要提到查询优化器,
  • 那么要想调取点击量我们必须让wordpress统计读者点击的次数,很多主题用的最多的就是WP-PostViews插件,如果你不想使用插件,通过以下三种代码完全可以实现对读者点击量的统计,从而实现最热文章的功能统计文章...
  • 数据库SQL优化大总结之 百万级数据库优化方案

    万次阅读 多人点赞 2016-06-23 09:43:50
    网上关于SQL优化的教程很多,但是比较杂乱。近日有空整理了一下,写出来跟大家分享一下,其中有错误和不足的地方,还请大家纠正补充。 这篇文章我花费了大量的时间查找资料、修改、排版,希望大家阅读之后,感觉好的...
  • MySQL中的统计数据

    万次阅读 2021-09-06 21:16:28
    基于索引统计数据的成本计算 有时候使用索引执行查询时会有许多单点区间,例如使用in语句就很容易产生非常多的单点区间,比如下边这个查询(下边查询语句中的…表示还有很多参数): select * from t_emp where ...
  • 高性能MySQL之Count统计查询

    万次阅读 2017-08-10 17:32:50
    近一段时间,有同事问我 “MySQL执行count很慢,有没有什么优化的空间”。当时在忙,就回复了一句“innodb里面count统计都是实时统计,慢一些是正常的”, 周末闲暇下来,想到以前有好多人都问过关于count的问题,...
  • 随着工作经历的积累,越来越感觉到,大量的关系型数据库的性能问题,其根源在于统计信息。这里说的是根源,其实很多时候大家觉得的那些什么索引失效等都只是表象。当然,不能一概而论,还有很多问题如配置问题、设计...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 246,340
精华内容 98,536
关键字:

统计功能优化