oracle索引

SQL语句优化技术分析

与世无争的帅哥 提交于 2019-12-25 04:48:00
SQL语句优化技术分析 最近几周一直在进行数据库培训,老师精湛的技术和生动的讲解使我受益匪浅。为了让更多的新手受益,我抽空把SQL语句优化部分进行了整理,希望大家一起进步。 一、操作符优化 1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用IN的SQL至少多了一个转换的过程。一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了。 推荐方案: 在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替。 2、NOT IN操作符 此操作是强列不推荐使用的,因为它不能应用表的索引。 推荐方案: 用NOT EXISTS 方案代替 3、IS NULL 或IS NOT NULL操作 (判断字段是否为空) 判断字段是否为空一般是不会应用索引的,因为索引是不索引空值的。 推荐方案 :用其它相同功能的操作运算代替,如:a is not null 改为 a>0 或a>’’等。不允许字段为空,而用一个缺省值代替空值,如申请中状态字段不允许为空,缺省为申请。 4、>

Elastic Search

戏子无情 提交于 2019-12-23 18:57:37
Elastic Search 是一种分布式,高性能,高可用,可伸缩的搜索和分析系统 中文手册: 点击打开链接 1.为什么不能纯用数据库搜索? 如:执行select * from students where name like '%张三%' 数据库会一条一条的扫描 每条记录指定字段的文本可能很长,对这些文本一一扫描判断是否包含所需的关键字,效率很低 另外,包含“张小三“的结果搜索不出来 另外如果数据量很大,超过了一台机器的容量,此时就必须使用多台机器进行数据存储,我们自己实现的话很麻烦,ES运营而生: 自动维护数据分布到多个节点的索引的简历,还有搜索请求分布到多个节点的执行 自动维护数据的冗余副本,保证一些机器宕机了,也不会丢失任何数据 封装很多高级功能,让我们能快速开发应用和开发更加复杂的应用:复杂的搜索功能,聚合分析的功能,基于地理位置的搜索(例如距离我当前位置1公里以内的烤肉店) 2.大规模数据 当系统数据量达到十亿、百亿级别时引发的问题思考: 用什么数据库好(mysql、Oracle、sybase...) 如何解决单点故障(Zookeeper、MQ、 lvs(Linux Virtual Server)、F5、A10) 如何保证数据安全性(热备(数据库运行,采用archive log mode方式备份)、冷备(将数据库关闭之后备份,)、异地多活(不同城市 独立数据中心

收集oracle统计信息

廉价感情. 提交于 2019-12-22 08:20:44
注意,无论gather stale还是gather auto,都要求进行监视。 如果你执行一个alter table xxx monitoring命令,Oracle会用dba_tab_modifications视图来跟踪发生变动的表。 这样一来,你就确切地知道,自从上一次分析统计数据以来,发生了多少次插入、更新和删除操作。 SELECT * FROM Sys.Dba_Tab_Modifications WHERE Table_Owner = 'SCOTT'; 使用alter table xxx monitoring命令来实现Oracle表监视时,需要使用dbms_stats中的auto选项。 auto选项根据数据分布以及应用程序访问列的方式(例如通过监视而确定的一个列的工作量) 来创建直方图。使用method_opt=>’auto’类似于在dbms_stats的option参数中使用gather auto。 begin dbms_stats.gather_schema_stats(ownname => 'SCOTT', estimate_percent => dbms_stats.auto_sample_size, method_opt => 'for all columns size auto', degree => 7); end; estimate_percent选项

一文读懂之SQL数据库基础

末鹿安然 提交于 2019-12-22 01:58:07
关系型数据库和非关系型数据库(NoSQL)数据库: 关系型数据库,指的是以关系的形式来存储和管理的数据库系统,特点是: 1)以表格的形式保存数据 mysql视图: 视图:是一张基于表格或其他视图生成的虚拟的表,通常被称为虚表。 视图中不存放任何数据,存放的是查询表格的语句。当操作视图时,相当于视图帮忙去操作表格。 作用: 1)限制用户对表格数据的访问,控制表格数据的局部访问。 2、可以实现同一张表格中数据的不同显示。 3、可以对复杂的查询简单化。 数据库索引:Index,是为了提高数据库查询效率而产生的一个对象。一个形象的比喻,有了索引的Mysql就是一辆兰博基尼,没有索引的Mysql就是一个人力三轮车。 特点:索引能提高查询的效率,但是,会降低增删改的效率,因为增删改数据后,因此导致增删改的效率会变低。所以并不是每一列都需要加索引的。 哪些列需要加索引?通常列具有唯一性的可以添加索引。主键/唯一键,Oracle默认给主键和唯一键加上了索引。 -- 创建索引 create index inx_id on tb_class ( id ) ; create index 索引名 on 表名(列名) ; -- 索引创建好后,在后续的所有的查询的where子句中,一但使用该条件,就会自动生效 select * from tb_class where id = 2 ; --

索引失效原因总结

