oracle索引

基于oracle的sql优化

时光总嘲笑我的痴心妄想 提交于 2019-11-30 21:46:56
一.编写初衷描述 【博客地址】http://www.cnblogs.com/grl214 在应有系统开发初期,由于数据库数据较少,对于sql语句各种写法的编写体现不出sql的性能优劣,随着数据的不断增加,出现海量数据,劣质sql与优质sql在执行效率甚至存在百倍差距,可见sql优化的重要性 二.Sql语句性能优化 2.1 认识Oracle的执行过程 2.2 Oracle优化法则---漏斗法则 2.3 Oracle 执行计划 2.3.1 什么是Oracle执行计划 执行计划是一条查询语句在Oracle中执行过程或者访问路径的描述. 2.3.2 查看Oracle执行计划 1.执行计划常用的列字段解释 基数:返回的结果集行数 字节:执行该步骤后返回的字节数 耗费(cust),CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好. 2.3.3 看懂Oracle执行计划 2.3.3.1执行顺序 根据缩进来判断,缩进最多的最先执行(缩进相同时,最上面的最先执行) 2.4 表的访问方式 TABLE ACCESS FULL(全表扫描) TABLE ACCESS BY ROWID(通过rowid的表存取) TABLE ACCESS BY INDEX SCAN(索引扫描) 2.4.1 ABLE ACCESS FULL(全表扫描) Oracle会读取表中的所有行

ORACLE: Analyze Table 失敗

我只是一个虾纸丫 提交于 2019-11-30 21:15:58
Oracle Analyze table 表名 :一般可以指定分析 表,所有字段,所有索引字段,所有索引。 若不指定则全部都分析。 但不一定都能成功。 最近 它就使 表 PO.PO_REQUISITION_LINES_ALL 的所有索引破坏了, 致PO模块的请购功能无法 使用。 因此,使用ANALYZE TABLE 后,建议 使用SQL: SELECT owner,index_name, table_name,status, Last_Analyzed FROM SYS.DBA_INDEXES WHERE 1=1 -- AND INDEX_NAME LIKE 'OE_ORDER_LINES_N%' AND STATUS = 'UNUSABLE' 查询索引状态是否正常。 现实环境中在 是 INDEX: OE_ORDER_LINES_N1 索引破坏状态,所有与 ONT.OE_ORDER_LINES_ALL有相的查都发生了 TABLE LOCK, 硬件资源被耗尽, 导致ORACLE EBS系统 崩溃。 来源: https://www.cnblogs.com/samrv/p/11640770.html

数据库索引

给你一囗甜甜゛ 提交于 2019-11-30 19:51:53
我们通过一个简单的例子来开始教程,解释为什么我们需要数据库索引。假设我们有一个数据库表 Employee, 这个表有三个字段(列)分别是 Employee_Name、Employee_Age 和Employee_Address。假设表Employee 有上千行数据。 现在假设我们要从这个表中查找出所有名字是‘Jesus’的雇员信息。我们决定使用下面的查询语句: SELECT * FROM Employee WHERE Employee_Name = 'Jesus' 如果表中没有所以会发生什么? 一旦我们运行这个查询,在查找名字为Jesus的雇员的过程中,究竟会发生什么?数据库不得不Employee表中的每一行并确定雇员的名字(Employee_Name)是否为 ‘Jesus’。由于我们想要得到每一个名字为Jesus的雇员信息,在查询到第一个符合条件的行后,不能停止查询,因为可能还有其他符合条件的行。所以,必须一行一行的查找直到最后一行-这就意味数据库不得不检查上千行数据才能找到所以名字为Jesus的雇员。这就是所谓的全表扫描。 数据库索引是怎样提升性能的? 你可能会想为如此简单的事情做全表扫描效率欠佳-数据库是不是应该更聪明一点呢?这就像用人眼从头到尾浏览整张表-很慢也不优雅(原文:not at all sleek,不知如何翻译才好)。但是,你可以能根据文章标题已经猜到

ORACLE表、索引和分区

