Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

腾讯大讲堂48 数据库查询优化浅析

3,552 views

Published on

  • Be the first to comment

腾讯大讲堂48 数据库查询优化浅析

  1. 1. 腾 讯 大 讲 堂 第四十八期 研发管理部 大讲堂主页: http://km.oa.com/class 与讲师互动: http://km.oa.com/group/class
  2. 2. 数据库查询优化浅析 Alexyang 无线产品部 20081013
  3. 3. 提纲 <ul><li>应用级查询优化 </li></ul><ul><li>SQL 语句的解析方式 </li></ul><ul><li>索引的本质以及调优 </li></ul><ul><li>分析执行计划 </li></ul>
  4. 4. 提纲 <ul><li>应用级查询优化 </li></ul><ul><li>SQL 语句的解析方式 </li></ul><ul><li>索引的本质以及调优 </li></ul><ul><li>分析执行计划 </li></ul>
  5. 5. 一、需要性能 / 查询优化的原因 <ul><li>影响性能的因素:整个系统环境 </li></ul><ul><li>软件:操作系统、中间件、应用程序、数据库 </li></ul><ul><li>硬件: CPU 、内存、磁盘、网络 </li></ul><ul><li>上面任何一个都可能成为系统的性能瓶颈 </li></ul>
  6. 6. 系统级性能优化的点 <ul><li>操作系统:虚拟内存、文件系统格式、系统参数( LINUX ) </li></ul><ul><li>中间件:日志、部署时去掉打印信息(打印信息对性能影响较大 ) 、工作线程数、连接池、 JAVA 垃圾回收模式、 JAVA 内存设置 </li></ul><ul><li>应用程序:使用连接池、合理的业务设计、尽可能不要对数据库操作进行同步、 JAVA 程序的性能优化(参考网络资源) </li></ul><ul><li>数据库:工作线程、 I/O 线程、内存配置等、索引的利用、 SQL 改写、服务器代码改进 </li></ul>
  7. 7. 这里我们主要考虑以下两个点 <ul><li>应用层存在问题。 </li></ul><ul><li>数据库层存在问题。 </li></ul>
  8. 8. 合理的逻辑设计 <ul><li>以某实际应用系统为例,原来任务管理模块并发用户数只有 15 个, </li></ul><ul><li>该模块用来显示所有待处理的任务,以及每个任务的里程碑个数。 </li></ul><ul><li>经过检查,发现其实现如下: </li></ul><ul><li>执行语句 SELECT COUNT(*) FROM TASK; </li></ul><ul><li>select task_id from task order by task_id desc; </li></ul><ul><li>对结果集中的每条记录 </li></ul><ul><li>{ </li></ul><ul><li>SELECT * FROM TASK_STEP WHERE TASK_STEP.TASK_ID=? </li></ul><ul><li>} </li></ul><ul><li>分析:如果 TASK 表有 10000 条记录,需要向数据库发送 10000 个查询。 </li></ul><ul><li>假设通讯使用了 100ms ,每个查询的执行时间是 20ms 。使用的时间为: </li></ul><ul><li>(100ms+20ms)*10000=1200s=20min </li></ul>
  9. 9. 解决方案 <ul><li>select task_step.* </li></ul><ul><li>from task,task_step </li></ul><ul><li>where task_step.task_id = task.task_id </li></ul><ul><li>order by task.task_id desc; </li></ul><ul><li>备注: </li></ul><ul><li>1 )继续对 task_step.* 处理,减少网络通讯量。 </li></ul><ul><li>2 )默认看到自己的任务,提供连接查询其他任务。 </li></ul>
  10. 10. 尽量使用数据库提供的功能 <ul><li>在某实际应用系统中,对于每个任务、日记等对象都有一个唯一的 ID ,该系统使用数据库的一个表的一条整型记录来维持。 </li></ul><ul><li>当新建一个任务时,取用该表的当前记录值,操作完毕后加 1 。为了防止不同对象使用相同 ID ,使用如下方法来保证: </li></ul><ul><li>int temp = 0; </li></ul><ul><li>synchronized{ </li></ul><ul><li>执行 SELECT * FROM OBJECTID; </li></ul><ul><li>temp = 结果集中的 id </li></ul><ul><li>update 结果集中的 id ( id+1 ) </li></ul><ul><li>} </li></ul><ul><li>insert into task values(temp,...); </li></ul>
  11. 11. 解决方案 <ul><li>create sequence myseq increment by 1; </li></ul><ul><li>insert into task values(myseq.nextval,...); </li></ul>
  12. 12. <ul><li>二、 SQL 语句的解析方式 </li></ul>
  13. 13. SQL 语句的处理过程
  14. 14. 语法 / 词法分析 <ul><li>负责解析 SQL 命令和过程性语句块 </li></ul><ul><li>过滤注释 , 解析参数 </li></ul><ul><li>使用成熟的工具(如 YACC/LEX )生成 </li></ul><ul><li>灵活的语法规则定义 </li></ul><ul><li>便于语法的扩展与修改 </li></ul><ul><li>生成统一格式的语法树 </li></ul>
  15. 15. 对应的语法结构 Select * from t1, t2, t3; par_from_tv_list_struct 结构 par_from_tv_list_t* from_tv_list; par_from_tv_t* from_tv par_from_tv_list_struct 结构 par_from_tv_list_t* from_tv_list; par_from_tv_t* from_tv par_from_tv_list_struct 结构 par_from_tv_t* from_tv par_from_tv_struct 结构 T1 par_from_tv_struct 结构 T2 par_from_tv_struct 结构 T3 规则 2 规则 1
  16. 16. 语义分析 <ul><li>数据库对象名字解析 </li></ul><ul><ul><li>合法性检查 </li></ul></ul><ul><ul><li>内部 ID 的转换 </li></ul></ul><ul><li>权限检查 </li></ul><ul><li>语法树数据结构的简化与预处理 </li></ul><ul><li>DDL 语句分解为对系统表的 DML </li></ul><ul><li>视图对象的替换等 </li></ul>
  17. 17. 代价优化器 <ul><li>接受语义分析的输入 </li></ul><ul><li>统计信息的分析 </li></ul><ul><ul><li>数据分布 </li></ul></ul><ul><ul><li>统计直方图 </li></ul></ul><ul><li>代价的计算 </li></ul><ul><ul><li>基于统计信息 </li></ul></ul><ul><ul><li>操作符号的选择 </li></ul></ul><ul><li>基于成本的最优执行路径选择 </li></ul><ul><li>生成优化的执行计划 </li></ul>
  18. 18. 基于操作符的执行计划 <ul><li>物理操作符 </li></ul><ul><ul><li>功能简单专一 , 完成特定的数据库操作 </li></ul></ul><ul><ul><li>如 : 连接 , 过滤 , 排序等 </li></ul></ul><ul><li>执行计划 </li></ul><ul><ul><li>操作符的组合 , 构成树型的执行计划 </li></ul></ul><ul><ul><li>执行时 , 数据从叶子向根流动 </li></ul></ul><ul><ul><li>在根汇集成结果集 , 或者得到结果状态 </li></ul></ul><ul><ul><li>计划被自动缓存 , 以备重用 </li></ul></ul>
  19. 19. 实例分析 <ul><li>select * </li></ul><ul><li>from A, B, C, D </li></ul><ul><li>where A.a = B.b </li></ul><ul><li>and B.b1 = C.c </li></ul><ul><li>and C.c1 = D.d </li></ul><ul><li>and A.a1 >123 </li></ul>
  20. 20. <ul><li>三、索引的本质以及调优 </li></ul>
  21. 21. 需要了解的概念 <ul><li>索引 </li></ul><ul><li>聚集索引、非聚集索引 </li></ul><ul><li>唯一索引、非唯一索引 </li></ul><ul><li>单列索引、组合索引 </li></ul>
  22. 24. Clustered table/index
  23. 25. lustered index on a clustered table
  24. 26. lustered index on a clustered table
  25. 27. lustered index on a clustered table
  26. 28. lustered index on a clustered table
  27. 29. 索引调优的 6 个知识点 <ul><li>1 、将索引和数据存放到不同的文件组 </li></ul><ul><li>2 、组合索引的使用 </li></ul><ul><li>3 、唯一索引与非唯一索引的差异 </li></ul><ul><li>4 、非聚集索引的作用 </li></ul><ul><li>5 、是不是使用非聚集索引的查询都需要进行聚集的查询 </li></ul><ul><li>6 、创建索引的规则 </li></ul>
  28. 30. 执行计划 <ul><li>单表执行计划 </li></ul><ul><li>多表执行计划 </li></ul>
  29. 31. 多表连接执行计划 <ul><li>1 、嵌套连接 </li></ul><ul><li>2 、 HASH 连接 </li></ul><ul><li>3 、合并连接 </li></ul><ul><li>4 、反合并连接 </li></ul><ul><li>5 、半连接 </li></ul><ul><li>6 、反半连接 </li></ul>
  30. 32. 谢谢 !

×