oracle索引

30个Oracle语句优化规则详解

一世执手 提交于 2019-12-03 04:33:13
选用适合的Oracle优化器 Oracle的优化器共有3种: a.RULE(基于规则) b.COST(基于成本) c.CHOOSE(选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE、COST、CHOOSE、ALL_ROWS、FIRST_ROWS。你当然也在SQL句级或是会话(session)级对其进行覆盖。 为了使用基于成本的优化器(CBO,Cost-Based Optimizer),你必须经常运行analyze命令,以增加数据库中的对象统计信息(object statistics)的准确性。 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关。如果table已经被analyze过,优化器模式将自动成为CBO,反之,数据库将采用RULE形式的优化器。 在缺省情况下,Oracle采用CHOOSE优化器,为了避免那些不必要的全表扫描(full table scan),你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器。 访问Table的方式Oracle采用两种访问表中记录的方式: a.全表扫描 全表扫描就是顺序地访问表中每条记录。Oracle采用一次读入多个数据块(database block)的方式优化全表扫描。 b.

ORACLE SQL性能优化系列

独自空忆成欢 提交于 2019-12-03 03:41:59
ORACLE SQL性能优化系列 (一) 关键字 ORACEL SQL Performance tuning 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL 句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. 如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化 器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器. 在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采 用基于规则或者基于成本的优化器. 2. 访问Table的方式 ORACLE

数据库SQL语句性能优化

匿名 (未验证) 提交于 2019-12-03 00:41:02
选择最有效率的表名顺序 WHERE子句中的连接顺序 SELECT子句中避免使用‘*‘ 当你想在select子句中列出所有的column时,使用动态sql列引用‘‘是一个方便的方法,不幸的是,这是一个非常低效的方法。 实际上,oracle在解析的过程中,会将‘‘依次转换成所有的列名。这个工作是通过查询数据字典完成的,这意味着将耗费更多的时间。 字符型字段必须加单引号 减少访问数据库的次数 ARRAYSIZE参数设置 使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表 你可以用decode函数高效地得到相同结果 ‘x‘表示任何一个字段。类似的,decode函数也可以运用于group by和order by子句中。 整合简单,无关联的数据库访问 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系),相同语句书写,同一功能同一性能不同写法SQL的影响,如: 四个SQL在ORACLE分析整理后产生的结果及执行的时间是一样的,但从ORACLE共享内存的原理,可以看出ORACLE对每一个SQL进行了一次解析,并且独立的占用共享内存,如果将SQL完全相同的格式,ORACLE只解析一次,共享内存只保留一次分析结果,这样不仅可以减少解析SQL的时间,而且可以减少共享内存里的重复信息。 删除重复记录 用TRUNCATE替代DELETE 尽量多使用COMMIT

Oracle Sql优化

匿名 (未验证) 提交于 2019-12-03 00:38:01
基本的Sql编写注意事项 尽量少用IN操作符,基本上所有的IN操作符都可以用EXISTS代替。 不用NOT IN操作符,可以用NOT EXISTS或者外连接+替代。 Oracle在执行IN子查询时,首先执行子查询,将查询结果放入临时表再执行主查询。而EXIST则是首先检查主查询,然后运行子查询直到找到第一个匹配项。NOT EXISTS比NOT IN效率稍高。但具体在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑。 不用“<>”或者“!=”操作符。对不等于操作符的处理会造成全表扫描,可以用“<” or “>”代替。 Where子句中出现IS NULL或者IS NOT NULL时,Oracle会停止使用索引而执行全表扫描。可以考虑在设计表时,对索引列设置为NOT NULL。这样就可以用其他操作来取代判断NULL的操作。 当通配符“%”或者“_”作为查询字符串的第一个字符时,索引不会被使用。 对于有连接的列“||”,最后一个连接列索引会无效。尽量避免连接,可以分开连接或者使用不作用在列上的函数替代。 如果索引不是基于函数的,那么当在Where子句中对索引列使用函数时,索引不再起作用。 Where子句中避免在索引列上使用计算,否则将导致索引失效而进行全表扫描。 对数据类型不同的列进行比较时,会使索引失效。 用“>=”替代“>”。 UNION操作符会对结果进行筛选,消除重复

oracle查询优化

匿名 (未验证) 提交于 2019-12-03 00:34:01
原则一:注意WHERE子句中的连接顺序 Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. 尤其是“主键ID=?”这样的条件。 SQL Select语句完整的执行顺序: 1、from子句组装来自不同数据源的数据; 2、where子句基于指定的条件对记录行进行筛选; 3、group by子句将数据划分为多个分组; 4、使用聚集函数进行计算; 5、使用having子句筛选分组; 6、计算所有的表达式; 7、使用order by对结果集进行排序。 原则二: SELECT子句中避免使用 ‘ * ‘ ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 。 简单地讲,语句执行的时间越短越好(尤其对于系统的终端用户来说)。而对于查询语句,由于全表扫描读取的数据多,尤其是对于大型表不仅查询速度慢,而且对磁盘IO造成大的压力,通常都要避免,而避免的方式通常是使用索引Index。 使用索引的优势与代价: 优势: 1)索引是表的一个概念部分,用来提高检索数据的效率,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快.

数据库笔记-SQLday05