|▌冷眼眸甩不掉的悲伤 提交于 2019-11-30 13:44:14
ORACLE 表、索引和分区 一、数据库表 每种类型的表都有不同的特性,分别应用与不同的领域 • 堆组织表 • 聚簇表 ( 共三种 ) • 索引组织表 • 嵌套表 • 临时表 • 外部表和对象表 1. 行迁移 • 建表过程中可以指定以下两个参数: • PCTFREE :自由空间,默认值 10 • PCTUSED (只适用于 MSSM ):默认值 40 • 设置这两个参数很重要: • 一方面避免迁移过多的行,影响性能 • 一方面避免浪费太多的空间 • 当自由空间存不下更新后的某一行时,这一行将会发生行迁移,在两个块上存储这一行数据,如下图: 2. 堆组织表 • 基本上我们使用的表都是堆组织表( heap organized table ),堆是无序的数据结构,数据的存取都是随机的,想要排序必须使用 order by 子句 • 对于 ASSM 有三个重要的选项: • PCTFREE • INITRANS :默认值 2 ,高并发会设置更大一些 • COMPRESS/NOCOMPRESS :启用 / 禁用压缩 3. 索引组织表( IOT ) • 以索引结构存储的表 • 使用场景: • 信息检索 • 空间数据 • OLAP 应用 • 创建,使用 organization index 子句: create table tbl( name varchar2(20), age int )

优化SQL之最佳索引

跟風遠走 提交于 2019-11-30 12:03:42
SQL优化工具Tosska SQL Tuning Expert for Oracle,帮助SQL开发人员解决SQL性能问题。 本工具主要创始人Richard To, 资深ITPUB元老,从1996年开始设计SQL优化工具,拥有超过20年的SQL优化经验。 工具已经从最初的1.0, 1.1,1.2,逐步演化到了3.0. 最新版本主要包含3个功能: 1. 为单条SQL产生等价SQL, 并找出最快的等价SQL; 2. 为单条SQL建议最佳索引; 3. SQL性能报表; 官网下载 https://www.tosska.cn/tosska-sql-tuning-expert-tse-oracle-free-download-zh/ 产品介绍 https://www.tosska.cn/tosska-sql-tuning-expert-tse-oracle-zh/ 下面开始介绍如何用工具建议最佳索引来优化SQL. 1. 创建数据库连接, 也可以稍后创建 (如果已经创建了数据库连接,请忽略此步骤,直接跳到第2步)。 关于如何创建连接,请看 https://www.cnblogs.com/dbexpert/p/8022663.html 2. 在“索引”页, 输入有性能问题的SQL后, 点击 “建议索引” 注意: 如果我们在“SQL”页已经输入了有性能问题的SQL, 转到“索引”页

批量导出索引的创建语句

陌路散爱 提交于 2019-11-30 11:26:58
--新项目不知道哪个缺心眼建的同构库,只是见了表结构,并没有健非主键外的索引,领导让追加一版,以前只是会用视图拼sql创建, --今天有学会一招oracle-9i以上版本可以使用 --导出的内容有点复杂需要用编辑器处理下并且替换一下实例名(schema) SELECT substr(replace(to_char(DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name)),'"',''),0,instr(replace(to_char(DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name)),'"',''),') ',1))||';' createindexsql FROM USER_OBJECTS u where U.OBJECT_TYPE = 'INDEX'; --这个可能用报错,可能有那种表和索引所属的实例不是一个用户,所以owner一定要写的完善一些 SELECT replace(TO_CHAR(dbms_lob.substr(dbms_metadata.get_ddl('INDEX',INDEX_NAME)) || ';'),'"','') from dba_indexes a WHERE a.TABLE_TYPE = 'TABLE' and a.OWNER = 'GISDATA

MySQL—05—MySQL如何处理SQL语句;MySQL数据库存储引擎介绍;

