oracle索引

SQL优化心得

青春壹個敷衍的年華 提交于 2020-01-09 04:45:42
我们不但会写SQL,还要做到写出性能优良的SQL,今天看了别人的文章,感觉很好、自己又加工了一下, 贴出来与大家分享,如果你还有好的经验 也拿出来分享一下 (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参数,

表空间Tablespace

别说谁变了你拦得住时间么 提交于 2020-01-08 22:09:28
Oracle Schema Objects Table Storage O racle 数据库 如何保存表数据? Oracle Database uses a data segment in a tablespace to hold table data. Oracle 数据库使用 表空间 中的 数据段 保存表 数据 。 As explained in "User Segments" , a segment contains extents made up of data blocks . 如 " 用户段 " 所述, 段 包含 由 数据块 组成的 扩展盘区 。 The data segment for a table (or cluster data segment, when dealing with a table cluster ) is located in either the default tablespace of the table owner or in a tablespace named in the CREATE TABLE statement. 表数据段 (或涉及表簇时的簇数据段)位于表所有者的默认空间中,或 CREATE TABLE 语句中所指定的表空间中。 表空间、段、区、块的关系 逻辑存储结构包括 表空间,段,区,数据块 。逻辑结构之间的关系是

Oracle逻辑存储结构

旧时模样 提交于 2020-01-08 04:52:37
一、数据块(data blocks)   数据块是 Oracle 数据库逻辑存储结构中的最小单位,也是执行数据库输入输出的最小存储单位。通常 Oracle 数据块是操作系统块的整数倍。数据块的标准大小被写入到初始化参数 DB_BLOCK_SIZE 中, oracle 允许在同一个数据库中存在不同大小的数据块,与标准块大小不同的就是非标准块。 二、数据区( extent )   数据区是由一组连续的 Oracle 数据块所构成的 Oracle 存储结构,由一个或多个数据块组成。一个或多个数据区组成一个段,当段中所有空间被使用完后, Oracle 系统将自动为该段分配一个新的数据区,可见,数据区是 Oracle 存储分配的最小单位。   使用数据区的目的是用来保存特定数据类型的数据,也是表中数据增长的基本单位。在 Oracle 数据库中,分配存储空间就是以数据区为单位的,一个 Oracle 对象包含至少一个数据区。设置一个表或索引的存储参数包含设置它的数据区大小。 三、段( segment )   段是由一个或多个数据区构成的,它不是存储空间的分配单位,而是一个独立的逻辑存储结构,用于存储表、索引或簇等占用空间的数据对象。一个段只属于一个特定的数据对象,每当创建一个具有独立段的数据对象时, Oracle 将为它创建一个段。 1.数据段:数据段中保存的是表中的数据记录。建表时

各种Oracle索引类型介绍

泪湿孤枕 提交于 2020-01-08 03:52:36
逻辑上:Single column 单行索引Concatenated 多行索引Unique 唯一索引NonUnique 非唯一索引Function-based函数索引Domain 域索引 物理上:Partitioned 分区索引NonPartitioned 非分区索引B-tree:Normal 正常型B树Rever Key 反转型B树 Bitmap 位图索引 索引结构:B-tree:适合与大量的增、删、改(OLTP);不能用包含OR操作符的查询;适合高基数的列(唯一值多)典型的树状结构;每个结点都是数据块;大多都是物理上一层、两层或三层不定,逻辑上三层;叶子块数据是排序的,从左向右递增;在分支块和根块中放的是索引的范围;Bitmap:适合与决策支持系统;做UPDATE代价非常高;非常适合OR操作符的查询; 基数比较少的时候才能建位图索引; 树型结构:索引头 开始ROWID,结束ROWID(先列出索引的最大范围)BITMAP每一个BIT对应着一个ROWID,它的值是1还是0,如果是1,表示着BIT对应的ROWID有值 1. b-tree索引Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。2. 位图索引(bitmap index

oracle来了哦rfrf

北城以北 提交于 2020-01-07 11:54:50
阅读CREATE TABLE语句: CREATE TABLE Customer# 1 ( cust-1 NUMBER(9), 3 saless$NUMBE(9) 2date DATE DEFAULT SYSDATE) 哪一行语句会引发错误? A. 1 B. 2 C. 3 D. 4 删除序列EMP-ID-SEQ应使用哪个语句 A. DELETE SEQUENCE emp_id_seq; B. DROP SEQUENCE emp_id_seg C. ALTER SEQUENCE emp_id_seq D. REMOVE SEQUENCE emp_id-seq; 关于多行子查询最好的描述是哪个? A. 只返回一条记录的子查询 B. 返回一条或多条记录的子查询 C. 只返回一个列值的子查询 D. 返回一个或多个列值的子查询 下面关于外键约束的描述哪一个是正确的? A. 外键值不能为空 B. 外键值必须唯一 C. 外键值在父表中必须存在 D. 外键值必须要么为空值,要么在父表中必须存在 AVG, SUM, VARIANCE,和STDDEV函数可用于以下何种数据类型? A. 仅数值类型 B. 仅整数 C. 何数据类型 D. 除数值类型之外的类型 哪种类型的约束要求列值唯一旦非空? A. FOREIGN KEY B. PRIMARY KEY C. UNIQUE D. CHЕCK

数据库:存储引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等

余生长醉 提交于 2020-01-06 20:11:10
存储引擎 概念 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以 获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。 存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 。 InnoDB(B+树) InnoDB 底层存储结构为B+树, B树的每个节点对应innodb的一个page,page大小是固定的,一般设为 16k。其中非叶子节点只有键值,叶子节点包含完成数据。 数据库:存储引擎+InnoDB+TokuDB+ MyIASM +Memory+索引+三范式等 适用场景 : 1)经常更新的表,适合处理多重并发的更新请求。 2)支持事务。 3)可以从灾难中恢复(通过 bin-log 日志等)。 4)外键约束。只有他支持外键。 5)支持自动增加列属性 auto_increment。 TokuDB(Fractal Tree-节点带数据) TokuDB 底层存储结构为 Fractal Tree,Fractal Tree 的结构与 B+树有些类似, 在 Fractal Tree中,每一个 child 指针除了需要指向一个 child 节点外

