精华内容
下载资源
问答
  • /* * Controller 控制器 * 获取质检总数量 */ $qco_quantity = Product_Service_QualityControlOrder::getQcoCode($spoRow['spo_ref_code']); $this->view->qco_quantity = $qco_quantity;...
    HTML
    <input type="button" onclick="$('#DetermineEndTime').dialog('open');" class="button" value="确定结束时间" style="cursor:pointer">
    <div id="DetermineEndTime" style="display:none" title="提示信息">
         <h3 style='text-align:center'>确定结束时间<h3>";
         <input type='hidden' name='op_pack_end'>
    </div>
    
    Js
    <script>
         //初始化
         $(function(){
              $("#DetermineEndTime").dialog({
                   autoOpen: false,
                   width: 300,
                   height: 150,
                   modal: true,
                   show: "slide",
                   buttons: {
                         "确定": function () {
                             $(this).dialog("close");
                             submitEndTime();
                         },
                         "取消": function () {
                              $(this).dialog("close");
                          }
                         }
                 });
                 });
                 function submitEndTime() {
                   var orders_code_ch = $('#orders_code_ch').val();
                        $.ajax({
                             type: "post",
                             async: false,
                             dataType: "json",
                             url: "/warehouse/pack-check/determine-end-time/",
                             data: {"orders_code_ch": orders_code_ch},
                             success: function (json) {
                                  alertTip(json.msg);
                             }
                        });
                 }
    </script>
    
    /*
    * 控制器
    * 获取质检总数量
    */
    class Warehouse_PackCheckController extends Zend_Controller_Action {
         public function determineEndTimeAction() {
              $result = array('ask' => 0, 'msg' => '');
              $orders_code_ch = $this->_request->getParam("orders_code_ch", "");
              $op_code = Order_Service_OrderPickup::getByValue($orders_code_ch, "op_code");
              if (empty($op_code)) {
                   $result['msg'] = "请输入下架单号";
                   die(json_encode($result));
              } else {
                   if ($op_code['op_pack_end'] == "0000-00-00 00:00:00" || $op_code['op_pack_end'] == "") {
                        $time = array(
                                "op_pack_end" => date("Y-m-d H:i:s"),
                        );
                        $update = Order_Service_OrderPickup::update($time, $op_code['op_id']);
                        $result = array('ask' => 1, 'msg' => '打包结束时间更新成功');
                        die(json_encode($result));
                   } else {
                        $result['msg'] = "该订单已打包结束";
                        die(json_encode($result));
                   }
              }
         }
    }
    
    展开全文
  • 数据统计功能优化

    2012-02-29 10:59:16
    现在的问题是通过学生信息和关系可以查到两个家长的信息,如何将两条信息合并为一条,实现统计功能。 现有的方法有游标、多次读取数据库。 像人人这种大型的社交网站数据量非常大,是如何实现这种统计的。
  • TeaWeb是一个可视化的Web代理服务,目标是将代理服务、日志、统计、监控等集成在同一个服务中,让开发者简单地启动就可以使用。 * Proxy * 全面改进Web...

    TeaWeb是一个可视化的Web代理服务,目标是将代理服务、日志、统计、监控等集成在同一个服务中,让开发者简单地启动就可以使用。

    * Proxy
       * 全面改进Web代理统计底层设计
           * 增加30多个数据指标
           * 提供图表制作在线编辑器,提供Javascript API
       * 代理服务可以拖动排序
       * 后端服务器增加https支持
       * 后端服务器增加读取超时时间设置 
       * 日志中增加错误信息页
       * 可以查看最近60天的历史日志
       * 日志中增加后端服务器、路径规则、重写规则、Fastcgi等筛选项
    *  Agent 
        * 增加分组管理,每个分组可以单独设置通知选项
        *  监控项改进
           * 监控项阈值增加加减乘除支持
           * 支持多级数据获取方式如${data.user.name}  
           * 阈值增加动作,可以在满足条件时,调用一个或多个脚本
    * 其他
        * 登录页增加记住登录选项
        * 增加Dockerfile和相关脚本
        * 增加监控项数据API
        * 更新MongoDB驱动

    升级注意:从 v0.0.9以前升级时,请把新的版本的configs/widgets拷贝到老版本的configs/目录下。

    二进制版本下载地址:http://plus.teaos.cn/download
    Demo地址:http://teaos.cn:7777/
    Gitee地址:https://gitee.com/liuxiangchao/build

     

     

    展开全文
  • 文章目录【12.2 新功能优化统计顾问(Optimizer Statistics Advisor)及常见问题关键字Keyword优化统计顾问概述常见问题和解决方法:问题1:ORA-12012, ORA-20001等错误问题2:SYSAUX表空间增长过快■ 关于...

    【12.2 新功能】优化器统计顾问(Optimizer Statistics Advisor)及常见问题

    关键字Keyword

    Optimizer Statistics Advisor,统计信息 ,ORA-20001 , ORA-00932 ,12.2.0.1

    优化器统计顾问概述

    对于Oracle的CBO优化器而言,统计信息是其最重要的组成部分。
    因此,Oracle在统计信息的准确性方面不断地进行优化和加强。
    从12.2版本开始,Oracle推出了优化器统计顾问(Optimizer Statistics Advisor),
    根据事先定义的规则,定期执行,提供给用户参考的统计信息收集相关的建议。

    参考:

    Home/Database/Oracle/Oracle Database/Release 12.2
    SQL Tuning Guide
    https://docs.oracle.com/en/database/oracle/oracle-database/12.2/tgsql/optimizer-statistics-advisor.html#GUID-054F4B76-DD57-46EE-98EA-0FF04F49D1B3
    >18 Analyzing Statistics Using Optimizer Statistics Advisor
    
    Optimizer Statistics Advisor In 12.2 (Quick Overview) (Doc ID 2259398.1)
    12c Release 2 New Feature : Statistics Advisor (Walk-Through) (Doc ID 2360311.1)
    AUTO_STATS_ADVISOR_TASK Running Outside of Maintenance Window (Doc ID 2387110.1)
    

    统计信息收集相关内容:

    数据库自动维护任务介绍
    数据库自动维护任务介绍(二)
    自动统计信息收集Automatic Optimizer Statistics Collection
    自动段指导Automatic Segment Advisor

    在12.2.0.1以后的版本上运行该功能时,遇到问题的报告很多,但是Oracle也在不断地修正着相关地问题,所以保持数据库为最新版本通常是一个最佳的选择。

    常见问题和解决方法:

    问题1:ORA-12012, ORA-20001等错误

    由于12.2.0.1等版本上的设计不足(Bug) 等,可能会在告警日志(alert log)或者JOB跟踪日志中,发现ORA-12012, ORA-20001等错误。

    例:

    >ORA-12012: error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_nn"
    >ORA-20001: Statistics Advisor: Invalid Task Name For the current user
    >ORA-06512: at "SYS.DBMS_STATS", line 46861
    >ORA-06512: at "SYS.DBMS_STATS_ADVISOR", line 734
    >ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 19930
    >ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 21934
    >ORA-06512: at "SYS.DBMS_STATS", line 46851
    

    可以参考如下方法尝试解决。

    1.通过dbms_stats.init_package()程序包,重新创建优化器统计顾问任务。

    例:
    EXEC dbms_stats.init_package();
    
    1. 首先看看这个bug 27983174和27774706是否被修复,如果存在则建议打上补丁或打上最新的RU.
      如果没有被修复,可向官方技术支持申请Patch 27983174 和Patch 27774706 补丁并应用。

    2. 应用Patch 27774706 补丁后,执行如下操作:

    $ sqlplus / as sysdba
    drop table WRI$_ADV_DEFINITIONS;
    @?/rdbms/admin/catadvtb.sql
    @?/rdbms/admin/utlrp.sql
    execute dbms_advisor.setup_repository;
    EXEC dbms_stats.init_package();
    

    4.如果应用Patch 27774706 补丁过程中出错的话,试着执行如下命令手动更新状态。

    UPDATE dba_registry_sqlpatch
    SET status = 'SUCCESS', action_time = SYSTIMESTAMP
    WHERE patch_id = 27774706 and status='WITH ERRORS' and rownum=1;
    commit;
    

    很多问题会在19c以后的版本进行修复,所以有可能的话注意保持版本的更新。

    参考:

    Recurring ORA-12012, ORA-20001, ORA-06512 In Container Database (Doc
    ID 2420581.1) 12.2.0.0.2 Automatic Statistics Advisor Job Errors with
    Statistics Fatal Error (Doc ID 2448436.1) Version 12.2.0.1 to
    18.3.0.0.0 ORA-12012 Error on auto execute of job “SYS”."ORA$AT_OS_OPT_SY_ in 12.2.0 Database version or higher
    release (like 18c) (Doc ID 2127675.1) Version 12.2.0.1 and later

    问题2:SYSAUX表空间增长过快

    由于优化器统计顾问的执行,SYSAUX表空间增长过快,导致可用表空间不足。

    特征:
    VSYSAUXOCCUPANTSSM/ADVISORDBASEGMENTSWRISYSAUX_OCCUPANTS中,SM/ADVISOR占据大量空间 DBA_SEGMENTS中,WRI_ADV_OBJECTS占据大量空间

    解决方法:

    1. 尝试删除Statistics Advisor 任务(AUTO_STATS_ADVISOR_TASK),然后重建。

      具体删除方法例:

    connect / as sysdba
    --1.1 删除Statistics Advisor 任务
    DECLARE
    v_tname VARCHAR2(32767);
    BEGIN
    v_tname := 'AUTO_STATS_ADVISOR_TASK';
    DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
    END;
    /
    
    --1.2 删除任务之后,重组表和所有索引
    SQL> ALTER TABLE WRI$_ADV_OBJECTS MOVE;
    SQL> ALTER INDEX WRI$_ADV_OBJECTS_IDX_01 REBUILD;
    SQL> ALTER INDEX WRI$_ADV_OBJECTS_PK REBUILD;
    
    注:如果在删除过程中,发生ORA-20001等错误的话,可以执行下面的方法重建AUTO_STATS_ADVISOR_TASK来解决,
        然后再执行上面的删除方法,最终达到删除Statistics Advisor 任务(AUTO_STATS_ADVISOR_TASK)的目的。
    
        SQL> connect / as sysdba
        SQL> EXEC DBMS_STATS.INIT_PACKAGE();
    
    2. 缩短任务执行历史的保存时间
    

    – 确认当前设定的保持期间
    select task_name, parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
    where task_name=‘AUTO_STATS_ADVISOR_TASK’ and PARAMETER_NAME like ‘%EXPIRE%’;

    -- 修改设定的保持期间
    可以通过下面的命令,将EXECUTION_DAYS_TO_EXPIRE修改为10天,即执行历史数据的保存时间为10天:
    
    connect /as sysdba
    BEGIN
     DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER (
      task_name => 'AUTO_STATS_ADVISOR_TASK'
     , parameter => 'EXECUTION_DAYS_TO_EXPIRE'
     , value => 10
    );
    END;
    /
    

    参考:

    How To Set DAYS_TO_EXPIRE and EXECUTION_DAYS_TO_EXPIRE of Automatic Statistics Advisor Task (Doc ID 2544788.1)

    注:未来版本中,可以通过如下方法禁用Statistics Advisor 任务。
        现阶段(2020/1)无法禁用这个任务。
        
    DECLARE
    filter1 CLOB;
    BEGIN
    filter1 := DBMS_STATS.CONFIGURE_ADVISOR_RULE_FILTER('AUTO_STATS_ADVISOR_TASK',NULL,NULL,'DISABLE');
    END;
    /
    

    参考:

    升级DB到12.2.0.1版本之后,由于统计信息顾问导致SYSAUX 过快增长 (Doc ID 2440139.1) SYSAUX
    Tablespace Grows Rapidly After Upgrading Database to 12.2.0.1 Due To
    Statistics Advisor (Doc ID 2305512.1)

    3. 12.2.0.1版本由于Bug 26764561的影响,即使EXECUTION_DAYS_TO_EXPIRE设成10天后,优化器统计顾问相关段依然不断增加。 
       所以首先看看这个bug是否被修复,如果存在则建议打上补丁或打上最新的RU。
    

    参考:

    AUTO_STATS_ADVISOR_TASK Not Purging Even Though Setting EXECUTION_DAYS_TO_EXPIRE (Doc ID 2615851.1)

    Bug 26764561(Doc ID 26764561.8)

      ※注意打补丁后的Postinstallation内容
    

    ■ 关于EXECUTION_DAYS_TO_EXPIRE的默认值:

    ver<=18.3
        SQL> EXEC DBMS_STATS.INIT_PACKAGE();
        PL/SQL procedure successfully completed.
    
        SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
          WHERE task_name='AUTO_STATS_ADVISOR_TASK'
          and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';
          2    3
        PARAMETER_NAME
        --------------------------------------------------------------------------------
        PARAMETER_VALUE
        --------------------------------------------------------------------------------
        EXECUTION_DAYS_TO_EXPIRE
        UNLIMITED
    
    Version 19.3.0.0.0 &18.5 (Bug 27983174修复后)
    
        SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
                  WHERE task_name='AUTO_STATS_ADVISOR_TASK'
                  and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';  2    3
        PARAMETER_NAME
        --------------------------------------------------------------------------------
        PARAMETER_VALUE
        --------------------------------------------------------------------------------
        EXECUTION_DAYS_TO_EXPIRE
        30
    

    问题3:关于在多租户环境中 CDB/PDB的设置问题

    对于多租户环境中,CDB/PDB的设置相对独立,互相不影响。

    ■EXECUTION_DAYS_TO_EXPIRE的CDB/PDB设置测试:

        ---CDB側
        SQL> conn / as sysdba
        Connected.
        SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
                          WHERE task_name='AUTO_STATS_ADVISOR_TASK'
                          and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';  2    3
    
    
        PARAMETER_NAME
        --------------------------------------------------------------------------------
        PARAMETER_VALUE
        --------------------------------------------------------------------------------
        EXECUTION_DAYS_TO_EXPIRE
        UNLIMITED
    
    
    
    
        SQL> show pdbs
    
    
            CON_ID CON_NAME                       OPEN MODE  RESTRICTED
        ---------- ------------------------------ ---------- ----------
                 2 PDB$SEED                       READ ONLY  NO
                 3 PDB1                           READ WRITE NO
        SQL>
        BEGIN
         DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER (
          task_name => 'AUTO_STATS_ADVISOR_TASK'
        , parameter => 'EXECUTION_DAYS_TO_EXPIRE'
        , value => 30
        );
        END;
        /
        SQL>   2    3    4    5    6    7    8
        PL/SQL procedure successfully completed.
    
    
        SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
                          WHERE task_name='AUTO_STATS_ADVISOR_TASK'
                          and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';   2    3
    
    
        PARAMETER_NAME
        --------------------------------------------------------------------------------
        PARAMETER_VALUE
        --------------------------------------------------------------------------------
        EXECUTION_DAYS_TO_EXPIRE
        30
    
       ---PDB側
        SQL> alter session set container=pdb1;
        Session altered.
       SQL> SELECT parameter_name, parameter_value FROM DBA_ADVISOR_PARAMETERS
                          WHERE task_name='AUTO_STATS_ADVISOR_TASK'
                          and PARAMETER_NAME IN 'EXECUTION_DAYS_TO_EXPIRE';  
        PARAMETER_NAME
        --------------------------------------------------------------------------------
        PARAMETER_VALUE
        --------------------------------------------------------------------------------
        EXECUTION_DAYS_TO_EXPIRE
        UNLIMITED
    
    
        SQL> show pdbs
            CON_ID CON_NAME                       OPEN MODE  RESTRICTED
        ---------- ------------------------------ ---------- ----------
                 3 PDB1                           READ WRITE NO
        SQL>
    

    ■PDB/CDB的JOB关联性的测试:

    SQL> conn / as sysdba
    Connected.
    SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
    where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’); 2
    AUTO_STATS_ADVISOR_TASK 25-SEP-19 CMD SYS

    SQL> DECLARE
    v_tname VARCHAR2(32767);
    BEGIN
    v_tname := ‘AUTO_STATS_ADVISOR_TASK’;
    DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
    END;
    / 2 3 4 5 6 7
    PL/SQL procedure successfully completed.

    SQL> select name, ctime, how_created,OWNER_NAME from sys.wriadvtaskswherenamein(AUTOSTATSADVISORTASK,INDIVIDUALSTATSADVISORTASK);2norowsselectedSQL>showpdbs2PDB_adv_tasks where name in ('AUTO_STATS_ADVISOR_TASK','INDIVIDUAL_STATS_ADVISOR_TASK'); 2 no rows selected SQL> show pdbs 2 PDBSEED READ ONLY NO
    3 PDB1 READ WRITE NO

    —PDB中JOB的状态
    SQL> alter session set container=pdb1;
    Session altered.

    SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
    where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’);
    2 AUTO_STATS_ADVISOR_TASK 26-JAN-17 CMD SYS
    INDIVIDUAL_STATS_ADVISOR_TASK 26-JAN-17 CMD SYS

    SQL> DECLARE
    v_tname VARCHAR2(32767);
    BEGIN
    v_tname := ‘AUTO_STATS_ADVISOR_TASK’;
    DBMS_STATS.DROP_ADVISOR_TASK(v_tname);
    END;
    / 2 3 4 5 6 7
    PL/SQL procedure successfully completed.

    SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
    where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’);
    2 INDIVIDUAL_STATS_ADVISOR_TASK 26-JAN-17 CMD SYS

    —CDB 不会影响PDB
    SQL> conn / as sysdba
    Connected.
    SQL> EXEC DBMS_STATS.INIT_PACKAGE();
    PL/SQL procedure successfully completed.

    SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
    where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’);
    2 AUTO_STATS_ADVISOR_TASK 15-NOV-19 CMD SYS
    INDIVIDUAL_STATS_ADVISOR_TASK 15-NOV-19 CMD SYS

    SQL> alter session set container=pdb1;
    Session altered.

    SQL> select name, ctime, how_created,OWNER_NAME from sys.wri$_adv_tasks
    where name in (‘AUTO_STATS_ADVISOR_TASK’,‘INDIVIDUAL_STATS_ADVISOR_TASK’);
    2 INDIVIDUAL_STATS_ADVISOR_TASK 26-JAN-17 CMD SYS
    SQL>

    问题4:PGA 限制ORA-4036

    在执行统计信息收集JOB等的过程中会调用优化器统计顾问任务。
    如果Statistics Advisor 任务的数据过多,有可能导致在执行统计信息收集JOB过程中引发ORA-4036.
    例如输出的跟踪日志中的HEAP DUMP中qosadvCreateSu Chunk占用了较大空间,qosadvCreateSu是Statistics Advisor运行时所需的heap。

        PRIVATE HEAP SUMMARY DUMP
        2582 MB total:
          1969 MB commented, 975 KB permanent
           612 MB free (0 KB in empty extents),
            2557 MB,   2 heaps:   "callheap       "            607 MB free held
        ------------------------------------------------------
        Summary of subheaps at depth 1
        1962 MB total:
          1957 MB commented, 4805 KB permanent
          1136 KB free (0 KB in empty extents),
            1940 MB,   1 heap:    "qosadvCreateSu "           ★
    

    可以通过定期删除Statistics Advisor 任务的数据 或者增加PGA_AGGREGATE_LIMIT的大小来解决。

    专注于技术不限于技术!
    用碎片化的时间,一点一滴地提高数据库技术和个人能力。
    欢迎关注微信订阅号:Oracle数据库技术(TeacherWhat)

    在这里插入图片描述

    展开全文
  • 这篇文章我将会写这两天在一个人才服务业务管理系统项目中碰到的一个关于对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的作用就是防止出错

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



    展开全文
  • Job在Logical 备库不会自动执行, 那么也就是在Oracle10g Logical Standby上不能使用自动统计优化功能(必须手工或脚本执行) ? [ 本帖最后由 tolywang 于 2009-10-14 18:04 编辑 ] 来自 “ ITPUB博客 ” ...
  • 该引擎利用基于统计分析的策略优化机制动态精化策略,并将精化的策略由于统计分析的多级缓存机制存储频繁调用的请求结果对、属性和策略信息。仿真结果表明,HPEngine所采用的基文本形式转化为数值形式;同时采用基于...
  • 本文在实现统计各部门员工薪水总和功能的基础上进行,还没实现的话请参考:实现统计各部门员工薪水总和功能 优化项目: 1.使用序列化 2.实现分区Patitioner 3.Map使用Combiner 使用序列化 本案例是在实现...
  • PV统计优化设计

    2017-12-02 11:41:32
    经调研发现这绝对是一个坑,pv、uv统计存在的设计看起来简单,但是瞬间流量大,特别是有抢购等功能时,设计不良会导致数据库访问压力大,还存在被用心不良者利用等情况。 系统原先设计是将用户的请求放到redis中去,...
  • 对于大数据量,多层分组的的汇总报表不能采用分页标签,可以采用如下的优化方案: 一、先初步对报表进行优化: 1、尽量在sql实现group分组,数据库虽然要进行分组运算,但是数据库中有索引,运算速度快,且 取到...
  • 亲爱的DREP社区成员: ...DREP手机客户端持续优化各项使用功能,提升DREP云钱包登录时的验证速度,优化链上资产的获取速度,使链上交易更加流畅稳定;DREP区块链浏览器后台添加交易及区块数据的...
  • 五一假期,进行第二次博客优化,新增博客分年月存放、博客按年份归档、统计站点文章数目、网站访问数量统计、留言板、接入豆瓣书影音功能 本文首发我的博客-博客更新日志20200501 一、博客分年月存放 在根目录_...
  • 这是一个用户推荐统计以及排序的功能 想实现的效果是查询出用户的姓名 然后统计 他的推荐总人数 以及被推荐人 每个 状态的 人数 <p><br /> 使用 orderBy 排序会出现 sql 执行时间数十秒的情况 不...
  • 阿里云CloudDBA具有SQL优化建议功能,包括SQL重写建议和索引建议。SQL索引建议是帮助数据库优化器创造最佳执行路径,需要遵循数据库优化器的一系列规则来实现。CloudDBA需要首先计算表统计信息,是因为:数据库优化...
  • Pynance:财务优化应用 这是一种金融应用程序,它使用从各种来源(主要是和检索到的数据来计算资产相关性,统计数据和最佳投资组合分配。 统计数据是使用,应与和要求的结果一致。 通过最小化投资组合的方差/波动性...
  • 江苏联通采用DSG SmartE架构用于优化其企业信息系统平台。通过该架构,将江苏联通的综合营帐系统和计费系统上的主要业务数据实时复制到DSG数据平台上,形成江苏联通“第二数据中心”,承担了以下几类业务:提供VIP...
  • 网站的站内搜索功能优化如何做 文章目录前言一、分析搜索关键词二、搜索同义词提示三、关键词转化率总结 前言 随着网站的信息量,栏目数量,内容数量的逐渐丰富,一般我们在单个页面或者导航中很难寻找到目标内容...
  • 阿里云CloudDBA具有SQL优化建议功能,包括SQL重写建议和索引建议。SQL索引建议是帮助数据库优化器创造最佳执行路径,需要遵循数据库优化器的一系列规则来实现。CloudDBA需要首先计算表统计信息,是因为: 数据库...
  • 小弟,对数据库不熟,现在有一张表,要根据某一字段做统计功能,表的数据量非常大,同时这个表每天都有数据插入,所以用索引不是很现实,希望各位大侠给些建议,帮忙解决一下.
  • 本文介绍12c的自动重新优化(Automatic Reoptimization 以后简称AR)功能统计反馈(Statistics Feedback)和性能反馈(Performance Feedback)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,733
精华内容 1,093
关键字:

统计功能优化