Successfully reported this slideshow.
腾 讯 大 讲 堂 第四十八期 研发管理部 大讲堂主页: http://km.oa.com/class 与讲师互动: http://km.oa.com/group/class
数据库查询优化浅析 Alexyang 无线产品部 20081013
提纲 <ul><li>应用级查询优化 </li></ul><ul><li>SQL 语句的解析方式 </li></ul><ul><li>索引的本质以及调优 </li></ul><ul><li>分析执行计划 </li></ul>
提纲 <ul><li>应用级查询优化 </li></ul><ul><li>SQL 语句的解析方式 </li></ul><ul><li>索引的本质以及调优 </li></ul><ul><li>分析执行计划 </li></ul>
一、需要性能 / 查询优化的原因  <ul><li>影响性能的因素:整个系统环境 </li></ul><ul><li>软件:操作系统、中间件、应用程序、数据库 </li></ul><ul><li>硬件: CPU 、内存、磁盘、网络 </li><...
系统级性能优化的点 <ul><li>操作系统:虚拟内存、文件系统格式、系统参数( LINUX ) </li></ul><ul><li>中间件:日志、部署时去掉打印信息(打印信息对性能影响较大 ) 、工作线程数、连接池、 JAVA 垃圾回收模式、...
这里我们主要考虑以下两个点 <ul><li>应用层存在问题。 </li></ul><ul><li>数据库层存在问题。 </li></ul>
合理的逻辑设计 <ul><li>以某实际应用系统为例,原来任务管理模块并发用户数只有 15 个, </li></ul><ul><li>该模块用来显示所有待处理的任务,以及每个任务的里程碑个数。 </li></ul><ul><li>经过检查,发现...
解决方案 <ul><li>select task_step.*  </li></ul><ul><li>from task,task_step </li></ul><ul><li>where  task_step.task_id = task.t...
尽量使用数据库提供的功能 <ul><li>在某实际应用系统中,对于每个任务、日记等对象都有一个唯一的 ID ,该系统使用数据库的一个表的一条整型记录来维持。 </li></ul><ul><li>当新建一个任务时,取用该表的当前记录值,操作完毕后...
解决方案 <ul><li>create sequence myseq increment by 1; </li></ul><ul><li>insert into task values(myseq.nextval,...); </li></ul>
<ul><li>二、 SQL 语句的解析方式 </li></ul>
SQL 语句的处理过程
语法 / 词法分析 <ul><li>负责解析 SQL 命令和过程性语句块 </li></ul><ul><li>过滤注释 , 解析参数 </li></ul><ul><li>使用成熟的工具(如 YACC/LEX  )生成 </li></ul><ul...
对应的语法结构 Select * from  t1, t2, t3; par_from_tv_list_struct 结构 par_from_tv_list_t* from_tv_list; par_from_tv_t*  from_tv pa...
语义分析 <ul><li>数据库对象名字解析 </li></ul><ul><ul><li>合法性检查 </li></ul></ul><ul><ul><li>内部 ID 的转换 </li></ul></ul><ul><li>权限检查 </li><...
代价优化器 <ul><li>接受语义分析的输入 </li></ul><ul><li>统计信息的分析 </li></ul><ul><ul><li>数据分布 </li></ul></ul><ul><ul><li>统计直方图 </li></ul></...
基于操作符的执行计划 <ul><li>物理操作符 </li></ul><ul><ul><li>功能简单专一 , 完成特定的数据库操作 </li></ul></ul><ul><ul><li>如 : 连接 , 过滤 , 排序等 </li></ul>...
实例分析 <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....
<ul><li>三、索引的本质以及调优 </li></ul>
需要了解的概念 <ul><li>索引  </li></ul><ul><li>聚集索引、非聚集索引 </li></ul><ul><li>唯一索引、非唯一索引 </li></ul><ul><li>单列索引、组合索引 </li></ul>
 
 
Clustered table/index
lustered index on a clustered table
lustered index on a clustered table
lustered index on a clustered table
lustered index on a clustered table
索引调优的 6 个知识点 <ul><li>1 、将索引和数据存放到不同的文件组 </li></ul><ul><li>2 、组合索引的使用 </li></ul><ul><li>3 、唯一索引与非唯一索引的差异 </li></ul><ul><li>...
执行计划 <ul><li>单表执行计划 </li></ul><ul><li>多表执行计划 </li></ul>
多表连接执行计划 <ul><li>1 、嵌套连接 </li></ul><ul><li>2 、 HASH 连接 </li></ul><ul><li>3 、合并连接 </li></ul><ul><li>4 、反合并连接 </li></ul><ul>...
谢谢 !
Upcoming SlideShare
Loading in …5
×

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

1,418 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. 谢谢 !

×