oracle索引表怎么用 oracle怎么给表加索引
oracle数据库添加索引怎么使用
索引建立代码:
创新互联秉承实现全网价值营销的理念,以专业定制企业官网,成都网站建设、成都网站设计,微信平台小程序开发,网页设计制作,移动网站建设,全网营销推广帮助传统企业实现“互联网+”转型升级专业定制企业官网,公司注重人才、技术和管理,汇聚了一批优秀的互联网技术人才,对客户都以感恩的心态奉献自己的专业和所长。
CREATE INDEX命令语法:
CREATE INDEX
CREATE [unique] INDEX [user.]index
ON [user.]table (column [ASC | DESC] [,column
[ASC | DESC] ] ... )
[CLUSTER [scheam.]cluster]
[INITRANS n]
[MAXTRANS n]
[PCTFREE n]
[STORAGE storage]
[TABLESPACE tablespace]
[NO SORT]
Advanced
其中:
schema ORACLE模式,缺省即为当前帐户
index 索引名
table 创建索引的基表名
column 基表中的列名,一个索引最多有16列,long列、long raw
列不能建索引列
DESC、ASC 缺省为ASC即升序排序
CLUSTER 指定一个聚簇(Hash cluster不能建索引)
INITRANS、MAXTRANS 指定初始和最大事务入口数
Tablespace 表空间名
STORAGE 存储参数,同create table 中的storage.
PCTFREE 索引数据块空闲空间的百分比(不能指定pctused)
NOSORT 不(能)排序(存储时就已按升序,所以指出不再排序)
Oracle PL/SQL (4) - 索引表INDEX BY BINARY_INTEGER 的使用
Oracle PL/SQL语言中索引表相当于JAVA中的数组,可以保存多个数据,并通过下标来访问。不同的是,索引表的下标可以是整数也可以是负数或字符串,索引表无需初始化,可以直接为指定索引赋值,开辟的索引表的索引不一定必须连续。
1、索引表的定义语法
例如:
IS TABLE OF 相当于是数组,这里定义了一个数组类型info_index ;
VARCHAR2(20) 定义数组里面只能放字符串
INDEX BY BINARY_INTEGER 定义数组下标是整数
输出结果:
AAA
BBB
2、定义type型的索引表
使用IS TABLE OF获取同一事故下所有定损单的定损单号、定损金额。
输出结果:
定损单号:claim01定损总金额:73446
定损单号:claim01_01定损总金额:128327
3、定义rowtype 型的索引表
例如:使用IS TABLE OF获取所有公司信息。
输出结果:
公司code:10001400 公司名称:总公司 公司等级:1
公司code:205 公司名称:深圳分公司 公司等级:2
公司code:333 公司名称:测试分公司 公司等级:2
4、使用记录类型操作索引表
输出结果:
事故号:1111111 定损总金额:111 任务分配时间:2019-02-26
使用记录类型操作索引表,输出某个下标的结果
输出结果:
公司code:10001 公司名称:总公司 公司等级:1
使用记录类型操作索引表,输出所有下标结果
输出结果:
公司code:10001 公司名称:总公司 公司等级:1
公司code:333 公司名称:测试分公司 公司等级:2
5、多级索引表
输出结果:
显示二维索引表的所有元素:
nvl(1,1)=10
nvl(1,2)=5
nvl(2,1)=100
nvl(2,2)=50
oracle怎么通过索引查询数据语句
oracle对于数据库中的表信息,存储在系统表中。查询已创建好的表索引,可通过相应的sql语句到相应的表中进行快捷的查询:\x0d\x0a1. 根据表名,查询一张表的索引\x0d\x0a\x0d\x0aselect * from user_indexes where table_name=upper('表名');\x0d\x0a\x0d\x0a2. 根据索引号,查询表索引字段\x0d\x0a\x0d\x0aselect * from user_ind_columns where index_name=('索引名');\x0d\x0a\x0d\x0a3.根据索引名,查询创建索引的语句\x0d\x0a\x0d\x0aselect dbms_metadata.get_ddl('INDEX','索引名', ['用户名']) from dual ; --['用户名']可省,默认为登录用户\x0d\x0a\x0d\x0aPS:dbms_metadata.get_ddl还可以得到建表语句,如:\x0d\x0a\x0d\x0aSELECT DBMS_METADATA.GET_DDL('TABLE','表名', ['用户名']) FROM DUAL ; //取单个表的建表语句,['用户名']可不输入,默认为登录用户\x0d\x0aSELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name) FROM USER_TABLES u; //取用户下所有表的建表语句\x0d\x0a\x0d\x0a当然,也可以用pl/sql developer工具来查看相关的表的各种信息。
Oracle使用(九)_表的创建/约束/索引
表创建标准语法:
CREATE TABLE [schema.]table
(column datatype [DEFAULT expr] , …);
--设计要求:建立一张用来存储学生信息的表,表中的字段包含了学生的学号、姓名、年龄、入学日期、年级、班级、email等信息,
--并且为grade指定了默认值为1,如果在插入数据时不指定grade得值,就代表是一年级的学生
--DML是不需要commit的,隐式事务
create table student
(
stu_id number(10),
name varchar2(20),
age number(2),
hiredate date,
grade varchar2(10) default 1,
classes varchar2(10),
email varchar2(50)
);
-- 注意日期格式要转换,不能是字符串,varchar2类型要用引号,否则出现类型匹配
--DML 需要收到commit
insert into student values(20211114,'zhangsan',22,to_date('2021-11-14','YYYY-MM-DD'),'2','1',' 123@qq.com ');
insert into student(stu_id,name,age,hiredate,classes,email) values(20211114,'zhangsan',22,to_date('2021-11-14','YYYY-MM-DD'),'1',' 1234@qq.com ');
select * from student;
-- 给表添加列,添加新列时不允许为not null,因为与旧值不兼容
alter table student add address varchar(100);
-- 删除列
alter table student drop column address;
--修改列
alter table student modify(email varchar2(100));
正规表设计使用power disinger
--表的重命名
rename student to stu;
-- 表删除
drop table stu;
**
在删除表的时候,经常会遇到多个表关联的情况(外键),多个表关联的时候不能随意删除,使用如下三种方式:
2.表的约束(constraint)
约束:创建表时,指定的插入数据的一些规则
约束是在表上强制执行的数据校验规则
Oracle 支持下面五类完整性约束:
1). NOT NULL 非空约束 ---- 插入数据时列值不能空
2). UNIQUE Key 唯一键约束 ----限定列唯一标识,唯一键的列一般被用作索引
3). PRIMARY KEY 主键约束 ----唯一且非空,一张表最好有主键,唯一标识一行记录
4). FOREIGN KEY 外键约束---多个表间的关联关系,一个表中的列值,依赖另一张表某主键或者唯一键
-- 插入部门编号为50的,部门表并没有编号为50的,报错
insert into emp(empno,ename,deptno) values(9999,'hehe',50);
5). CHECK 自定义检查约束---根据用户需求去限定某些列的值,使用check约束
-- 添加主键约束/not null约束/check约束/唯一键约束
create table student
(
stu_id number(10) primary key,
name varchar2(20) not null,
age number(3) check(age0 and age126),
hiredate date,
grade varchar2(10) default 1,
classes varchar2(10),
email varchar2(50) unique,
deptno number(2),
);
-- 添加外键约束
create table stu
(
stu_id number(10) primary key,
name varchar2(20) not null,
age number(3) check(age0 and age126),
hiredate date,
grade varchar2(10) default 1,
classes varchar2(10),
email varchar2(50) unique,
deptno number(2),
FOREIGN KEY(deptno) references dept(deptno)
);
-- 创建表时没添加外键约束 也可以修改 其中fk_0001为外键名称
alter table student add constraint fk_0001 foreign key(deptno) references dept(deptno);
索引创建有两种方式:
组合索引:多个列组成的索引
--索引:加快数据剪碎
create index i_ename on emp(ename);
--当创建某个字段索引后,查询某个字段会自动使用到索引
select * from emp where ename = 'SMITH';
--删除索引 索引名称也是唯一的
drop index i_ename;
一些概念:
回表:
覆盖索引
组合索引
最左匹配
Oracle创建索引SQL简单的例子,在表中的指定字段和如何使用索引呢?
create index index_name on table_name(column_name) ;\x0d\x0a只要你查询使用到建了索引的字段,一般都会用到索引。 \x0d\x0a \x0d\x0a--创建表\x0d\x0acreate table aaa\x0d\x0a(\x0d\x0a a number,\x0d\x0a b number\x0d\x0a);\x0d\x0a--创建索引\x0d\x0acreate index idx_a on aaa (a);\x0d\x0a--使用索引\x0d\x0aselect * from aaa where a=1;\x0d\x0a这句查询就会使用索引 idx_a
Oracle数据访问和索引的使用
· 通过全表扫描的方式访问数据;
· 通过ROWID访问数据;
· 通过索引的方式访问数据;
· Oracle顺序读取表中所有的行,并逐条匹配WHERE限定条件。
· 采用多块读的方式进行全表扫描,可以有效提高系统的吞吐量,降低I/O次数。
· 即使创建索引,Oracle也会根据CBO的计算结果,决定是否使用索引。
注意事项:
· 只有全表扫描时才可以使用多块读。该方式下,单个数据块仅访问一次。
· 对于数据量较大的表,不建议使用全表扫描进行访问。
· 当访问表中的数据量超过数据总量的5%—10%时,通常Oracle会采用全表扫描的方式进行访问。
· 并行查询可能会导致优化器选择全表扫描的方式。1.2ROWID访问表
· Rowid是数据存放在数据库中的物理地址,能够唯一标识表中的一条数据。
· Rowid指出了一条记录所在的数据文件、块号以及行号的位置,因此通过ROWID定位单行数据是最快的方法。
注意事项:
· Rowid作为一个伪列,其数值并不存储在数据库中,当查询时才进行计算。
· Rowid除了在同一集簇中可能不唯一外,每条记录的Rowid唯一。1.3 INDEX访问表
· 通过索引查找相应数据行的Rowid,再根据Rowid查找表中实际数据的方式称为“索引查找”或者“索引扫描”。
· 一个Rowid对应一条数据行(根据Rowid查找结果,仅需要对Rowid相应数据的数据块进行一次I/O操作),因此该方式属于“单块读”。
· 对于索引,除了存储索引的数据外,还保存有该数据对应的Rowid信息。
· 索引扫描分为两步:1)扫描索引确定相应的Rowid信息。 2)根据Rowid从表中获得对应的数据。
注意事项:
· 对于选择性高的数据行,索引的使用会提升查询的性能。但对于DML操作,尤其是批量数据的操作,可能会导致性能的降低。
· 全表扫描的效率不一定比索引扫描差,关键看数据在数据块上的具体分布。
索引是关系数据库中用于存放每一条记录的一种对象,主要目的是加快数据的读取速度和完整性检查。建立索引是一项技术性要求高的工作。一般在数据库设计阶段的与数据库结构一道考虑。应用系统的性能直接与索引的合理直接有关。
(1) 单列索引
单列索引是基于单个列所建立的索引。
(2) 复合索引
复合索引是基于两列或是多列的索引,在同一张表上可以有多个索引,但是要求列的组合必须不同。
(1) 重命名索引
(2) 合并索引
(表使用一段时间后在索引中会产生碎片,此时索引效率会降低,可以选择重建索引或者合并索引,合并索引方式更好些,无需额外存储空间,代价较低)
(3) 重建索引
方式一:删除原来的索引,重新建立索引
当不需要时可以将索引删除以释放出硬盘空间。命令如下:
例如:
注:当表结构被删除时,有其相关的所有索引也随之被删除。
方式二: Alter index 索引名称 rebuild;
· 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
· 索引可以大大加快数据的检索速度,这是创建索引的最主要的原因。
· 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
· 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
· 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
· 索引的层次不要超过4层。
· 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
· 除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
· 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
· 更新数据的时候,系统必须要有额外的时间来同时对索引进行更新,以维持数据和索引的一致性。
1) 不恰当的索引不但于事无补,反而会降低系统性能。因为大量的索引在进行插入、修改和删除操作时比没有索引花费更多的系统时间。
1) 应该建索引的列
· 在经常需要搜索的列上,可以加快搜索的速度;
· 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
· 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
· 在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
· 在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
· 在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
2) 不应该建索引的列
· 在大表上建立索引才有意义,小表无意义。
· 对于那些在查询中很少使用或者参考的列不应该创建索引。
· 对于那些只有很少数据值的列也不应该增加索引。比如性别,在查询的结果中,结果集的数据行占了表中数据行的很大比例,。增加索引,并不能明显加快检索速度。
· 对于那些定义为blob数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
· 当修改性能远远大于检索性能时,不应该创建索引。
一个表中有几百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这主要可能是oracle的索引限制造成的。Oracle的索引有一些索引限制,在这些索引限制发生的情况下,即使已经加了索引,oracle还是会执行一次全表扫描,查询的性能不会比不加索引有所提高,反而可能由于数据库维护索引的系统开销造成性能更差。
下面的查询即使在djlx列有索引,查询语句仍然执行一次全表扫描。
把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。
特别注意:通过把不等于操作符改成OR条件,就可以使用索引,避免全表扫描。
使用IS NULL或IS NOT NULL同样会限制索引的使用。因此在建表时,把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引)。
如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。 下面的查询不会使用索引(只要它不是基于函数的索引)
也是比较难于发现的性能问题之一。比如:bdcs_qlr_xz中的zjh是NVARCHAR2类型,在zjh字段上有索引。如果使用下面的语句将执行全表扫描。
因为Oracle会自动把查询语句改为
特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次“全表扫描”。
(1) 索引无效
(2) 索引有效
文章名称:oracle索引表怎么用 oracle怎么给表加索引
分享URL:http://cdiso.cn/article/hhpdei.html