孤街浪徒 提交于 2019-11-30 09:40:30
一、 MySQL 中的执行计划 1 MySQL 执行计划 在 MySQL 中可以通过 explain 关键字模拟优化器,执行 SQL 语句,从而知道 MySQL 是 如何处理 SQL 语句的。 2 MySQL 整个查询执行过程 • 客户端向 MySQL 服务器发送一条查询请求 • 服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段 • 服务器进行 SQL 解析、预处理、再由优化器生成对应的执行计划 • MySQL 根据执行计划,调用存储引擎的 API 来执行查询 • 将结果返回给客户端,同时缓存查询结果 3 启动执行计划 EXPLAIN SELECT 投影列 FROM 表名 WHERE 条件 4 EXPLAIN 列的解释 4.1ID 查询执行顺序: id 值相同时表示从上向下执行 id 值相同被视为一组 如果是子查询,id 值会递增,id 值越高,优先级越高 4.2select_type simple: 表示查询中不包含子查询或者 union primary: 当查询中包含任何复杂的子部分,最外层的查询被标记成 primary derived: 在 from 的列表中包含的子查询被标记成 derived subquery: 在 select 或 where 列表中包含了子查询,则子查询被标记成 subquery union: 两个 select

Oracle的对象——表,同义词,序列,视图,索引和簇

孤街醉人 提交于 2019-11-30 08:22:27
一:表 a.创建表语法格式 create table table_name ( 字段1 类型1, 字段2 类型2, 字段3 类型3(也可以给字段设置默认值) ... ); Sql代码 create table student ( stuno int , stuname varchar (10) not null , stuBirth date default to_date( '1980-1-1' , 'YYYY-MM-DD' ) ); 查询一下表的结构:desc table_name Sql代码 SQL> desc student; Name Type Nullable Default Comments -------- ------------ -------- -------------------------------- -------- STUNO INTEGER Y STUNAME VARCHAR2(10) STUBIRTH DATE Y to_date( '1980-1-1' , 'YYYY-MM-DD' ) b.给已存在的表增加新列 :alter table tablen_ame add(列名1 列类型, 列名2 列类型...); Sql代码 alter table student add (t3 varchar (10),t4 varchar2(10), t5

MySQL中的KEY, PRIMARY KEY, UNIQUE KEY , INDEX 的区别

流过昼夜 提交于 2019-11-30 04:26:57
-----------转载-----------------------:原文: https://www.cnblogs.com/zjfjava/p/6922494.html 索引: 被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。 表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。 如果一个表有1000行,这比顺序读取至少快100倍。注意你需要存取几乎所有1000行,它较快的顺序读取,因为此时我们避免磁盘寻道。 所有的MySQL 索引 (PRIMARY、UNIQUE和INDEX) 在B树中存储 。字符串是自动地压缩前缀和结尾空间。 索引用于: 快速找出匹配一个WHERE子句的行; 当执行联结时,从其他表检索行; 对特定的索引列找出MAX()或MIN()值; 如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。 如果所有键值部分跟随DESC,键以倒序被读取。 在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。 如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。 PRIMARY KEY: mysql

DBMS_STATS.GATHER_TABLE_STATS详解

孤街浪徒 提交于 2019-11-30 03:00:46
由于Oracle的优化器是CBO,所以对象的统计数据对执行计划的生成至关重要! 作用:DBMS_STATS.GATHER_TABLE_STATS统计表,列,索引的统计信息(默认参数下是对表进行直方图信息收集,包含该表的自身-表的行数、数据块数、行长等信息;列的分析--列值的重复数、列上的空值、数据在列上的分布情况;索引的分析-索引页块的数量、索引的深度、索引聚合因子). DBMS_STATS.GATHER_TABLE_STATS的语法如下: DBMS_STATS.GATHER_TABLE_STATS ( ownname VARCHAR2, tabname VARCHAR2, partname VARCHAR2, estimate_percent NUMBER, block_sample BOOLEAN, method_opt VARCHAR2, degree NUMBER, granularity VARCHAR2, cascade BOOLEAN, stattab VARCHAR2, statid VARCHAR2, statown VARCHAR2, no_invalidate BOOLEAN, force BOOLEAN); 参数说明: ownname:要分析表的拥有者 tabname:要分析的表名. partname:分区的名字,只对分区表或分区索引有用. estimate