匿名 (未验证) 提交于 2019-12-03 00:30:01
数据库day05 --视图: --视图(VIEW)也被称作虚表,即虚拟的表,是一组数据的逻辑表示,其本质是对应于一条SELECT语句,结果集被赋予一个名字,即视图名字 --视图也是数据库对象,视图在SQL语句中体现的样子是表的样子,但是其并不是一张真实存在的表, --而是一个查询语句的结果集。使用视图通常是为了重用子查询。 CREATE VIEW v_emp_wensq AS SELECT empno,ename,sal,deptno FROM emp_wensq WHERE deptno = 10; --视图中对应的SELECT子句中的字段可以使用别名,这样视图对应的该字段的字段名就是别名了。 --当SELECT中的字段是函数或者表达式,那么视图要求该字段必须给别名! CREATE OR REPLACE VIEW v_emp_wensq AS SELECT empno id,ename name,sal salary,deptno FROM emp_wensq WHERE deptno = 10; --对视图进行DML操作,就是对视图数据来源的基表进行的。 --向视图插入数据: --DML只能对简单视图进行,复杂视图不允许进行DML操作。 --向视图插入数据: INSERT INTO v_emp_wensq (id, name,salary,deptno) VALUES

oracle索引的创建规则及使用

匿名 (未验证) 提交于 2019-12-03 00:19:01
oracle的索引本质上是拿空间换时间,建索引是为了增加查询的速度,但是却消耗了空间。 oracle索引包括三大块: 一、rowid查询: 二、B-树索引: 具体请移步: https://blog.csdn.net/diyyong/article/details/19041485 三、自建索引: 《1、索引选择: 《2、复合索引: 四、null值与索引 五、无法使用索引的情况 文章来源: oracle索引的创建规则及使用

【11g】可扩展索引Extensible Indexing

匿名 (未验证) 提交于 2019-12-02 23:41:02
版权声明:所有文章禁止转载但是均可在生产中使用提高效率 https://blog.csdn.net/viviliving/article/details/91489876 Extensible Indexing 可扩展索引框架是一个基于sql的接口,允许您定义特定于域的操作符和索引模式,并将它们集成到Oracle服务器中。 可扩展索引框架由以下组件组成: Indextypes: indextype模式对象指定管理特定于应用程序索引的定义、维护和扫描操作的例程。索引类型告诉Oracle服务器如何在表的列或对象的属性上建立用户定义的索引。 Domain Indexes: 使用索引类型创建的特定于应用程序的索引称为域索引,因为它在特定于应用程序的域中对数据进行索引。域索引是由索引类型指定的例程创建、管理和访问的索引的实例。 Operators: 查询和数据操作语句可以使用特定于应用程序的操作符,例如空间域中的Overlaps操作符。用户定义的操作符绑定到函数。还可以使用索引对它们进行评估。例如,可以使用哈希索引计算等式运算符。索引类型为它定义的操作符提供基于索引的实现。 See Also: Chapter 9, "Defining Operators" for detailed information on user-defined operators Index-Organized

oracle之语句调优

匿名 (未验证) 提交于 2019-12-02 23:03:14
1.SQL语句大写 因为oracle总是先解析SQL语句,把小写的字母转换成大写的再执行。 2.表别名 多表join时,尽量使用表别名,同时把表别名前缀于每一列上,减少解析的时间及由列歧义引起的语法错误 3.from从右到左解析表名 from子句中写在最后的表(基础表也称为驱动表,driving table)将被最先处理,尽量记录条数最少的表作为基础表放最后,如维表 4.where自下向上解析 表之间的连接必须写在其他where条件之前, 那些可以过滤掉最大数量记录的条件必须写在where子句的末尾 5.select * 尽量避免使用*查询全部列,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。 6.避免使用耗费资源的操作: 带有DISTINCT、UNION、MINUS、INTERSECT、ORDER BY的SQL语句会启动SQL 引擎 执行耗费资源的排序(SORT)功能。DISTINCT需要一次排序操作,而其他的至少需要执行两次排序。 7.union all和union UNION两个集合时,这两个结果集合会以UNION-ALL的方式被合并,然后在输出最终结果前进行排序。如果用UNION ALL替代UNION, 这样排序就不是必要了。效率就会因此得到提高。注意UNION

从程序员的角度深入理解MySQL

匿名 (未验证) 提交于 2019-12-02 22:06:11
数据库基本原理 我对DB的理解 第一,数据库的组成:存储 + 实例 不必多说,数据当然需要存储;存储了还不够,显然需要提供程序对存储的操作进行封装,对外提供增删改查的API,即实例。 一个存储,可以对应多个实例,这将提高这个存储的负载能力以及高可用;多个存储可以分布在不同的机房、地域,将实现容灾。 第二,按Block or Page读取数据 用大腿想也知道,数据库不可能按行读取数据(Why? ^_^)。实质上,数据库,如Oracle/MySQL,都是基于固定大小(比如16K)的物理块(Block or Page,我这里就不区分统一称为Block)来实现调度和管理的。要知道Block是数据库的概念,如何对应到文件系统呢?显然需要指出“这个Block的地址在哪里”,当查找到地址后,读取固定大小的数据就相当于完成了Block的读取了。 数据库很聪明的,它不会仅仅只读取需要读取的Block,它还会替我们把附近的Block块都读取加载至内存。实际上,这是为了减少IO次数,提高命中率。事实上,一个Block块的附近Block也是热点数据,这种处理方式很有必要! 第三,磁盘IO是数据库的性能瓶颈 毫无疑问,数据在磁盘上,少不了磁盘IO。什么磁头旋转,定位磁道,寻址的过程,就不说了,我们是程序员,也管不了这些。但是这个过程确实是非常耗时的,和内存读取不是一个数量级,所以后来出现了很多方式来减少IO