- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                
                            DB 和SQL 的优化 
大数据量优化原则:从需求开始,给用户真正关心的数据。 
比如,我们可能有许多历史数据,但是用户真正关心的可能只是进1 年的数据。他们对于时效性并 
不敏感。 
设计(数据处理方式):占据性能80%, 剩下的问题才是细节的SQL 编写问题。 
减少表的重复访问读取(基本思路) 
尽量少的表关联,如果必须关联,先缩小数据的范围 
采用以下的方式查询后,查询速度提高了一倍 
类似的如果分页sql 比较复杂,进行相应的优化 
select * from (很复杂的sql) where rn ? And rn=? ,这是我们一般写的分页sql。其中内部 
的那个sql 可能相当复杂。因此如果这个时候再嵌套会产生性能问题。如果可能的话,首先选出相应 
较少的数据再进行表关联,可能性能会提高不少。因为只关联了少量数据。 
用索引提高效率 
    为什么使用索引效率较高: 原理其实很简单——和书的目录结构类似,用较少的数据定位较多 
的数据。但是被检索数据的重复率较高,则应慎重考虑使用索引。同样,如果查询的数据涵盖全表总 
数据量的70% (这个数是我瞎估计的),或者表的数据量比较小,则很有可能全表扫描的速度更 
快,因为很可能使用索引的Cost 还不如全表扫描。但是大多数情况使用索引将极大的提高查询速度。 
    索引是表的一个概念部分,用来提高检索数据的效率,ORACLE 使用了一个复杂的自平衡B- 
tree 结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE 找出执行查询和Update 语句的 
最佳路径时, ORACLE 优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率. 另一个使 
用索引的好处是,它提供了主键(primary key) 的唯一性验证.。那些LONG 或LONG RAW 数据类 
型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现, 在扫描小表 
时,使用索引同样能提高效率. 虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代 
价. 索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也 
会被修改. 这意味着每条记录的INSERT , DELETE , UPDATE 将为此多付出4 , 5 次的磁盘I/O 。 
因为索引需要额外的存储空间和处理。那些不必要的索引反而会使查询反应时间变慢。 
    从DBA 的角度来说,定期的重建索引是有必要的:ALTER INDEX REBUILD 
    使用索引时需要注意,以下几种查询方式将不会使用索引而执行全表扫描: 
●  在索引列上使用函数 
    除非对特殊函数建立了函数索引,否则一旦在查询列上使用函数,则将导致不走索引 查询。 
    如 select     …     from     table_name     where     to_char(column_with_index)     =  
    query_condition 
    需要注意的是,当比较不同数据类型的数据时, ORACLE 自动对列进行简单的类型转换。很可 
    能造成索引失效的问题 
    假设 EMPN    是一个数值类型的索引列. 
    SELECT … FROM EMP WHERE EMPNO =‘123 
    实际上,经过ORACLE 类型转换, 语句转化为:SELECT … FROM EMP WHERE EMPNO =  
    TO_NUMBER(‘123)幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变。现在,假 
    设EMP_TYPE 是一个字符类型的索引列:SELECT … FROM EMP WHERE EMP_TYPE =  
    123  
    这个语句被ORACLE 转换为:SELECT … FROM EMP WHERE TO_NUMBER(EMP_TYPE) =  
    123 
    因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE 对你的SQL 进行隐式的 
    类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时,                       ORACLE 会优先将 
    字符类型转换为数值类型。 
    比较特殊的是‘||是字符连接函数。因此同其他函数一样会导致停止进行索引查询。 
●  在索引列上使用NOT 或!=操作符。 
●  在LIKE 模糊中使用两边通配符 
●  在索引列上使用计算 
    WHERE 子句中,如果索引列
                
原创力文档
                        

文档评论(0)