微笑、不失礼 提交于 2019-12-21 23:38:34
索引失效原因总结 原创haijiege 发布于2018-10-19 16:10:36 阅读数 379 收藏 更新于2018-10-19 16:10:36展开 今天一个同事突然问我索引为什么失效。说实在的,失效的原因有多种: 但是如果是同样的sql如果在之前能够使用到索引,那么现在使用不到索引,以下几种主要情况: 1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表) 2. 统计信息失效 需要重新搜集统计信息 3. 索引本身失效 需要重建索引 下面是一些不会使用到索引的原因 索引失效 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上。 4) 索引本身失效 5) 查询条件使用函数在索引列上(见12) 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。 10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20), 但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效. 错误的例子:select * from test where

优化SQL语句大全.

大憨熊 提交于 2019-12-21 05:26:38
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3 个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引 用的表。 (2)WHERE子句中的连接顺序: Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可 以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。 (3)SELECT子句中避免使用‘*’: Oracle在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着 将耗费更多的时间。 (4)减少访问数据库的次数: Oracle在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等。 (5)在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 , 建议值为200。 (6)使用DECODE函数来减少处理时间: 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。

SQL语句优化

♀尐吖头ヾ 提交于 2019-12-21 05:26:16
(1) 选择最有效率的表名顺序 ( 只在基于规则的优化器中有效 ) : ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中的表名, FROM 子句中写在最后的表 ( 基础表 driving table) 将被最先处理,在 FROM 子句中包含多个表的情况下 , 你必须选择记录条数最少的表作为基础表。如果有 3 个以上的表连接查询 , 那就需要选择交叉表 (intersection table) 作为基础表 , 交叉表是指那个被其他表所引用的表 . (2) WHERE 子句中的连接顺序.: ORACLE 采用自下而上的顺序解析 WHERE 子句 , 根据这个原理 , 表之间的连接必须写在其他 WHERE 条件之前 , 那些可以过滤掉最大数量记录的条件必须写在 WHERE 子句的末尾 . (3) SELECT 子句中避免使用 ‘ * ‘ : ORACLE 在解析的过程中 , 会将 '*' 依次转换成所有的列名 , 这个工作是通过查询数据字典完成的 , 这意味着将耗费更多的时间 (4) 减少访问数据库的次数: ORACLE 在内部执行了许多工作 : 解析 SQL 语句 , 估算索引的利用率 , 绑定变量 , 读数据块等; (5) 在 SQL*Plus , SQL*Forms 和 Pro*C 中重新设置 ARRAYSIZE 参数 , 可以增加每次数据库访问的检索数据量 ,

SQL语句优化

强颜欢笑 提交于 2019-12-21 05:26:02
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。 (2)WHERE子句中的连接顺序: Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。 (3)SELECT子句中避免使用‘*’: Oracle在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。 (4)减少访问数据库的次数: Oracle在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等。 (5)在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200。 (6)使用DECODE函数来减少处理时间: 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。 (7

Oracle事务和常用数据库对象

孤者浪人 提交于 2019-12-20 22:50:40
博文结构 事务的使用 索引的使用 视图的作用 序列、同义词的使用 分区表的概念 一.事务 Oracle通过事务来保证数据库中数据的一致性。 事务的含义 事务就是业务上的一个逻辑单元,它能够保证其中对数据所有的操作要么全部成功,要么全部失败 事务开始于一条可执行的SQL语句,继续执行事务主体,然后结束于以下的任意一种情况。 显式提交(commit): 当事务遇到cormmit指令时,将结束事务并永久保存所有更改的数据。 显式回滚(ollback); 当事务遇到rollback指令时,也将结束事务的执行,但是此时它回滚 所有更改的数据到事务开始时的原始值,即取消更改。 DDL语句:一旦用户执行了DDL (Data DefinitionLanguage,数据定义语言,如 CREATE. DROP 等)语句,则之前所有的DML (Data Manipulation Language,数据操作语言)操作将作为一 个事务提交.这种提交称为隐式提交。 正常结束程序:如果Oracle数据库应用程序正常结束,如使用SQL Plus工具更改了数据, 而正常退出该程序(输入"exit"), 则Oracle 自动提交事务。 非正常地结束程序:当程序崩溃或意外中止时,所有数据更改都被回滚,这种回滚称为隐 式回滚。. 事务的特点 事务的四个特性,即原子性(Atomicity). - 致性

Mysql 存储引擎的区别和比较

邮差的信 提交于 2019-12-20 08:51:31
MyISAM存储引擎   MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。 MyISAM拥有较高的插入、查询速度,但不支持事务。 MyISAM主要特性有: 大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持。 当把删除、更新和插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成。 每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16 NULL被允许在索引的列中,这个值占每个键的0~1个字节 可以把数据文件和索引文件放在不同目录(InnoDB是放在一个目录里面的)    MyISAM引擎使用B+Tree作为索引结构, 叶节点的data域存放的是数据记录的地址 。   下图是MyISAM索引的原理图:    可以看出MyISAM的索引文件仅仅保存数据记录的地址。 在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。   如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:   同样也是一颗B+Tree,data域保存数据记录的地址。 因此,MyISAM中索引检索的算法为首先按照B