数据库SQL优化

北战南征 提交于 2020-01-03 21:23:00
本文链接: https://blog.csdn.net/jianzhang11/article/details/102867120 判断问题SQL 判断SQL是否有问题时可以通过两个表象进行判断: 系统级别表象 CPU消耗严重 IO等待严重 页面响应时间过长 应用的日志出现超时等错误 可以使用sar命令,top命令查看当前系统状态。 也可以通过Prometheus、Grafana等监控工具观察系统状态。(感兴趣的可以翻看我之前的文章)640?wx_fmt=png SQL语句表象 冗长 执行时间过长 从全表扫描获取数据 执行计划中的rows、cost很大 冗长的SQL都好理解,一段SQL太长阅读性肯定会差,而且出现问题的频率肯定会更高。更进一步判断SQL问题就得从执行计划入手,如下所示:640?wx_fmt=png 执行计划告诉我们本次查询走了全表扫描Type=ALL,rows很大(9950400)基本可以判断这是一段"有味道"的SQL。 获取问题SQL 不同数据库有不同的获取方法,以下为目前主流数据库的慢查询SQL获取工具 MySQL 慢查询日志 测试工具loadrunner Percona公司的ptquery等工具 Oracle AWR报告 测试工具loadrunner等 相关内部视图如v$、$session_wait等 GRID CONTROL监控工具 达梦数据库 AWR报告

oracle之索引

