1、SQL语句分类
DQL(数据查询语言)select
DML(数据操作语言)insert、delete、update
DDL(数据定义语言)create、drop、alter
DCL(数据控制语言)grant:把权限授予用户、revoke:把权限从用户收回
TPL(TCL,事务控制语言):commit、rollback
2、Oracle是怎样分页的
Oracle用rownum进行分页
分页语句的步骤:
a.最内层sql,查询要分页的所有数据
b.第二层sql,通过rownum伪列确定显示数据的上限,并且给查询的数据添加rownum伪列的值
c.最外层sql,设置显示数据的下限
select*from
(select a.*,rownum r from
(select*from表名 where条件 orderby列) a
whererownum<=页数*条数) b where r>(页数-1)*条数
3、truncate和delete区别
1)Truncate和delete都可以将数据实体删掉,truncate操作不记录到rollback日志,同时数据不能恢复
2)Truncate是数据定义语言(DDL),delete是数据操作语言(DML)
3)Truncate不能对视图进行操作,delete操作不会腾出表空间的内存
4)truncate 速度远快于 delete; 原因是:当我们运行delete操作时全部表数据先被copy到回滚表空间。数据量不同花费时间长短不一。而truncate是直接删除数据不进回滚表空间。
5)truncate 操作不会触发表上的delete触发器。而delete会正常触发。
6)truncate语句不能带where条件意味着仅仅能所有数据删除,而delete可删除部分数据;
7)truncate 操作会重置表的高水位线(High Water Mark),而delete不会。
4、说说Oracle中经常使用到的函数
length长度、lower小写、upper大写、
to_date转化日期、to_char转化字符、to_number转化数字
Ltrim去左边空格、rtrim去右边空格、substr截取字符串、
add_month增加或减掉月份
5、主键有几种?
复合型、整数型、字符型
6、怎样创建一个索引,索引使用的原则,有什么优缺点
create index 索引名 on 表名(列名)
原则:
建议索引列建立not null约束
经常与其他表进行连接的表,在连接列上建立索引
优缺点:
创建索引能大大加快检索速度,加强表与表的连接,但是创建索引很占用空间
7、使用oracle伪列删除表中的重复数据中的一条
delete fromtable t where t.rowid!=(select max(t1.rowid) from table t1 wheret.name=t1.name)
8、如何只显示重复数据
select * fromtable group by id having count(*)>1
9、什么是数据库的映射
就是将数据库中表与字段对应到模型层类名与属性的过程
10、如何设计数据库
首先分析项目,看看项目中有多少实体(矩形),为每个实体添加属性(椭圆),明确实体之间的关系(菱形),绘制E-R图,将E-R图转换成表格
11、如何实现数据库的优化
1)调整数据库结构的设计:需要考虑是否使用分区功能、是否建立索引等
2)调整数据库的SQL语句
3)调整服务器的内存分配
4)调整硬盘I/O
5)调整操作系统参数
12、关系型数据库的关系操作有哪些?
选择(查询某些行)、投影(查询某些列)、链接(把多张表连接获取数据)、增加、删除、修改
13、SQL语句与SQL*PLUS命令的区别
1)SQL是关系型数据库的标准操作语言,而SQL*PLUS是一个客户端工具,除了执行标准的SQL外,还可以执行工具本身的一些命令。
2)SQL语句不可以缩写,而SQL*PLUS命令可以缩写
15、oracle数据库中如何显示表的结构
新建命令窗口,输入desc 表名
16、oracle中数据库对象的命名规则
1)必须由字母开始,长度在1-30个字符之间
2)包含字母、数字、_、$、#
3)同一个Oracle服务器所拥有的对象名不能重复
4)名字不能为Oracle的保留字
5)大小写不敏感
17、数据库的三大范式是什么?
1)第一范式:原子件,要求每一列的值不能再拆分了
2)第二范式:一张表只描述一个实体(若列中有冗余数据,则不满足)
3)第三范式:所有列与主键直接相关
18、事务的特性(ACID)是指什么?
1)原子性(Atomic):事务中的各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败
2)一致性(Consistent):事务结束后系统状态是一样的
3)隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态
4)持久性(Durable):事务完成后,即使发生灾难性的故障,通过日志和同步备份可以在故障发生后重建数据
19、MySQL数据库与Oracle数据库有什么区别
1)应用方面:MySQL是中小型应用的数据库,一般用于个人项目或中小型网站及论坛。Oracle属于大型数据库,一般在具有相当规模的企业应用。
2)自动增长的数据类型方面:MySQL有自动增长的数据类型。Oracle没有自动增长的数据类型,需要建立一个自增序列
3)group by用法:MySQL中group by在select语句中可以随意使用,但是在Oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的或者是group by子句中的列,否则报错
4)引号方面:MySQL中用双引号包起字符串,Oracle中只可以用单引号包起字符串
20、集合操作符minus和interset
如果表A和表B数据例如以下:
表A:
data
----------
a
b
b
c
表B
data
----------
b
c
d
d
问1:SELECT DATA FROM A MINUS SELECT DATA FROM B; 运行结果?
--------------------------------------------------------------------------------------------------
答案:a
问2:SELECT DATA FROM A INTERSECT SELECT DATA FROM B; 运行结果?
答案:bc
集合操作符总结:
1)UNION:由每一个查询 选择的 全部不反复的行组成。并集不包括反复值, 默认按第 1 个查询的第 1 列升序排列。
2)UNION ALL: 由每一个查询 选择的 全部的行。全然并集包括反复值。 不排序。
3) MINUS : 在第一个查询中。 不在后面查询中的行。
不包括反复。 按第1 个查询的第 1 列升序排列。
4)INTERSECT: 取每一个查询结果的交集。 不包括反复行。 按第1 个查询的第 1 列升序排列。
21、如何使用Oracle的游标?
1)oracle中的游标分为显示游标和隐式游标
2)显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;隐式游标是在执行插入 (insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。
3)显式游标的操作:打开游标、操作游标、关闭游标;PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它。
22、Oracle的导入导出有几种方式,有何区别?
1)使用oracle工具 exp/imp
2)使用plsql相关工具
方法1. 导入/导出的是二进制的数据, 2.plsql导入/导出的是sql语句的文本文件
物理优化的一些原则:
1)Oracle的运行环境(网络,硬件等)
2)使用合适的优化器
3)合理配置oracle实例参数
4)建立合适的索引(减少IO)
5)将索引数据和表数据分开在不同的表空间上(降低IO冲突)
6)建立表分区,将数据分别存储在不同的分区上(以空间换取时间,减少IO)
逻辑上优化:
1)可以对表进行逻辑分割,如中国移动用户表,可以根据手机尾数分成10个表,这样对性能会有一定的作用
2)Sql语句使用占位符语句,并且开发时候必须按照规定编写sql语句(如全部大写,全部小写等)oracle解析语句后会放置到共享池中
如:select * from Emp where name=? 这个语句只会在共享池中有一条,而如果是字符串的话,那就根据不同名字存在不同的语句,所以占位符效率较好
3)数据库不仅仅是一个存储数据的地方,同样是一个编程的地方,一些耗时的操作,可以通过存储过程等在用户较少的情况下执行,从而错开系统使用的高峰时间,提高数据库性能
4)尽量不使用*号,如select * from Emp,因为要转化为具体的列名是要查数据字典,比较耗时
5)选择有效的表名
对于多表连接查询,可能oracle的优化器并不会优化到这个程度, oracle 中多表查询是根据FROM字句从右到左的数据进行的,那么最好右边的表(也就是基础表)选择数据较少的表,这样排序更快速,如果有link表(多对多中间表),那么将link表放最右边作为基础表,在默认情况下oracle会自动优化,但是如果配置了优化器的情况下,可能不会自动优化,所以平时最好能按照这个方式编写sql
6)Where字句 规则
Oracle 中Where字句时从右往左处理的,表之间的连接写在其他条件之前,能过滤掉非常多的数据的条件,放在where的末尾, 另外!=符号比较的列将不使用索引,列经过了计算(如变大写等)不会使用索引(需要建立起函数), is null、is not null等优化器不会使用索引
7)使用Exits Not Exits 替代 In Not in
8)合理使用事务,合理设置事务隔离性
数据库的数据操作比较消耗数据库资源的,尽量使用批量处理,以降低事务操作次数
1)增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍可以使用;
2)减少关闭时间:如果系统故障只影响表的一部份分区,那么只有这部份分区需要修复,可能比整个大表修复花的时间更少;
3)维护轻松:如果需要得建表,独产管理每个公区比管理单个大表要轻松得多;
4)均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;
5)改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快
6)分区对用户透明,最终用户感觉不到分区的存在。
1)order by中的列必须包含相同的索引并且索引顺序和排序顺序一致
2)不能有null值的列
所以排序的性能往往并不高,所以建议尽量避免order by
解决办法:
1)查找出被锁的表
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
2)杀进程中的会话
alter system kill session "sid,serial#";
18. 简述oracle中 dml、ddl、dcl的使用
Dml 数据操纵语言,如select、update、delete,insert
Ddl 数据定义语言,如create table 、drop table 等等
Dcl 数据控制语言, 如 commit、 rollback、grant、 invoke等。
CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建 唯一索引:
CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建 组合索引:
CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空间名;
创建 反向键索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;
索引使用原则:
索引字段建议建立NOT NULL约束
经常与其他表进行连接的表,在连接字段上应该建立索引;
经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;
可选择性高的关键字 ,应该建立索引;
可选择性低的关键字,但数据的值分布差异很大时,选择性数据比较少时仍然可以利用索引提高效率
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的第一个字段,一般是选择性较好的且在where子句中常用的字段上;
B、复合索引的几个字段经常同时以AND方式出现在Where子句中可以建立复合索引;否则单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
频繁DML的表,不要建立太多的索引;
不要将那些频繁修改的列作为索引列;
索引的优缺点:
优点:
1. 创建唯一性索引,保证数据库表中每一行数据的唯一性
2. 大大加快数据的检索速度,这也是创建索引的最主要的原因
3. 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
缺点:
1. 索引创建在表上,不能创建在视图上
2. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
3. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
4. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
好处:
1. 可以简单的将视图理解为sql查询语句,视图最大的好处是不占系统空间
2. 一些安全性很高的系统,不会公布系统的表结构,可能会使用视图将一些敏感信息过虑或者重命名后公布结构
3. 简化查询
可以控制权限的,在使用的时候需要将视图的使用权限grant给用户。
DQL(数据查询语言)select
DML(数据操作语言)insert、delete、update
DDL(数据定义语言)create、drop、alter
DCL(数据控制语言)grant:把权限授予用户、revoke:把权限从用户收回
TPL(TCL,事务控制语言):commit、rollback
2、Oracle是怎样分页的
Oracle用rownum进行分页
分页语句的步骤:
a.最内层sql,查询要分页的所有数据
b.第二层sql,通过rownum伪列确定显示数据的上限,并且给查询的数据添加rownum伪列的值
c.最外层sql,设置显示数据的下限
select*from
(select a.*,rownum r from
(select*from表名 where条件 orderby列) a
whererownum<=页数*条数) b where r>(页数-1)*条数
3、truncate和delete区别
1)Truncate和delete都可以将数据实体删掉,truncate操作不记录到rollback日志,同时数据不能恢复
2)Truncate是数据定义语言(DDL),delete是数据操作语言(DML)
3)Truncate不能对视图进行操作,delete操作不会腾出表空间的内存
4)truncate 速度远快于 delete; 原因是:当我们运行delete操作时全部表数据先被copy到回滚表空间。数据量不同花费时间长短不一。而truncate是直接删除数据不进回滚表空间。
5)truncate 操作不会触发表上的delete触发器。而delete会正常触发。
6)truncate语句不能带where条件意味着仅仅能所有数据删除,而delete可删除部分数据;
7)truncate 操作会重置表的高水位线(High Water Mark),而delete不会。
4、说说Oracle中经常使用到的函数
length长度、lower小写、upper大写、
to_date转化日期、to_char转化字符、to_number转化数字
Ltrim去左边空格、rtrim去右边空格、substr截取字符串、
add_month增加或减掉月份
5、主键有几种?
复合型、整数型、字符型
6、怎样创建一个索引,索引使用的原则,有什么优缺点
create index 索引名 on 表名(列名)
原则:
建议索引列建立not null约束
经常与其他表进行连接的表,在连接列上建立索引
优缺点:
创建索引能大大加快检索速度,加强表与表的连接,但是创建索引很占用空间
7、使用oracle伪列删除表中的重复数据中的一条
delete fromtable t where t.rowid!=(select max(t1.rowid) from table t1 wheret.name=t1.name)
8、如何只显示重复数据
select * fromtable group by id having count(*)>1
9、什么是数据库的映射
就是将数据库中表与字段对应到模型层类名与属性的过程
10、如何设计数据库
首先分析项目,看看项目中有多少实体(矩形),为每个实体添加属性(椭圆),明确实体之间的关系(菱形),绘制E-R图,将E-R图转换成表格
11、如何实现数据库的优化
1)调整数据库结构的设计:需要考虑是否使用分区功能、是否建立索引等
2)调整数据库的SQL语句
3)调整服务器的内存分配
4)调整硬盘I/O
5)调整操作系统参数
12、关系型数据库的关系操作有哪些?
选择(查询某些行)、投影(查询某些列)、链接(把多张表连接获取数据)、增加、删除、修改
13、SQL语句与SQL*PLUS命令的区别
1)SQL是关系型数据库的标准操作语言,而SQL*PLUS是一个客户端工具,除了执行标准的SQL外,还可以执行工具本身的一些命令。
2)SQL语句不可以缩写,而SQL*PLUS命令可以缩写
15、oracle数据库中如何显示表的结构
新建命令窗口,输入desc 表名
16、oracle中数据库对象的命名规则
1)必须由字母开始,长度在1-30个字符之间
2)包含字母、数字、_、$、#
3)同一个Oracle服务器所拥有的对象名不能重复
4)名字不能为Oracle的保留字
5)大小写不敏感
17、数据库的三大范式是什么?
1)第一范式:原子件,要求每一列的值不能再拆分了
2)第二范式:一张表只描述一个实体(若列中有冗余数据,则不满足)
3)第三范式:所有列与主键直接相关
18、事务的特性(ACID)是指什么?
1)原子性(Atomic):事务中的各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败
2)一致性(Consistent):事务结束后系统状态是一样的
3)隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态
4)持久性(Durable):事务完成后,即使发生灾难性的故障,通过日志和同步备份可以在故障发生后重建数据
19、MySQL数据库与Oracle数据库有什么区别
1)应用方面:MySQL是中小型应用的数据库,一般用于个人项目或中小型网站及论坛。Oracle属于大型数据库,一般在具有相当规模的企业应用。
2)自动增长的数据类型方面:MySQL有自动增长的数据类型。Oracle没有自动增长的数据类型,需要建立一个自增序列
3)group by用法:MySQL中group by在select语句中可以随意使用,但是在Oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的或者是group by子句中的列,否则报错
4)引号方面:MySQL中用双引号包起字符串,Oracle中只可以用单引号包起字符串
20、集合操作符minus和interset
如果表A和表B数据例如以下:
表A:
data
----------
a
b
b
c
表B
data
----------
b
c
d
d
问1:SELECT DATA FROM A MINUS SELECT DATA FROM B; 运行结果?
--------------------------------------------------------------------------------------------------
答案:a
问2:SELECT DATA FROM A INTERSECT SELECT DATA FROM B; 运行结果?
答案:bc
集合操作符总结:
1)UNION:由每一个查询 选择的 全部不反复的行组成。并集不包括反复值, 默认按第 1 个查询的第 1 列升序排列。
2)UNION ALL: 由每一个查询 选择的 全部的行。全然并集包括反复值。 不排序。
3) MINUS : 在第一个查询中。 不在后面查询中的行。
不包括反复。 按第1 个查询的第 1 列升序排列。
4)INTERSECT: 取每一个查询结果的交集。 不包括反复行。 按第1 个查询的第 1 列升序排列。
21、如何使用Oracle的游标?
1)oracle中的游标分为显示游标和隐式游标
2)显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理;隐式游标是在执行插入 (insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。
3)显式游标的操作:打开游标、操作游标、关闭游标;PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它。
22、Oracle的导入导出有几种方式,有何区别?
1)使用oracle工具 exp/imp
2)使用plsql相关工具
方法1. 导入/导出的是二进制的数据, 2.plsql导入/导出的是sql语句的文本文件
23、优化Oracle数据库,有几种方式?
数据库性能最关键的因素在于IO,因为操作内存是快速的,但是读写磁盘是速度很慢的,优化数据库最关键的问题在于减少磁盘的IO,就个人理解应该分为物理的和逻辑的优化, 物理的是指oracle产品本身的一些优化,逻辑优化是指应用程序级别的优化物理优化的一些原则:
1)Oracle的运行环境(网络,硬件等)
2)使用合适的优化器
3)合理配置oracle实例参数
4)建立合适的索引(减少IO)
5)将索引数据和表数据分开在不同的表空间上(降低IO冲突)
6)建立表分区,将数据分别存储在不同的分区上(以空间换取时间,减少IO)
逻辑上优化:
1)可以对表进行逻辑分割,如中国移动用户表,可以根据手机尾数分成10个表,这样对性能会有一定的作用
2)Sql语句使用占位符语句,并且开发时候必须按照规定编写sql语句(如全部大写,全部小写等)oracle解析语句后会放置到共享池中
如:select * from Emp where name=? 这个语句只会在共享池中有一条,而如果是字符串的话,那就根据不同名字存在不同的语句,所以占位符效率较好
3)数据库不仅仅是一个存储数据的地方,同样是一个编程的地方,一些耗时的操作,可以通过存储过程等在用户较少的情况下执行,从而错开系统使用的高峰时间,提高数据库性能
4)尽量不使用*号,如select * from Emp,因为要转化为具体的列名是要查数据字典,比较耗时
5)选择有效的表名
对于多表连接查询,可能oracle的优化器并不会优化到这个程度, oracle 中多表查询是根据FROM字句从右到左的数据进行的,那么最好右边的表(也就是基础表)选择数据较少的表,这样排序更快速,如果有link表(多对多中间表),那么将link表放最右边作为基础表,在默认情况下oracle会自动优化,但是如果配置了优化器的情况下,可能不会自动优化,所以平时最好能按照这个方式编写sql
6)Where字句 规则
Oracle 中Where字句时从右往左处理的,表之间的连接写在其他条件之前,能过滤掉非常多的数据的条件,放在where的末尾, 另外!=符号比较的列将不使用索引,列经过了计算(如变大写等)不会使用索引(需要建立起函数), is null、is not null等优化器不会使用索引
7)使用Exits Not Exits 替代 In Not in
8)合理使用事务,合理设置事务隔离性
数据库的数据操作比较消耗数据库资源的,尽量使用批量处理,以降低事务操作次数
24、Oracle分区是怎样优化数据库的?
Oracle的分区可以分为: 列表分区、范围分区、散列分区、复合分区。1)增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍可以使用;
2)减少关闭时间:如果系统故障只影响表的一部份分区,那么只有这部份分区需要修复,可能比整个大表修复花的时间更少;
3)维护轻松:如果需要得建表,独产管理每个公区比管理单个大表要轻松得多;
4)均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;
5)改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快
6)分区对用户透明,最终用户感觉不到分区的存在。
25、数据库怎样实现每隔30分钟备份一次?
通过操作系统的定时任务调用脚本导出数据库26、Oracle中where条件查询和排序的性能比较?
Order by使用索引的条件极为严格,只有满足如下情况才可以使用索引,1)order by中的列必须包含相同的索引并且索引顺序和排序顺序一致
2)不能有null值的列
所以排序的性能往往并不高,所以建议尽量避免order by
27、解释什么是死锁,如何解决Oracle中的死锁?
简言之就是存在加了锁而没有解锁,可能是使用锁没有提交或者回滚事务,如果是表级锁则不能操作表,客户端处于等在状态,如果是行级锁则不能操作锁定行解决办法:
1)查找出被锁的表
select b.owner,b.object_name,a.session_id,a.locked_mode
from v$locked_object a,dba_objects b
where b.object_id = a.object_id;
select b.username,b.sid,b.serial#,logon_time
from v$locked_object a,v$session b
where a.session_id = b.sid order by b.logon_time;
2)杀进程中的会话
alter system kill session "sid,serial#";
18. 简述oracle中 dml、ddl、dcl的使用
Dml 数据操纵语言,如select、update、delete,insert
Ddl 数据定义语言,如create table 、drop table 等等
Dcl 数据控制语言, 如 commit、 rollback、grant、 invoke等。
28、怎样创建一个一个索引,索引使用的原则,有什么优点和缺点
创建 标准索引:CREATE INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建 唯一索引:
CREATE unique INDEX 索引名 ON 表名 (列名) TABLESPACE 表空间名;
创建 组合索引:
CREATE INDEX 索引名 ON 表名 (列名1,列名2) TABLESPACE 表空间名;
创建 反向键索引:
CREATE INDEX 索引名 ON 表名 (列名) reverse TABLESPACE 表空间名;
索引使用原则:
索引字段建议建立NOT NULL约束
经常与其他表进行连接的表,在连接字段上应该建立索引;
经常出现在Where子句中的字段且过滤性很强的,特别是大表的字段,应该建立索引;
可选择性高的关键字 ,应该建立索引;
可选择性低的关键字,但数据的值分布差异很大时,选择性数据比较少时仍然可以利用索引提高效率
复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:
A、正确选择复合索引中的第一个字段,一般是选择性较好的且在where子句中常用的字段上;
B、复合索引的几个字段经常同时以AND方式出现在Where子句中可以建立复合索引;否则单字段索引;
C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;
D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;
E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;
频繁DML的表,不要建立太多的索引;
不要将那些频繁修改的列作为索引列;
索引的优缺点:
优点:
1. 创建唯一性索引,保证数据库表中每一行数据的唯一性
2. 大大加快数据的检索速度,这也是创建索引的最主要的原因
3. 加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
4. 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
缺点:
1. 索引创建在表上,不能创建在视图上
2. 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
3. 索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大
4. 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度
29、怎样创建一个视图,视图的好处, 视图可以控制权限吗?
create view 视图名 as select 列名 [别名] … from 表 [unio [all] select … ] ]好处:
1. 可以简单的将视图理解为sql查询语句,视图最大的好处是不占系统空间
2. 一些安全性很高的系统,不会公布系统的表结构,可能会使用视图将一些敏感信息过虑或者重命名后公布结构
3. 简化查询
可以控制权限的,在使用的时候需要将视图的使用权限grant给用户。