精华内容
下载资源
问答
  • 优化分析模型

    千次阅读 2015-07-28 22:25:20
    优化分析模型应该关注以下几点: 1、容易变化的需求 容易变化的需求需要给予关注。如果一个需求在调研时就发现它很不稳定,那么客户说不清楚,要么客户承认他们还在调整,或者客户的各个单位之间并不统一,这时就...

    优化分析模型应该关注以下几点:

    1、微笑容易变化的需求

    容易变化的需求需要给予关注。如果一个需求在调研时就发现它很不稳定,那么客户说不清楚,要么客户承认他们还在调整,或者客户的各个单位之间并不统一,这时就应当考虑优化分析模型,让其带有一定的可扩展的能力。例如采用一些设计模式来避免硬编码业务逻辑。

    2、微笑结构化和耦合度的调整

    不好的结构是网状结构,对象之间相互依赖。这样的结构耦合度高,扩展能力和适应能力差,改动程序时经常牵一而动全身。好的结构应该是树状的结构,对象之间的依赖是单向的,不交叉的。如果发现得到的分析模型具有不好的结构,则应当优化之。

    3、微笑交互集中点调整

    若某一个对象的交非常多,他依赖或关联到很多类,这个对象就是问题多发地带!也就是通常所说的关键链、瓶颈等,应当考虑优化它。优化的方法一般有重新规划职责、增加冗余对象、增加中间调和对象等方法。

    展开全文
  • MySQL索引优化分析4—关联查询与子查询优化1.关联查询优化1.1 案例1.2 建议2.子查询优化 之前介绍了单表查询中的索引优化,本节将介绍关联查询中的索引优化。 1.关联查询优化 案例将使用的数据表的创建如下: # 1....

    MySQL索引优化分析4—关联查询与子查询优化

    之前介绍了单表查询中的索引优化,本节将介绍关联查询中的索引优化。

    1.关联查询优化

    案例将使用的数据表的创建如下:

    # 1.创建图书类型表class
    CREATE TABLE IF NOT EXISTS `class` (
    	`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    	`card` INT(10) UNSIGNED NOT NULL,
    	PRIMARY KEY (`id`)
    );
    # 2.创建图书信息表book
    CREATE TABLE IF NOT EXISTS `book` (
    	`bookid` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    	`card` INT(10) UNSIGNED NOT NULL,
    	PRIMARY KEY (`bookid`)
    );
    

    在这里插入图片描述在这里插入图片描述

    1.1 案例

    1)开始explain分析

    EXPLAIN SELECT * FROM book  LEFT JOIN class ON class.card = book.card;
    

    在这里插入图片描述
    结论:type 为 All,全表扫描。

    2)为book的card字段添加索引优化,并删除class中id小于5的记录:

    ALTER TABLE `book` ADD INDEX Y (`card`);
    Delete from class where id<5;
    

    3)第2次explain

    # class为主表,book表为被驱动表:索引在book表上
    EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card = book.card;
    

    在这里插入图片描述

    可以看到第二行的 type 变为了 ref,rows 也变成了优化比较明显。

    这是由左连接特性决定的。LEFT JOIN 条件用于确定如何从右表搜索行,而左边的行一定都有,所以右边是我们的关键点,一定需要建立索引。

    4)可以对比索引表放在LEFT JOIN左边主表的位置:

    在这里插入图片描述

    可以看出,虽使用了索引,但由于Left Join主表book的所有记录都需要查询,所以索引并没有发挥效用,rows依旧是20。

    5)删除旧索引 + 新建class表新索引 + 使用inner join第3次explain

    DROP INDEX Y ON book;
    ALTER TABLE class ADD INDEX X (card);
    EXPLAIN SELECT * FROM class Inner JOIN book ON class.card = book.card;
    

    在这里插入图片描述

    inner join 时,mysql会将有索引的表选为被驱动表

    1.2 建议

    1)保证被驱动表的join字段已经被索引

    2)left join 时,选择小表作为驱动表,大表作为被驱动表。

    3)inner join 时,mysql会自己帮你把小结果集的表选为驱动表。

    4)子查询尽量不要放在被驱动表,有可能使用不到索引。

    5)能够直接多表关联的尽量直接关联,不用子查询。

    2.子查询优化

    1.尽量不要使用not in 或者 not exists

    SELECT SQL_NO_CACHE  age,count(*)  
    FROM emp a 
    WHERE  id  NOT  IN (
    		SELECT ceo 
    		FROM dept b2 
    		WHERE ceo IS NOT NULL
    		)
    Group By age 
    Having count(*)<10000
    

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2.用left outer join on xxx is null 替代 NOT IN

    EXPLAIN SELECT SQL_NO_CACHE age,count(*) 
    FROM  emp a LEFT OUTER JOIN dept b ON a.id =b.ceo
    WHERE b.ceo IS   NULL
    group by age 
    having count(*)<10000
    

    对比1的执行计划,有所提升:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • oracle数据库级别优化分析工具

    千次阅读 2018-07-05 21:27:06
    oracle数据库级别优化分析工具介绍当我们对数据库优化诊断时,需要收集相应的信息以供参考,从个人的使用经验来说,这种统计数据分为两大类一类是数据库级别的统计信息二类是os级别的统计信息下面就分别介绍在不同的...

    oracle数据库级别优化分析工具介绍


    当我们对数据库优化诊断时,需要收集相应的信息以供参考,从个人的使用经验来说,这种统计数据分为两大类

    一类是数据库级别的统计信息
    二类是os级别的统计信息

    下面就分别介绍在不同的级别下,常用什么工具来收集信息帮助优化诊断

    首先是oracle数据库级别优化分析工具介绍

    目录:

    1.statspack
    2.ASH
    3.AWR
    4.ORACLE EXPLAIN PLAN的总结(查询sql的执行计划)
       a.autotrace
       b.explain的使用


    1.statspack 

    a。安装

    sql> sqlplus "/ as sysdba"

    SQL> select file_name from dba_data_files;

    SQL> create tablespace perfstat datafile 'e:/oracle/oradata/skate/perfstat.dbf' size 2000m;

    sql> @ORACLE_HOME/rdbms/admin/spcreate.sql

    b。使用

    SQL> conn perfstat/passwd

    收集统计信息
    sql> execute statspack.snap

    SQL> exec statspack.SNAP(i_snap_level =>5);

    生成报告
    sql> @ORACLE_HOME/rdbms/admin/spreport.sql

    定时收集信息有两种方式,一种是oracle job,一种是os的crontab,我比较习惯用os级别的crontab

    设定其每个小时自动收集一次采样的job

    declare
    Variable  job  number ; 
    begin 
      dbms_job.submit(:job, "statspack.snap;" ,trunc( sysdate + 1/24 , 'hh24' ), "trunc(sysdate+1/24,'hh24')" ); 
      commit ; 
    end ; 
    /

    查看job使用情况

    SQL> select job,schema_user,next_date,interval,what from user_jobs 

    自动停止采样job

    declare
    Variable  job  number ; 
    begin 
      dbms_job.submit(:job, "dbms_job.broken(44,true);" ,trunc( sysdate + 1 ), "null" ); 
      commit ; 
    end ; 
    /

    清空所有stats统计信息表里的数据

    sql> @ORACLE_HOME/rdbms/admin/sptrunc.sql

     

    snapshot的level,这可以通过EXEC STATSPACK.MODIFY_STATSPACK_PARAMETER(i_snap_level=N)来修改,N可以为0,5,6,7,10,缺省为5。

       0 仅提供一般性能统计
       5 增加了对SQL语句总体分析
       6 增加了SQL计划和使用
       7 增加了分段(Segments)级的统计
       10增加了对闩锁(Latches)的分析


      其中文档建议对10要慎重,因为代价较高。

    eg:
    SQL> exec statspack.SNAP(i_snap_level =>6);

     

    oracle不仅提供生成数据库报告的脚本spreport.sql,还提供另一个statspack 报告脚本sprepsql.sql来生成SQL的报告

    sql> @ORACLE_HOME/rdbms/admin/sprepsql.sql

    参考文档:
    利用statspack来获取生成环境中top SQL及其执行计划
    http://www.hellodba.com/Doc/statspack_report_sql.htm

     

     

     

    2.AWR

    awr是建库是自动配置和启用的,他对性能数据的收集默认是一小时,awr对历史数据的分析

    生成报告脚本在目录下生成报告使用$ORACLE_HOME/rdbms/admin/,如下:

    awrrpt.sql :生成指定快照区间的统计报表;
    awrrpti.sql :生成指定数据库实例,并且指定快照区间的统计报表;
    awrsqlrpt.sql :生成指定快照区间,指定SQL语句(实际指定的是该语句的SQLID)的统计报表;
    awrsqrpi.sql :生成指定数据库实例,指定快照区间的指定SQL语句的统计报表;
    awrddrpt.sql :指定两个不同的时间周期,生成这两个周期的统计对比报表;
    awrddrpi.sql :指定数据库实例,并指定两个的不同时间周期,生成这两个周期的统计对比报表;


    修改Snapshots设置
      通过MODIFY_SNAPSHOT_SETTINGS过程,DBA可以调整包括快照收集频率、快照保存时间、以及捕获的SQL数量三个方面的设置。 分别对应MODIFY_SNAPSHOT_SETTINGS的三个参数:

    Retention :设置快照保存的时间,单位是分钟。可设置的值最小为1天,最大为100年。设置该参数值为0的话,就表示永久保留收集的快照信息

    Interval :设置快照收集的频率,以分钟为单位。可设置的值最小为10分钟,最大为1年。如果设置该参数值为0,就表示禁用AWR特性。

    Topnsql :指定收集的比较占用资源的SQL数量,可设置的值最小为30,最大不超过100000000。

    AWR相关几个视图:

    DBA_HIST_WR_CONTROL:查看当前快照收集的相关设置
    v$active_session_history:由ASH自动在内存中维护,以每秒一次的频率收集当前系统中活动session的信息
    dba_hist_active_sess_history:是视图v$active_session_history的历史数据,保存在硬盘上
    dba_hist_database_instance:显示数据库是实例的信息
    dba_hist_snapshot:当前数据库收集到的快照信息


    3.ASH

    ash和awr不是完全分离的两个功能,ash以秒为单位从v$session中收集信息并保存在内存中,这块内存可以重用,内存满时,ASH数据交给AWR,最后写入系统视图

    ash包括两部分内容,一部分是SGA中的,这部分反映是本次系统启动以来的数据,并且ASH尽量保留1小时的内容,这部分内容保存在v$active_session_history另一部分保存在系统字典表里dba_hist_active_sess_history,是永久的数据

    ASH也有生成报告的脚本,在目录下$ORACLE_HOME/rdbms/admin/

    ashrpt.sql: 生成数据库级别的ASH统计报表
    ashrpti.sql: 生成数据库实例级别的ASH统计报表,常用于RAC单实例 

     

    4.ORACLE EXPLAIN PLAN的总结(查询sql的执行计划)

    a.autotrace

    安装

    用sys用户运行脚本ultxplan.sql

    建立这个表的脚本是:(UNIX:$ORACLE_HOME/rdbms/admin, Windows:%ORACLE_HOME%/rdbms/admin)ultxplan.sql。

    SQL> connect sys/sys@colm2 as sysdba;

    SQL> @C:/oracle/ora92/rdbms/admin/utlxplan.sql;

    SQL> create public synonym plan_table for plan_table;--建立同义词

    SQL> grant all on plan_table to public;--授权所有用户

    要在数据库中建立一个角色plustrace,用sys用户运行脚本plustrce.sql来创建这个角色,这个脚本在目
    录(UNIX:$ORACLE_HOME/sqlplus/admin, Windows:%ORACLE_HOME%/sqlplus/admin)中;

    SQL> @C:/oracle/ora92/sqlplus/admin/plustrce.sql;

    然后将角色plustrace授予需要autotrace的用户;

    SQL>grant plustrace to public

    经过以上步骤的设置,就可以在sql*plus中使用autotrace了,autotrace功能只能在SQL*PLUS里使用


    AUTOTRACE Statistics常用列解释

     db block gets :从buffer cache中读取的block的数量
     consistent gets:从buffer cache中读取的undo数据的block的数量
     physical reads: 从磁盘读取的block的数量
     redo size: DML生成的redo的大小
     sorts (memory):在内存执行的排序量
     sorts (disk):在磁盘上执行的排序量
     

    eg: 

    SYS@db>set autotrace           
    Usage: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]

    SYS@db>set timing on

    SYS@db>set autot trace exp stat

    SYS@db>select * from tab;

    3809 rows selected.

    Elapsed: 00:00:00.06

    Execution Plan
    ----------------------------------------------------------

    ---------------------------------------------------------------------
    | Id  | Operation             | Name   | Rows  | Bytes | Cost (%CPU)|
    ---------------------------------------------------------------------
    |   0 | SELECT STATEMENT      |        |  1059 | 46596 |   216   (2)|
    |   1 |  NESTED LOOPS OUTER   |        |  1059 | 46596 |   216   (2)|
    |   2 |   TABLE ACCESS FULL   | OBJ$   |  1059 | 39183 |   158   (2)|
    |   3 |   TABLE ACCESS CLUSTER| TAB$   |     1 |     7 |     1   (0)|
    |   4 |    INDEX UNIQUE SCAN  | I_OBJ# |     1 |       |     0   (0)|
    ---------------------------------------------------------------------

    Note
    -----
       - 'PLAN_TABLE' is old version

    Statistics
    ----------------------------------------------------------
              0  recursive calls
              0  db block gets
           9077  consistent gets
              0  physical reads
              0  redo size
         133502  bytes sent via SQL*Net to client
           3252  bytes received via SQL*Net from client
            255  SQL*Net roundtrips to/from client
              0  sorts (memory)
              0  sorts (disk)
           3809  rows processed

     

    b。EXPLAIN的使用

        Oracle RDBMS执行每一条SQL语句,都必须经过Oracle优化器的评估。所以,了解优化器是如何选择(搜索)路径以
        及索引是如何被使用的,对优化SQL语句有很大的帮助。Explain可以用来迅速方便地查出对于给定SQL语句中的查
        询数据是如何得到的即搜索路径(我们通常称为Access Path)。从而使我们选择最优的查询方式达到最大的优化效果。

    1.1 、安 装                                                                                                                      

     要使用EXPLAIN首先要执行相应的脚本,创建出Explain_plan表。

    具体脚本执行如下:

       $ORACLE_HOME/rdbms/admin/utlxplan.sql (UNIX)  该脚本后会生成一个表这个程序会创建一个名为plan_table的表。

    1.2 、使用

    常规使用语法:
    explain PLAN [ SET STATEMENT_ID [=] < string literal > ] [ INTO < table_name > ]
    FOR < sql_statement >

    其中:

    STATEMENT_ID:是一个唯一的字符串,把当前执行计划与存储在同一PLAN中的其它执行计划区别开来。

    TABLE_NAME:是plan表名,它结构如前所示,你可以任意设定这个名称。

    SQL_STATEMENT:是真正的SQL语句。                                                            

    比如:                                                                                                               

    SQL>explain plan set statement_id='T_TEST' for select * from t_test;            

    SQL>

    Explained

    执行下面语句可以查询到执行计划

    SQL>SELECT A.OPERATION,OPTIONS,OBJECT_NAME,OBJECT_TYPE,ID,PARENT_ID
      2  FROM PLAN_TABLE  a
      3  WHERE STATEMENT_ID='T_TEST'
      4  ORDER BY Id;

    也可以用这句话 select * from table(dbms_xplan.display); 可以把所有PLAN_TABLE里的数据罗列出来。

    展开全文
  • jdk不同版本对String拼接的优化分析

    千次阅读 2017-02-03 16:38:20
    jdk不同版本对String拼接的优化分析 1. 测试demo代码 测试循环中字符串拼接优化 public class ForTest { public static void main(String[] args) { String a = "0"; for (int i = 1; i 10; i++) { a = a +

    1. 测试demo代码

    • 测试循环中字符串拼接优化
    public class ForTest {
        public static void main(String[] args) {
            String a = "0";
            for (int i = 1; i < 10; i++) {
                a = a + "i";
            }
            System.out.println(a);
        }
    }

    2. 测试循环中字符串拼接优化

    1. jdk5
      jdk5对ForTest代码反编译

    2. jdk6
      jdk6对ForTest代码反编译

    3. jdk7
      jdk7对ForTest代码反编译

    4. jdk8
      jdk8对ForTest代码反编译

      结论:

      1. 对比jdk5-8所有版本下的反编译字节码,发现结果相同,证明字符串拼接从jdk5开始就已经完成了优化,并且没有进行新的优化。
      2. 详细看反编译后的字节码,8开始进入for循环比较阶段,11new一个新的StringBuilder,为了优化之后的String+操作。34循环结束,重新到5,将会在11重新new一个StringBuilder。
      3. 循环外字符串拼接可以直接使用String的+操作,没有必要通过StringBuilder进行append.
      4. 由于循环中每次都会回到5,所以会不停的创建StringBuilder对象,除了循环体后就成了无效对象,这样会产生大量的垃圾对象。所以好的做法是在循环外声明StringBuilder对象,在循环内进行手动append。不论循环多少层都只有一个StringBuilder对象。
    展开全文
  • 常用优化工具分析: ##HierarchyViewer 查找Activity中的布局是否过于复杂 ##过度渲染测试 通过手机设置里面的开发者选项,打开Show GPU Overdraw的选项,可以观察UI上的Overdraw情况。 ##Traceview 方法跟踪...
  • 使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。 2、用法: Explain+SQL语句。 3、Explain字段解释 Explain执行后返回的信息: id...
  • oracle数据库级别优化分析工具介绍

    千次阅读 2010-03-04 19:17:00
    author:skatetime:2010/03/04 oracle数据库级别优化分析工具介绍当我们对数据库优化诊断时,需要收集相应的信息以供参考,从个人的使用经验来说,这种统计数据分为两大类 一类是数据库级别的统计信息二类是os...
  • 环境配置如下图: 测试数据如下.... type的取值在很大的程度上反应了SQL的执行性能, 按照性能由高到底,type的取值依次为:NULL,system,const,eq_reg,ref,range,index,ALL
  • -拓扑优化流程-在工程机械的机械结构中往往存在材料冗余,造成整机质量偏重,增加能源的损耗,因此进行合理的结构优化是很有必要的。拓扑优化可以在给定的设计区域内对材料进行空间分布优化,使材料得到充分的利用。...
  • 在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。 在innodb中: 在Myisam中:
  • MySQL调优(五):MySQL查询优化分析

    千次阅读 2020-06-27 01:38:53
    《高性能MySQL》中说整体数据访问量的阈值是30%,但是实际测试中并没有测出准确值,所以还是要根据实际案例,具体问题具体分析。 思考:下面这个limit怎么通过子查询进行优化? 避免: 1、避免查询不需要的记录 ...
  • CREATE INDEX idx_user_nameAge ON tbl_user(name, age);
  • Glide图片内存优化分析

    千次阅读 2016-12-23 10:51:51
    本来想直接聊图片加载优化,仔细想了想,发现这是个太大的话题。所以就分拆下,一部分一部分的来聊这个话题,今天说说Glide的图片内存优化 图片中内存的处理是块很值得深入研究的内容,涉及到的难点也有多。 ...
  • ANSYS 15 直接优化分析

    千次阅读 2018-06-05 23:25:27
    返回工作区,在Design Exploration 拖动 Direct Optimization进入分析。    双击 Optimization 进入设置。  点击Obectives and Constraints 进行目标设置。 选择 P4-GUDIKUANG Mass(kg)加入目标。 选择 P5-...
  • 含绝对值损失函数的优化分析

    千次阅读 2020-01-18 16:53:10
    结论: 像L1这种含绝对值的损失函数,模型在计算梯度(求导)时,在不连续的地方,比如|x|, x= 0时,会用0来代替这点的梯度值,连续部分仍然按照函数求导的方式获得梯度,然后用梯度下降法进行优化。 3. 其他不处处...
  • 性能下降、 SQL 慢、执行时间长、等待时间长的原因分析 查询语句写的烂索引失效: 单值索引:在user表中给name属性建个索引,create index idx_user_name on user(name)复合索引:在user表中给name、email属性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,840
精华内容 38,336
关键字:

优化分析