泪湿孤枕 提交于 2020-01-01 05:03:37
索引 11.1 索引结构及特点 两大类:B树索引,2)位图索引 11.1.1 B树索引结构(图),介绍根节点,分支节点,叶子节点,以及表行,rowid,键值,双向链等概念。 考点: 1)叶块之间使用双向链连接, 2)删除表行时索引叶块也会更新,但只是逻辑更改,并不做物理的删除叶块。 3)索引叶块中不保存表行键值的null信息。 11.1.2 位图索引结构: 位图索引适用于离散度较低的列,它的叶块中存放key, start rowid-end rowid,并应用一个函数把位图中相应key值置1,位图索引在逻辑or时效率最高。 SQL>create bitmap index job_bitmap on emp1(job); 值/行 1 2 3 4 5 6 7 8 9 10 11 12 13 14 --------------------------------------------------------------- ANALYST 0 0 0 0 0 0 0 1 0 0 0 0 1 0 CLERK 1 0 0 0 0 0 0 0 0 0 1 1 0 1 MANAGER 0 0 0 1 0 1 1 0 0 0 0 0 0 0 PRESIDENT 0 0 0 0 0 0 0 0 1 0 0 0 0 0 SALESMAN 0 1 1 0 1 0 0 0 0 0 0 0 0 0 SQL

PLSQL_性能优化系列13_Oracle Index Rebuild索引重建

℡╲_俬逩灬. 提交于 2020-01-01 05:03:10
2014-10-04 Created By BaoXinjian 一、摘要 索引重建是一个争论不休被不断热烈讨论的议题。当然Oracle官方也有自己的观点,我们很多DBA也是遵循这一准则来重建索引,那就是Oracle建议对于索引深度超过4级以及已删除的索引条目至少占有现有索引条目总数的20% 这2种情形下需要重建索引。近来Oracle也提出了一些与之相反的观点,就是强烈建议不要定期重建索引。本文是参考了1525787.1并进行相应描述。 1. 重建索引的理由 Oracle的B树索引随着时间的推移变得不平衡(误解) 索引碎片在不断增加 索引不断增加,删除的空间没有重复使用 索引 clustering factor (集群因子)不同步,可以通过重建修复(误解) 2. 重建索引的本质 本质:重建索引在数据库内部是先执行删除操作,再执行插入操作。 3. 反对重建索引的理由 (1). 大多数脚本都依赖 index_stats 动态表。此表使用以下命令填充: analyze index ... validate structure; 尽管这是一种有效的索引检查方法,但是它在分析索引时会获取独占表锁。对于大型索引,其影响会是巨大的,因为在此期间不允许对表执行DML 操作。 虽然该方法可以在不锁表的情况下在线运行,但是可能要消耗额外的时间。 (2). 重建索引的直接结果是 REDO 活动可能会增加

Oracle 索引

荒凉一梦 提交于 2020-01-01 04:56:29
1. 说明 ① 索引是数据库的对象之一,用于加快数据的检索,类似于书籍的索引。在数据库中索引可以减少数据库程序查询结果时所需要的读取的数据量,类似于在书籍中我们利用索引可以不用翻阅整本书即可找到想要的信息。 ② 索引是建立在表上的可选对象;索引的关键在于通过一组排序后的索引键来取代默认的全表扫描方式,从而提高检索效率。 ③ 索引在逻辑上和数据上都与相关的表和数据无关,当创建或者删除一个索引时,不会影响基本的表。 ④ 索引一旦建立,在表上进行DML操作时(例如在执行插入、修改或者删除相关操作时),Oracle会自动管理索引,索引删除,不会对表产生影响。 ⑤ 索引对用户是透明的,无论表上是否有索引,SQL语句的用法不变。 ⑥ oracle创建主键时会自动在该列创建索引。 2. 索引原理 ① 如果没有所以,搜索记录时需要搜索所有的记录(例如查找“name = ‘wish’”),因为不能保证满足条件的结果只有一条,所以需要全部搜索一遍。 ② 若在name上建立索引,Oracle会对全表进行一次搜索,将每条记录的name值按照顺序排列,然后构建索引条目(name和rowID),存储到索引段中,查询时可以直接查找到对应地方。 ③ 创建了索引不一定就会使用,oralce自动统计表的信息后,决定是否使用索引,表中数据很少时使用全表扫描已经很快,没有必要使用索引。 3. 索引使用 创建、修改、删除