NC SQL规范及效率优化知识分享.pptx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
NC SQL规范及效率优化知识分享 万多乐2015-09-16SQL性能问题优化技巧SQL规范概述总结目录概述SQL对NC性能非常重要!SQl效率问题:环境并发量大解析,执行,读结果集设计不足是SQL复杂,效率低下的重要原因快速定位解决SQL相关问题概述——执行计划执行计划的产生语法检测判断一条SQL语句的语法是否符合SQL的规范语义检查表及列是否准确?用户是否有权限访问或更改相应的表或列生成执行计划 软解析(共享池存在) 硬解析(共享池不存在)--耗时概述——执行计划Rowid概念rowid是一个伪列,一旦一行数据插入数据库,则rowid在该行的生命周期内是唯一的Row Source(行源)用在查询中,由上一操作返回的符合条件的行的集合可选择性(selectivity)唯一键的数量/表中的行数Driving Table(驱动表)Probed Table(被探查表)概述——执行计划嵌套循环读取row source1中的每一行然后在row sourc2中检查是否有匹配的行,所有被匹配的行都被放到结果集中然后处理row source1中的下一行哈希连接较小的row source被用来构建hash table与bitmap第2个row source被用来被hash第一个row source生成的hash table进行匹配,以便进行进一步的连接概述——执行计划全表扫描(FTS)顺序地读取分配给表的每个数据块,直到读到表的最高水线处Rowid 物理ID扫描通过ROWID来存取数据可以快速定位到目标数据索引唯一扫描(index unique scan)通过唯一索引查找一个数值经常返回单个ROWID概述——执行计划索引范围扫描(index range scan)使用一个索引存取多行数据索引全扫描(index full scan)查询出的数据都必须从索引中可以直接得到索引快速全扫描(index fast full scan)同索引全扫描,使用多块读功能,也可以使用并行读入概述——执行计划采用最右最上最先执行的原则SQL语句select * from ia_detailledger d, ia_calcrange c where d.ccalcrangeid=c.ccalcrangeid执行计划0 SELECT STATEMENT Optimizer=CHOOSE1 0 HASH JOIN2 1 TABLE ACCESS (FULL) OF ‘ ia_detailledger’3 1 TABLE ACCESS (FULL) OF ‘ ia_calcrange’312SQL规范SQL 规范——书写风格SQL语句全部使用小写(目前NC的整体习惯);引用字符时用单引号。如:update testable set idcol=’abcd’。连接符或运算符or、in、and、=、=、=,+,- 等前后加上一个空格;在子查询中前后必须加上括号, select col1, col2 from tablea where col3 in ( select col4 from tableb where col40);当SQL语句含有运算符时,运算符需与其他字符串用空格区分(或者用括号分开)。否则容易导致以下类似问题。在语句select a–b from table 中, a,b均为变量。拼写该语句时,如果a=6, b= -3,则语句变为select 6--3 from table。--变为Sql的注释,语句报错!在拼装SQL的时候,使用StringBuffer,不要用String+String的方式(我们目前更多的是用SqlBuilder拼写SQL);SQL 规范——书写风格严禁使用select * …….形式的语句,要指出select的具体字段;严禁使用 insert into table value(?????),要指出具体要赋值的字段;SQL语句包含多表连接时,建议对每个表命名别名,对每个字段的使用都要带上表别名,即 select a.col1, a.col2, b.col3 from tablea a, tableb b where a.col4=b.col5;拼写SQL加上表别名不仅仅是解决SQL解析耗时的问题:例: select?*?from?po_order?where?pk_order?in?(select?pk_order?from?md_class);select?*?from?po_order?a?where?a.pk_order?in?(select?b.pk_order?from?md_class?b);上面俩条SQL执行结果???SQL 规范——书写风格避免隐含的类型转换。例

文档评论(0)

整理王 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档