精华内容
下载资源
问答
  • 网络优化案例 网络优化案例分析 1 TCH 掉话案例分析2 1.1 唐汪-1 小区上行干扰引起掉话 2 1.2 潘家-3 小区载频故障引起 TCH 掉话 5 1.3 马集-1 频点干扰引起掉话 8 1.4 卜家庄基站3 个小区上行电平偏低引起掉话11 ...
  • APSffi化算法的魅力案例分析 APSSW级计划与排程协会 SAPS Lean System Advanced Planning and Scheduling 精益系统高级计划排程是基于现实的资源能力时间产品约束条件逻辑关系等 有限资源能力情况得到一个可实施的...
  • 工程项目技术方案优化案例分析课件.ppt
  • 1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描 3、应尽量避免...

    目录

    项目背景

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

    案例分析:

    2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

    案例分析:

    3、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。

    案例分析:

    4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描

    案例分析:

    5.in 和 not in 也要慎用,否则会导致全表扫描

    案例分析

    案例分析2:

    案例分析3:

    6、like模糊全匹配也将导致全表扫描

    案例分析


    项目背景

    有三张百万级数据表

    知识点表(ex_subject_point)9,316条数据

    试题表(ex_question_junior)2,159,519条数据 有45个字段

    知识点试题关系表(ex_question_r_knowledge)3,156,155条数据

    测试数据库为:mysql (5.7)

     

    1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

    案例分析:

    SELECT ex_question_junior.QUESTION_ID 
    FROM ex_question_junior 
    WHERE ex_question_junior.GRADE_ID=1

        执行时间:17.609s (多次执行,在17s左右徘徊)

      优化后:给GRADE_ID字段添加索引后

      执行时间为:11.377s(多次执行,在11s左右徘徊)

      备注:我们一般在什么字段上建索引?

      这是一个非常复杂的话题,需要对业务及数据充分分析后再能得出结果。主键及外键通常都要有索引,其它需要建索引的字段应满足以下条件:

        a、字段出现在查询条件中,并且查询条件可以使用索引;

        b、语句执行频率高,一天会有几千次以上;

        c、通过字段条件可筛选的记录集很小,那数据筛选比例是多少才适合?

      这个没有固定值,需要根据表数据量来评估,以下是经验公式,可用于快速评估:

      小表(记录数小于10000行的表):筛选比例<10%;

      大表:(筛选返回记录数)<(表总记录数*单条记录长度)/10000/16

      单条记录长度≈字段平均内容长度之和+字段数*2

      以下是一些字段是否需要建B-TREE索引的经验分类:

    2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描

    select id from t where num is null

    最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.

    备注、描述、评论之类的可以设置为 NULL,其他的,最好不要使用NULL。

    不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。

    可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

    select id from t where num = 0

    案例分析:

    在mysql数据库中对字段进行null值判断,是不会放弃使用索引而进行全表扫描的。

    SELECT ex_question_junior.QUESTION_ID
    FROM ex_question_junior 
    WHERE IS_USE is NULL

     

    执行时间是:11.729s

     

    SELECT ex_question_junior.QUESTION_ID
    FROM ex_question_junior 
    WHERE IS_USE =0

    执行时间是12.253s

    时间几乎一样。

    3、应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。

    案例分析:

    在mysql数据库中where 子句中使用 != 或 <> 操作符,引擎不会放弃使用索引。

    EXPLAIN
    SELECT ex_question_junior.QUESTION_ID
    FROM ex_question_junior 
    WHERE ex_question_junior.GRADE_ID !=15

    执行时间是:17.579s

    执行时间是:16.966s

    4.应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描

    案例分析:

    GRADE_ID字段有索引,QUESTION_TYPE没索引

    执行时间是:11.661s

    优化方案:

    通过union all 方式,把有索引字段和非索引字段分开。索引字段就有效果了

    执行时间是:11.811s

    但是,非索引字段依然查询速度会很慢,所以查询条件,能加索引的尽量加索引

    5.in 和 not in 也要慎用,否则会导致全表扫描

    案例分析

    注:在mysql数据库中where 子句中对索引字段使用 in 和 not in操作符,引擎不会放弃使用索引。

    注:在mysql数据库中where 子句中对不是索引字段使用 in 和 not in操作符,会导致全表扫描。

    案例分析2:

    用between和in的区别

    SELECT ex_question_junior.QUESTION_ID
    FROM ex_question_junior
    WHERE ex_question_junior.QUESTION_TYPE  IN(1,2,3,4)

    执行时间为1.082s

    SELECT ex_question_junior.QUESTION_ID
    FROM ex_question_junior
    WHERE ex_question_junior.QUESTION_TYPE between 1 and 4

     

    执行时间为0.924s

     

    时间上是相差不多的

    案例分析3:

    用exists 和 in区别:结论

    用exists 和 in区别:结论

    1. in()适合B表比A表数据大的情况(A<B)

    select * from A

    where id in(select id from B)

    2. exists()适合B表比A表数据小的情况(A>B)

      select * from A

      where exists(

      select 1 from B where B.id = A.id

      )

    3.当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.语法

    select * from A

    where id in(select id from B)

    ex_question_r_knowledge表数据量大,ex_subject_point表数据量小

    ****************************************************************************

    ex_question_r_knowledge(A)表数据量大,ex_subject_point表数据量小(B)(A>B)

    用exists适合

    SELECT *
    FROM ex_question_r_knowledge
    WHERE ex_question_r_knowledge.SUBJECT_POINT_ID IN
    (
        SELECT ex_subject_point.SUBJECT_POINT_ID
        FROM ex_subject_point
        WHERE ex_subject_point.SUBJECT_ID=7
    )

     

    SELECT *
    FROM ex_question_r_knowledge
    WHERE  exists
    (
        SELECT 1
        FROM ex_subject_point
        WHERE ex_subject_point.SUBJECT_ID=7
        AND ex_subject_point.SUBJECT_POINT_ID = ex_question_r_knowledge.SUBJECT_POINT_ID
    )

     

    执行时间是:13.537s

    *************************************************************************

    ex_subject_point表数据量小(A),ex_question_r_knowledge(B)表数据量大(A<B)

    用in适合

    SELECT *
     FROM ex_subject_point 
    WHERE
     ex_subject_point.SUBJECT_POINT_ID IN( SELECT 
    ex_question_r_knowledge.SUBJECT_POINT_ID FROM 
    ex_question_r_knowledge WHERE 
    ex_question_r_knowledge.GRADE_TYPE=2 )

     

     

    SELECT * FROM ex_subject_point WHERE
     ex_subject_point.SUBJECT_POINT_ID IN( SELECT 
    ex_question_r_knowledge.SUBJECT_POINT_ID FROM 
    ex_question_r_knowledge WHERE 
    ex_question_r_knowledge.GRADE_TYPE=2 )

    执行时间是:1.554s

    SELECT *
        FROM ex_subject_point
        WHERE  exists(
        SELECT ex_question_r_knowledge.SUBJECT_POINT_ID
        FROM ex_question_r_knowledge
        WHERE ex_question_r_knowledge.GRADE_TYPE=2
        AND ex_question_r_knowledge.SUBJECT_POINT_ID= ex_subject_point.SUBJECT_POINT_ID
    )

    执行时间是:11.978s

    6、like模糊全匹配也将导致全表扫描

    案例分析

    EXPLAIN
     SELECT * 
    FROM ex_subject_point 
    WHERE ex_subject_point.path like "%/11/%"

     

    若要提高效率,可以考虑全文检索。lucene了解一下。或者其他可以提供全文索引的nosql数据库,比如tt server或MongoDB

    还会陆续更新,还有几个小节。

     

    昨天晚上突发奇想,like 模糊全匹配,会导致全表扫描,那模糊后匹配和模糊前匹配也会是全表扫描吗?

    今天开电脑,做了下测试。结果如下:

    like模糊后匹配,不会导致全表扫描

    like模糊前匹配,会导致全表扫描

    MY SQL的原理就是这样的,LIKE模糊全匹配会导致索引失效,进行全表扫描;LIKE模糊前匹配也会导致索引失效,进行全表扫描;但是LIKE模糊后匹配,索引就会有效果。

     

    参考:

     

    https://mp.weixin.qq.com/s?__biz=MzIxMjg4NDU1NA==&mid=2247483684&idx=1&sn=f5abc60e696b2063e43cd9ccb40df101&chksm=97be0c01a0c98517029ff9aa280b398ab5c81fa1fcfe0e746222a3bfe75396d9eea1e249af38&mpshare=1&scene=1&srcid=0606XGHeBS4RBZloVv786wBY#rd

     

    ***************************************************************************

    作者:小虚竹
    欢迎任何形式的转载,但请务必注明出处。
    限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

     

    我不是个伟大的程序员,我只是个有着一些优秀习惯的好程序员而己

     

    展开全文
  • Oracle数据库性能优化案例分析.pptx
  • 第八章 众包任务定价优化方案;第八章 众包任务定价优化方案;8.1 案例背景;Part 8 ;Part 8 ;本案例的主要目标包括掌握地理信息数据可视化基本技能根据实际问题提炼分析指标并编程计算构建分析模型及实现基本实现思路...
  • SQL改写优化案例分析.pptx
  • 案例分析 8、在 where 子句中对字段进行表达式操作,是不会导致全表扫描。不过查询速度会变慢,所以尽量避免使用。 案例分析 优化方案 9、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引...

    目录

    项目背景

    7、在 where 子句中使用参数,是不会导致全表扫描。

    案例分析

    8、在 where 子句中对字段进行表达式操作,是不会导致全表扫描。不过查询速度会变慢,所以尽量避免使用。

    案例分析

    优化方案

    9、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

    案例分析

    优化方案

    10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

    11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用(这个在mysql中不对),并且应尽可能的让字段顺序与索引顺序相一致。

    案例分析

    12.不要写一些没有意义的查询,如需要生成一个空表结构:(一般开发也不会这么无聊啦,在正式的项目上写这种玩意)


    项目背景

    有三张百万级数据表

    知识点表(ex_subject_point)9,316条数据

    试题表(ex_question_junior)2,159,519条数据 有45个字段

    知识点试题关系表(ex_question_r_knowledge)3,156,155条数据

    测试数据库为:mysql (5.7)

     

    7、在 where 子句中使用参数,是不会导致全表扫描。

    案例分析

     
     

    8、在 where 子句中对字段进行表达式操作,是不会导致全表扫描。不过查询速度会变慢,所以尽量避免使用。

    案例分析

     

    执行时间是1.064s

    优化方案

    SELECT ex_question_junior.QUESTION_ID
    FROM ex_question_junior 
    WHERE ex_question_junior.QUESTION_CHANNEL_TYPE =4/2;
    执行时间是0.012s

     

     

     

    9、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。

    案例分析

     

    优化方案

    SELECT *
    FROM ex_subject_point 
    WHERE CREATE_DT >= "2018-05-31"
    AND CREATE_DT < "2018-07-01"
    但是EXPLAIN一下,发现这样还是全表扫描的

     

    难道是因为日期字段索引没有效果吗?还是因为用了>=和<运算符号?
    来验证一下
    缩小查询范围,发现索引是有效果的。所以不是日期字段的问题。

    换个字段查询,用>=和<运算符号,索引还是有效果的。但那是什么原因呢?

    后来去网上查找了资料,原因是查询数量是超过表的一部分,mysql30%,oracle 20%(这个数据可能不准确,不是官方说明,仅供参考),导致索引失效。

    10.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

    例子请看第8点和第9点。

    11.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用(这个在mysql中不对),并且应尽可能的让字段顺序与索引顺序相一致。

    案例分析

    复合索引字段:PATH,PARENT_POINT_ID

     

     

     

    调换WHERE子句中的条件顺序。发现还是可以使用索引的

    复合索引只查询第一个字段,是有效果的

     

    复合索引只查询第二个字段,发现索引没有效果了。

    12.不要写一些没有意义的查询,如需要生成一个空表结构:(一般开发也不会这么无聊啦,在正式的项目上写这种玩意)

    select col1,col2 into #t from t where 1 = 0
    这类代码不会返回任何结果集,但是会消耗系统资源的,应改成这样:
    create table #t(…)

    参考:

    https://mp.weixin.qq.com/s?__biz=MzIxMjg4NDU1NA==&mid=2247483684&idx=1&sn=f5abc60e696b2063e43cd9ccb40df101&chksm=97be0c01a0c98517029ff9aa280b398ab5c81fa1fcfe0e746222a3bfe75396d9eea1e249af38&mpshare=1&scene=1&srcid=0606XGHeBS4RBZloVv786wBY#rd

    ***************************************************************************

    作者:小虚竹
    欢迎任何形式的转载,但请务必注明出处。
    限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

     

    我不是个伟大的程序员,我只是个有着一些优秀习惯的好程序员而己

     

     

     

     

     

    展开全文
  • 1 案例分析 案例一:Library cache lock等待 问题背景: 严重的Library cache lock等待,导致SQL执行的很慢 问题分析: Library cache lock等待常见场景: DDL、统计信息搜集 Namespace→1:table/view/sequence/...

    1 案例分析

    案例一:Library cache lock等待

    问题背景:

    严重的Library cache lock等待,导致SQL执行的很慢
    在这里插入图片描述

    问题分析:
    Library cache lock等待常见场景:

    1. DDL、统计信息搜集
      Namespace→1:table/view/sequence/synonym/
    2. 错误密码登陆
      Namespace→79:Account status
    3. FailureParse
      Namespace→82:SQL AREA BUILD
    4. ADG
      Namespace→74:DBINSTANCE

    在这里插入图片描述

    案例二:row cache lock等待

    问题背景:

    大量的row cache lock等待事件,导致数据库夯住。

    问题分析:
    从dba_hist_active_sess_history中分析看到,数据库于17:30:28开始出现row cache lock(dc_user),从中可以看到,1号节点的会话4901阻塞了3052,4901是一个sqlplus程序,在执行grant object操作。

    分析数据库audit日志XXXX1_ora_25757616_1.aud如下:
    在这里插入图片描述
    因为这个系统业务期间每个节点每秒大概有5、6次的login,两个节点加起来每秒大概有10到12次的login。在因此导致了大量的row cache lock等待事件。

    DC_USERS This may occur if a session issues a GRANT to a user and that user is in the process of logging on to the database. Investigate why grants are being made while the users are active.

    解决方案:
    避免在业务期间进行grant/revoke操作。

    案例三:truncate大表

    问题背景:

    truncate大表,导致业务等待资源释放,进而数据库服务器连接数太多导致崩溃

    问题分析:
    在表的truncate的操作没有完成的情况下,所有的INSERT操作都被挂起了。然后由于这个INSERT操作又是应用程序的日志记录操作,所以造成了大部分客户化的应用程序都因为等待日志表的写而挂起。

    ASH记录中,有2000多个6zx4a78zj3963(Insert CUX_0_WS_INVOKE_LOG)都执行了20分钟以上。

    分析原因,可能是除了Truncate进程,其他排队的进程基本都是6zx4a78zj3963。因为6zx4a78zj3963数量非常多,但是又因为Truncate在前,Insert执行不了。到Truncate终止,Insert语句才开始执行。

    注:检查了6zx4a78zj3963的执行数量,从5月27日10:11到5月30日14:45,一共76.5小时,一共执行了月500万次,平均每小时6.5万次,每分钟超过1000次。尽管每次连接不只写入一条记录,保守估计,以每次连接写入10条记录来算,每小时的连接数也有6500次。因此,Truncate语句如果40多分钟没有执行完成,堵住的Insert语句就有可能超过最大进程数5000。

    解决方案:
    Truncate大表的时候,虽然不写日志,但因为要回收空间,所以也是会有性能问题的。对于有CLOB字段的表,Truncate的性能就有点类似Delete了。另外,索引的存在,也会影响Truncate的性能。

    Truncate大表,虽然手工终止,但是数据库后台还在继续释放资源,这个过程可能持续20分钟之久。

    建议将表按时间分区,并定期清理。清理时,直接Drop掉不再需要的历史分区即可。但使用分区表时也要注意,尽量不要有全局索引。如果有全局索引,无论是Truncate分区还是Drop分区,都会造成全局索引失效,需要重建索引。

    Truncate大表时,可以结合使用reuse storage来提高性能。

    通常认为,Truncate和Drop都是ddl语句,都会释放表占用的空间,且不可回退。这是因为Truncate默认使用的是drop storage,Truncate的同时会立即释放extent,删除的表如果非常大,就会有很明显的性能问题。如果使用reuse storage的话,是不会立即释放表的extent的,性能就会好很多。

    具体做法是先使用如下Truncate语句:

    Truncate table tableName reuse storage;
    

    然后,再分批释放空间:

    ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 4096M;
    ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 2048M;
    ALTER TABLE BIGTAB DEALLOCATE UNUSED KEEP 1M;
    

    对于LOB字段和索引,也可以采用同样的方式逐步回收:

    ALTER TABLE  MODIFY LOB() DEALLOCATE UNUSED KEEP xxxM;
    ALTER INDEX  DEALLOCATE UNUSED KEEP xxxM;
    

    案例四:统计信息收集不及时

    问题背景:

    统计信息收集不及时,导致执行计划变了,有一个sql,一段时间比较快,一段时间比较慢。

    问题分析:
    这个sql_id的执行计划主要有两个,Plan Hash Value分别是2716755970和256938306。
    在这里插入图片描述
    像这种情况,建议直接通过SQL Profile绑定执行计划,使其固定使用Plan Hash Value = 2716755970的执行计划。

    为什么会出现两个效率明显差异的执行计划交替使用呢?我们认为应该跟表的统计信息有一定的关系。

    这个sql中用到的几个大表,MTL_MATERIAL_TRANSACTIONS的统计信息是2018/5/5的,表OE_ORDER_HEADERS_ALL的统计信息是2018/2/5的,但表OE_ORDER_LINES_ALL的却是2018/5/26的。这种直接关联的表,统计信息日期相差太大的话,会出现不匹配的现象。如果查询的条件刚好覆盖到最新一部分数据时,就会造成有的表有该部分数据的统计信息,但有的表却没有的情况。这时CBO就会认为两表关联结果为0,出现误判。

    案例五:乱加并行度,会话数暴增

    问题背景:

    有些SQL,占用Session数很多,比如下面的7vuhb2tb6jwj9
    在这里插入图片描述

    问题分析:
    从等待事件看,这些Session都是等待PX相关事件,说明这些都是并行执行的Slave Session,但整个SQL里并没有添加Parallel提示,怀疑是某个表或者索引的Degree大于1。

    检查发现,一些表重建索引的时候加了并行,但是事后没有将并行去掉。
    一个sql,消耗太多Session,就会造成资源浪费,并有可能导致连接数不够,影响其他用户登录。

    而且,如果不是Index Full Scan,而是Index Range Scan或者Index Unique Scan等的话,并行扫描是完全不会提高性能的。几乎没有哪个表或者索引,启用并行扫描一定就会快。一定要根据具体的执行计划才能决定是否需要加并行。因此,在表上或者索引上设置Degree大于1是不提倡的。可以根据需要在相应的SQL语句上加并行提示。

    另外,视图创建脚本上,也不需要加并行提示。

    案例六:SQL未加绑定变量

    问题背景:

    大量SQL未加绑定变量,导致共享池资源争用严重,从而引发数据库资源不足,导致hang。
    在这里插入图片描述
    SQL解析命中率:
    Library Hit %: 72.53 Soft Parse %: 52.59
    共享池大小抖动情况:(SGA_TARGET = 7168M)
    MIN_SIZE MAX_SIZE CURRENT_SIZE
    1120M 6048M 1384M

    问题分析:
    应用系统中存在大量SQL语句未使用绑定变量,导致共享池的争用严重,共享池的严重争用导致相关事件的等待时间变长,数据库响应变慢。

    当系统处于业务高峰,数据库会话数急剧增加,操作系统内存耗尽,出现了严重的换页现象,最终导致数据库hang。

    案例七:SQL语法不规范

    问题背景:

    SQL语法写法不规范,造成PGA耗用较大且不释放。
    现象:收到监控系统反馈,一个Linux系统上的RAC数据库的内存耗用较多,swap空间也使用较多。

    问题分析:

    1. 按照操作系统命令,对内存使用情况的进程进行排序。

      ps -aux | sort -k4nr | head  -20
      
    2. 对排名靠前的会话进行分析,且分析awr报告,发现内存耗用都是在PGA上。

    3. 对排名靠前的会话进行采用heapdump分析。

      # 数据库heapdump命令.
      oradebug setospid 108856
      oradebug unlimit
      oradebug dump heapdump 5
      oradebug tracefile_name
      
    4. 对trace文件分析解读,发现超过90%的内存耗费在top uga heap段的qmxdpls_subheap部分。

      EXTENT 8 addr=0x7fe877963030
      Chunk 7fe877963040 sz= 2072 freeable  "qmxdpls_subhea "  ds=0x7fe8bc0ce278
      Chunk 7fe877963858 sz= 4264 freeable  "qmxdpls_subhea "  ds=0x7fe8bc0ce278
      Chunk 7fe877964900 sz= 4184 freeable  "qmxdpls_subhea "  ds=0x7fe8bc0ce278
      Chunk 7fe877965958 sz= 4264 freeable  "qmxdpls_subhea "  ds=0x7fe8bc0ce278 
      
    5. 对qmxdpls_subhea进行分析,此部分是由解析xml时使用的,初步怀疑问题点是在程序调用xml时造成内存泄漏。

    6. 为了进一步对初步判断的点进行更深入的程序分析,定位找到相应的代码

      select PGA_ALLOC_MEM/1024/1024/1024 GB,a.spid,b.machine,b.program,b.sql_id,b.event,b.status
      from v$process a,v$session b
      where a.addr=b.paddr and PGA_ALLOC_MEM/1024/1024/1024>1
      order by 1;
      

      发现多个进程耗用PGA 4G,且都是一个sql_id,直接杀掉这些进程,释放部分空间,可是过一会,又起来了。

    7. 分析sql代码,找到发现调用xml解析的点。

      代码里面有一段:XMLDOM.OPENDOCUMENT,上MOS进行查询,Oracle对此语句的写法有建议:

      调用后,用XMLDOM.FREEDOCUMENT 释放内存。

    8. 通知开发,对此sql进行修改,按照官方建议整改,后续监控发现,没有该问题发生。

    2 数据库性能最佳实践

    2.1 使用连接池

    当数据库操作和访问频繁的时候,使用连接池可以减少创建连接和打开连接所耗的时间,提升数据库服务器的性能。

    2.2 绑定变量减少硬解析

    硬解析消耗大量的CPU时间和系统资源。硬解析过多会降低系统性能。

    2.3 业务高峰期,尽量避免实行DDL

    • 一个简单的GRANT语句都可能会引起性能问题。
    • 执行DDL后会引起相关的SQL在共享池中的失效。
      当相关SQL再次并发执行,可能会导致硬解析风暴。从而引起"library cache lock", "row cache lock", "cursor: pin S wait on X"以及相关latch的等待。
    

    2.4 数据库服务器上部署OSWatcher

    完善的监控有助于提前发现性能问题,并且在出现性能问题时快速定位瓶颈。

    2.5 定时搜集统计信息

    • 优化器并不完美。
    • 优化器有效的补充:
    	(1)SQL Tuning Advisor
    	(2)SQL Plan Baseline
    	(3)SQL Profile
    	(4)SQL Patch
    	(5)SQL 书写优化
    

    2.6 按时应用PSU/RU

    定时打补丁,有助于提高数据库安全性及性能。

    2.7 使用AWR基线

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

    展开全文
  • LTE模三干扰优化案例

    2014-12-13 22:59:11
    主要讲述LTE目前的优化方案分析思路,对LTE干扰进行简单的概述与分析
  • 现阶段大规模DT测试中切换失败导致重建的案例分析,从测试数据信令筛选定位,介绍了如何从未收到RRC重配置消息和未收到MSG2等方面分析、定位,并加以总结,以便对今后的4G网络优化提供指导意见
  • 核心原理与案例分析》通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型、架构设计、性能优化、...
  • 数据库优化方案整理

    万次阅读 多人点赞 2018-08-29 16:05:16
    一:优化说明 A:有数据表明,用户可以承受的最大等待时间为8秒。数据库优化策略有很多,设计初期,建立好的数据结构对于后期性能优化至关重要。因为数据库结构是系统的基石,基础打不好,使用各种优化策略,也不能...

    一:优化说明

    A:有数据表明,用户可以承受的最大等待时间为8秒。数据库优化策略有很多,设计初期,建立好的数据结构对于后期性能优化至关重要。因为数据库结构是系统的基石,基础打不好,使用各种优化策略,也不能达到很完美的效果。

    B:数据库优化的几个方面
    这里写图片描述
    ​​
    可以看出来,数据结构、SQL、索引是成本最低,且效果最好的优化手段。

    C:性能优化是无止境的,当性能可以满足需求时即可,不要过度优化。

    二:优化方向

    1. SQL以及索引的优化

    首先要根据需求写出结构良好的SQL,然后根据SQL在表中建立有效的索引。但是如果索引太多,不但会影响写入的效率,对查询也有一定的影响。

    2. 合理的数据库是设计

    根据数据库三范式来进行表结构的设计。设计表结构时,就需要考虑如何设计才能更有效的查询。

    数据库三范式:
    第一范式:数据表中每个字段都必须是不可拆分的最小单元,也就是确保每一列的原子性;
    第二范式:满足一范式后,表中每一列必须有唯一性,都必须依赖于主键;
    第三范式:满足二范式后,表中的每一列只与主键直接相关而不是间接相关(外键也是直接相关),字段没有冗余。

    注意:没有最好的设计,只有最合适的设计,所以不要过分注重理论。三范式可以作为一个基本依据,不要生搬硬套。

    有时候可以根据场景合理地反规范化:
    A:分割表。
    B:保留冗余字段。当两个或多个表在查询中经常需要连接时,可以在其中一个表上增加若干冗余的字段,以 避免表之间的连接过于频繁,一般在冗余列的数据不经常变动的情况下使用。
    C:增加派生列。派生列是由表中的其它多个列的计算所得,增加派生列可以减少统计运算,在数据汇总时可以大大缩短运算时间。

    数据库五大约束:
    A:PRIMARY key:设置主键约束;
    B:UNIQUE:设置唯一性约束,不能有重复值;
    C:DEFAULT 默认值约束
    D:NOT NULL:设置非空约束,该字段不能为空;
    E:FOREIGN key :设置外键约束。

    字段类型选择:
    A:尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED
    B:VARCHAR的长度只分配真正需要的空间
    C:使用枚举或整数代替字符串类型
    D:尽量使用TIMESTAMP而非DATETIME
    E:单表不要有太多字段,建议在20以内
    F:避免使用NULL字段,很难查询优化且占用额外索引空间

    3. 系统配置的优化

    例如:MySQL数据库my.cnf

    4. 硬件优化

    更快的IO、更多的内存。一般来说内存越大,对于数据库的操作越好。但是CPU多就不一定了,因为他并不会用到太多的CPU数量,有很多的查询都是单CPU。另外使用高的IO(SSD、RAID),但是IO并不能减少数据库锁的机制。所以说如果查询缓慢是因为数据库内部的一些锁引起的,那么硬件优化就没有什么意义。

    三:优化方案

    代码优化

    之所以把代码放到第一位,是因为这一点最容易引起技术人员的忽视。很多技术人员拿到一个性能优化的需求以后,言必称缓存、异步、JVM等。实际上,第一步就应该是分析相关的代码,找出相应的瓶颈,再来考虑具体的优化策略。有一些性能问题,完全是由于代码写的不合理,通过直接修改一下代码就能解决问题的,比如for循环次数过多、作了很多无谓的条件判断、相同逻辑重复多次等。

    举个栗子:
    一个update操作,先查询出entity,再执行update,这样无疑多了一次数据库交互。还有一个问题,update语句可能会操作一些无需更新的字段。

    我们可以将表单中涉及到的属性,以及updateTime,updateUser等赋值到entity,直接通过pdateByPrimaryKeySelective,去update特定字段。

    ​​

    定位慢SQL,并优化

    这是最常用、每一个技术人员都应该掌握基本的SQL调优手段(包括方法、工具、辅助系统等)。这里以MySQL为例,最常见的方式是,由自带的慢查询日志或者开源的慢查询系统定位到具体的出问题的SQL,然后使用explain、profile等工具来逐步调优,最后经过测试达到效果后上线。

    SqlServer执行计划:

    通过执行计划,我们能得到哪些信息:
    A:哪些步骤花费的成本比较高
    B:哪些步骤产生的数据量多,数据量的多少用线条的粗细表示,很直观
    C:每一步执行了什么动作

    具体优化手段:

    A:尽量少用(或者不用)sqlserver 自带的函数
    select id from t where substring(name,1,3) = ’abc’
    select id from t where datediff(day,createdate,’2005-11-30′) = 0
    可以这样查询:
    select id from t where name like ‘abc%’
    select id from t where createdate >= ‘2005-11-30’ and createdate < ‘2005-12-1’

    B:连续数值条件,用BETWEEN不用IN:SELECT id FROM t WHERE num BETWEEN 1 AND 5
    C:Update 语句,如果只更改1、2个字段,不要Update全部字段,否则频繁调用会引起明显的性能消耗
    D:尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型
    E:不建议使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。尽量避免向客户 端返回大数据量,若数据量过大,应该考虑相应需求是否合理
    F:表与表之间通过一个冗余字段来关联,要比直接使用JOIN有更好的性能
    G:select count(*) from table;这样不带任何条件的count会引起全表扫描
    连接池调优
    我们的应用为了实现数据库连接的高效获取、对数据库连接的限流等目的,通常会采用连接池类的方案,即每一个应用节点都管理了一个到各个数据库的连接池。随着业务访问量或者数据量的增长,原有的连接池参数可能不能很好地满足需求,这个时候就需要结合当前使用连接池的原理、具体的连接池监控数据和当前的业务量作一个综合的判断,通过反复的几次调试得到最终的调优参数。

    ​​

    合理使用索引

    索引一般情况下都是高效的。但是由于索引是以空间换时间的一种策略,索引本身在提高查询效率的同时会影响插入、更新、删除的效率,频繁写的表不宜建索引。

    选择合适的索引列,选择在where,group by,order by,on从句中出现的列作为索引项,对于离散度不大的列没有必要创建索引。
    主键已经是索引了,所以primay key 的主键不用再设置unique唯一索引

    索引类型
    主键索引 (PRIMARY KEY)
    唯一索引 (UNIQUE)
    普通索引 (INDEX)
    组合索引 (INDEX)
    全文索引 (FULLTEXT)

    可以应用索引的操作符
    大于等于
    Between
    IN
    LIKE 不以 % 开头

    不能应用索引的操作符
    NOT IN
    LIKE %_ 开头

    如何选择索引字段
    A:字段出现在查询条件中,并且查询条件可以使用索引
    B:通常对数字的索引和检索要比对字符串的索引和检索效率更高
    C:语句执行频率高,一天会有几千次以上
    D:通过字段条件可筛选的记录集很小
    ​​

    无效索引
    A:尽量不要在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描
    B:应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
    C:应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描
    select id from t where num=10 or Name = ‘admin’
    可以这样查询:
    select id from t where num = 10
    union
    select id from t where Name = ‘admin’
    union all 返回所有数据,不管是不是重复。 union会自动压缩,去除重复数据。

    D:不做列运算
    where age + 1 = 10,任何对列的操作都将导致表扫描,它包括数据库教程函数、计算表达式等
    E:查询like,如果是 ‘%aaa’ 不会使用到索引

    分表

    分表方式
    水平分割(按行)、垂直分割(按列)

    分表场景
    A: 根据经验,mysql表数据一般达到百万级别,查询效率就会很低。
    B: 一张表的某些字段值比较大并且很少使用。可以将这些字段隔离成单独一张表,通过外键关联,例如考试成绩,我们通常关注分数,不关注考试详情。

    水平分表策略
    按时间分表:当数据有很强的实效性,例如微博的数据,可以按月分割。
    按区间分表:例如用户表 1到一百万用一张表,一百万到两百万用一张表。
    hash分表:通过一个原始目标id或者是名称按照一定的hash算法计算出数据存储的表名。

    读写分离

    当一台服务器不能满足需求时,采用读写分离【写: update/delete/add】的方式进行集群。
    一台数据库支持最大连接数是有限的,如果用户的并发访问很多,一台服务器无法满足需求,可以集群处理。mysql集群处理技术最常用的就是读写分离。

    主从同步:数据库最终会把数据持久化到磁盘,集群必须确保每个数据库服务器的数据是一致的。从库读主库写,从库从主库上同步数据。
    读写分离:使用负载均衡实现,写操作都往主库上写,读操作往从服务器上读。

    缓存

    缓存分类
    本地缓存:HashMap/ConcurrentHashMap、Ehcache、Guava Cache等
    缓存服务:Redis/Tair/Memcache等

    使用场景
    短时间内相同数据重复查询多次且数据更新不频繁,这个时候可以选择先从缓存查询,查询不到再从数据库加载并回设到缓存的方式。此种场景较适合用单机缓存。
    高并发查询热点数据,后端数据库不堪重负,可以用缓存来扛。

    缓存作用
    减轻数据库的压力,减少访问时间。

    缓存选择
    如果数据量小,并且不会频繁地增长又清空(这会导致频繁地垃圾回收),那么可以选择本地缓存。具体的话,如果需要一些策略的支持(比如缓存满的逐出策略),可以考虑Ehcache;如不需要,可以考虑HashMap;如需要考虑多线程并发的场景,可以考虑ConcurentHashMap。
    其他情况,可以考虑缓存服务。目前从资源的投入度、可运维性、是否能动态扩容以及配套设施来考虑,我们优先考虑Tair。除非目前Tair还不能支持的场合(比如分布式锁、Hash类型的value),我们考虑用Redis。

    缓存穿透
    一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比
    如DB)。如果key对应的value是一定不存在的,并且对该key并发请求量很大,就会对后端系统造
    成很大的压力。这就叫做缓存穿透。

    对查询结果为空的情况也进行缓存,缓存时间设置短点,或者该key对应的数据insert了之后清理缓存。

    缓存并发
    有时候如果网站并发访问高,一个缓存如果失效,可能出现多个进程同时查询DB,同时设置缓存的情况,
    如果并发确实很大,这也可能造成DB压力过大,还有缓存频繁更新的问题。

    对缓存查询加锁,如果KEY不存在,就加锁,然后查DB入缓存,然后解锁;其他进程如果发现有锁就
    等待,然后等解锁后返回数据或者进入DB查询。

    缓存雪崩(失效)
    当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)
    带来很大压力。
    不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀.

    防止缓存空间不够用
    ① 给缓存服务,选择合适的缓存逐出算法,比如最常见的LRU。
    ② 针对当前设置的容量,设置适当的警戒值,比如10G的缓存,当缓存数据达到8G的时候,就开始发出报警,提前排查问题或者扩容。
    ③ 给一些没有必要长期保存的key,尽量设置过期时间。

    我们看下图,在WebServer(Dao层)和DB之间加一层cache,这层cache一般选取的介质是内存,因为我们都知道存入数据库的数据都具有持久化的特点,那么读写会有磁盘IO的操作,内存的读写速度远比磁盘快得多。(选用存储介质,提高访问速度:内存>>磁盘;减少磁盘IO的操作,减少重复查询,提高吞吐量)

    这里写图片描述

    ​​

    常用开源的缓存工具有:ehcache、memcache、redis。

    ehcache 是一个纯Java的进程内缓存框架,hibernate使用其做二级缓存。同时,ehcache可以通过多播的方式实现集群。本人主要用于本地的缓存,数据库上层的缓存。
    memcache是一套分布式的高速缓存系统,提供key-value这样简单的数据储存,可充分利用CPU多核,无持久化功能。在做web集群中可以用做session共享,页面对象缓存。
    redis高性能的key-value系统,提供丰富的数据类型,单核CPU有抗并发能力,有持久化和主从复制的功能。本人主要使用redis的redis sentinel,根据不同业务分为多组。

    redis注意事项
    A:在增加 key 的时候尽量设置过期时间,不然 Redis Server 的内存使用会达到系统物理内存的最大值,导致 Redis 使用 VM 降低系统性能;
    B:Redis Key 设计时应该尽可能短,Value 尽量不要使用复杂对象;
    C:将对象转换成 JSON 对象(利用现成的 JSON 库)后存入 Redis;
    D:将对象转换成 Google 开源二进制协议对象(Google Protobuf,和 JSON 数据格式类似,但是因为是二进制表现,所以性能效率以及空间占用都比 JSON 要小;缺点是 Protobuf 的学习曲线比 JSON 大得多);
    E:Redis 使用完以后一定要释放连接。

    读取缓存中是否有相关数据,如果缓存中有相关数据,则直接返回,这就是所谓的数据命中“hit”
    如果缓存中没有相关数据,则从数据库读取相关数据,放入缓存中,再返回。这就是所谓的数据未命中“miss”

    缓存的命中率 = 命中缓存请求个数/总缓存访问请求个数 = hit/(hit+miss)
    ​​

    NoSQL

    与缓存的区别
    先说明一下,这里介绍的和缓存不一样,虽然redis等也可以用来做数据存储方案(比如Redis或者Tair),但NoSql是把它作为DB来用。如果当作DB来用,需要有效保证数据存储方案的可用性、可靠性。

    使用场景
    需要结合具体的业务场景,看这块业务涉及的数据是否适合用NoSQL来存储,对数据的操作方式是否适合用NoSQL的方式来操作,或者是否需要用到NoSQL的一些额外特性(比如原子加减等)。
    如果业务数据不需要和其他数据作关联,不需要事务或者外键之类的支持,而且有可能写入会异常频繁,这个时候就比较适合用NoSQL(比如HBase)。
    比如,美团点评内部有一个对exception做的监控系统,如果在应用系统发生严重故障的时候,可能会短时间产生大量exception数据,这个时候如果选用MySQL,会造成MySQL的瞬间写压力飙升,容易导致MySQL服务器的性能急剧恶化以及主从同步延迟之类的问题,这种场景就比较适合用Hbase类似的NoSQL来存储。
    视图/存储过程
    普通业务逻辑尽量不要使用存储过程,定时任务或报表统计函数可以根据团队资源情况采用存储过程处理。

    GVM调优

    通过监控系统(如没有现成的系统,自己做一个简单的上报监控的系统也很容易)上对一些机器关键指标(gc time、gc count、各个分代的内存大小变化、机器的Load值与CPU使用率、JVM的线程数等)的监控报警,也可以看gc log和jstat等命令的输出,再结合线上JVM进程服务的一些关键接口的性能数据和请求体验,基本上就能定位出当前的JVM是否有问题,以及是否需要调优。

    异步/多线程

    针对某些客户端的请求,在服务端可能需要针对这些请求做一些附属的事情,这些事情其实用户并不关心或者用户不需要立即拿到这些事情的处理结果,这种情况就比较适合用异步的方式处理这些事情。

    异步作用
    A:缩短接口响应时间,使用户的请求快速返回,用户体验更好。
    B:避免线程长时间处于运行状态,这样会引起服务线程池的可用线程长时间不够用,进而引起线程池任务队列长度增大,从而阻塞更多请求任务,使得更多请求得不到技术处理。
    C:线程长时间处于运行状态,可能还会引起系统Load、CPU使用率、机器整体性能下降等一系列问题,甚至引发雪崩。异步的思路可以在不增加机器数和CPU数的情况下,有效解决这个问题。

    异步实现
    A:额外开辟线程,这里可以采用额外开辟一个线程或者使用线程池的做法,在IO线程(处理请求响应)之外的线程来处理相应的任务,在IO线程中让response先返回。
    B:使用消息队列(MQ)中间件服务

    搜索引擎

    例如:solr,elasticsearch


    我在微信订阅号等你!
    这里写图片描述

    展开全文
  • 核心原理与案例分析》通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型、架构设计、性能优化、...
  • 主要针对于分布式框架的实践方案案例分析
  • 系统性能优化策略案例

    千次阅读 2019-01-13 21:21:28
    为了使广大对公客户使用系统时获得更快的响应时间体验,项目组对系统进行了持续的性能测试和优化。这一过程中,形成了一套针对新建系统进行性能测试和优化的方法论。 该方法论包括测试环境准备、测试功能优先级、...
  • 核心原理与案例分析通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型、架构设计、性能优化、Web ...
  • Solr优化案例分析

    千次阅读 2016-06-13 20:10:14
     网上了搜了一下Solr优化的大体方案,主要从如下两个步骤来进行优化:  1. Solr系统层面;  2. 索引字段优化;  针对Solr系统层的优化,主要有如下的方法:  1. 适当调大Solr查询缓存;  2....
  • 软考系统架构师笔记-案例分析重点(一)

    千次阅读 多人点赞 2019-09-17 00:20:03
    系统可靠性(Reliability):产品在规定条件和规定时间内完成规定功能的能力。 子特征:成熟性、容错性、易恢复性、可靠性依从性; 提高可靠性的技术:N版本程序设计、恢复块方法、防卫式程序设计、双机热备或集群...
  • 核心原理与案例分析》通过梳理大型网站技术发展历程,剖析大型网站技术架构模式,深入讲述大型互联网架构设计的核心原理,并通过一组典型网站技术架构设计案例,为读者呈现一幅包括技术选型、架构设计、性能优化、...
  • 一个产品的好坏,除了功能强大,性能也势必不能差,但不夸张的说任何App都存在相对于的性能问题。而想成为一个顶尖的Android开发工程师,解决这些问题成为你必不缺少的技能之一,从这篇文章开始,笔者将会带领大家...
  • 摘要:无线网络的配置参数的管理是无线网络优化中最重要的内容之一。...无线网络优化是通过对现已运行的网络进行话务数据分析、现场测试数据采集、配置参数分析、硬件检查等手段,找出影响网络质量的原因,
  • 21世纪的第一个十年福特经历了一个困难时期,...福特的大数据应用案例,由于分析基因已经深深植入福特的企业文化,大数据分析的兴起为福特带来了大量的新机遇。但是我们需要新的专业技术和平台来管理这些数据,研究...
  • 经过持续推进,ERP系统、OA协同办公系统、财务软件等系统都充分发挥出了各个系统应有的功能,优化了公司的业务流程,但是随着公司业务越来越壮大,对内部管理要求也越来越高,在上述系统的应用中暴露出一些问题。
  • 以某市大型三线换乘站为案例,通过分析其客流组织现状的不足,提出了一套适用的流线组织优化方案,研究了考虑进出站客流的换乘流线组织过程。最后通过灰色定权评价法评估优化前后的组织方案,量化论证了优化方案的可行性...
  • Unity大场景数据加载及优化方案

    万次阅读 多人点赞 2018-08-07 16:29:55
    前段时间,有几个虚拟仿真公司跟我请教关于大地形的加载优化问题,它们使用的引擎都是自己研发的,引擎对于开发者来说,大同小异,它们的基本构造是一样的,关键是在于解决问题的方法,正是基于这个前提写了这个课程...
  • 软考系统架构师笔记-案例分析重点(二)

    千次阅读 多人点赞 2019-09-21 13:09:11
    Essential Use Cases为抽象建模,Real Use Cases为基础建模,区别为:基础用例是用户需求对应关系的用例,是从用户需求中得到的,抽象用例是从基础用例中抽取的公共用例,避免重复工作,优化结构而提出的用例。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,773
精华内容 29,509
关键字:

产品优化方案案例分析