数据库开发面试题总结

linux登录数据库

su - oracle 
sqlplus /nolog
conn /as sysdba
lsnrctl status
lsnrctl shop
lsnrctl start
shutdown immediate
su - oracle 
sqlplus /nolog
conn /as sysdba
shutdown immediate

ora-03113 通信通道的文件结尾
途径空间小,一个方法是将空间设置大点,另一个方法是将多余的文件删除掉
将空间设置大:

sqlplus /nolog
sqlplus / as sysdba
conn /as sysdba 
shutdown abort--关闭进程
startup mount --装载数据库
select * from v$recovery_file_dest --查询归档日志
db_recovery_file_dest_size=10737418240--设置归档日志空间为10G
exit

删除归档日志

rmantarget / --进入rman工具窗口
crosscheckarchivelog all;--这个命令可以将所有无效的expired的archivelog标记出来
deletenoprompt archivelog until time "sysdate -3";--删除3天前的归档日志

ora -28000 数据库被锁

sqlplus / as sysdba 
desc dba_profiles;
select resource_name,limit from dba_profiles where resource_name='FAILED_LOGIN_ATTEMPTS';
alter user query account unlock;

数据库锁表

select * from v$version t1,v$locker_object t2 where t1.sid = t2.session_id;
alter system kill session '';

数据库过程被锁

select t.session_id from dba_ddl_locks t where name='PCX_YDCRM_JGQJ)DTZBPZYYB';
select sid,serial# from v$version where sid= 'session_id';
alter system kill session 'sid,serial#';

如何查看数据库有哪些用户

select * from dba_users;

删除用户:

drop user xxx;--该用户没有任何对象
drop user xxx cascade;--该用户有对象,删除所有对象和用户
select * from dba_users;
select * from dba_data_files;

创建用户:

create user xxx identified by 123321;

授权:

grant create session to crm_xc;
grant "connect" to crm_xc with admin option;
grant user crm_xc quota 5M on system;
grant create table to crm_xc with admin option;
grant delete any table to crm_xc with admin option;
grant insert any table to crm_xc with admin option;
grant select any table to crm_xc with admin option;
grant update any table to crm_xd witn admin option;
grant create any table to crm_xc;
grant read,write on directory dump_dir to crm_xc;

DQL 数据查询语言 select
DML 数据操作语言 insert update delete
DDL 数据定义语言 create drop alter truncate
DCL 数据控制语言 grant revoke
TPL 事务控制语言 commit rollback

一、 数据库
1、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*条数

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

13、你知道哪些非关系型数据库,与关系型数据库的区别是?
一、关系型数据库
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
1、易于维护:都是使用表结构,格式一致;
2、使用方便:SQL语言通用,可用于复杂查询;
3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
1、读写性能比较差,尤其是海量数据的高效率读写;
2、固定的表结构,灵活度稍欠;
3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
二、非关系型数据库
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
优点:
1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
3、高扩展性;
4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:
1、不提供sql支持,学习和使用成本较高;
2、无事务处理;
3、数据结构相对复杂,复杂查询方面稍欠。

非关系型数据库的分类和比较:
1、文档型
2、key-value型
3、列式数据库
4、图形数据库

14、SQL语句与SQLPLUS命令的区别
1)SQL是关系型数据库的标准操作语言,而SQL
PLUS是一个客户端工具,除了执行标准的SQL外,还可以执行工具本身的一些命令。
2)SQL语句不可以缩写,而SQL*PLUS命令可以缩写

15、oracle数据库中如何显示表的结构
新建命令窗口,输入desc 表名

16、oracle中数据库对象的命名规则
1)必须由字母开始,长度在1-30个字符之间
2)包含字母、数字、_、$、#
3)同一个Oracle服务器所拥有的对象名不能重复
4)名字不能为Oracle 的保留字
5)大小写不敏感

19、MySQL数据库与Oracle数据库有什么区别
1)应用方面:MySQL是中小型应用的数据库,一般用于个人项目或中小型网站及论坛。Oracle属于大型数据库,一般在具有相当规模的企业应用。
2)自动增长的数据类型方面:MySQL有自动增长的数据类型。Oracle没有自动增长的数据类型,需要建立一个自增序列
3)group by用法:MySQL中group by在select语句中可以随意使用,但是在Oracle中如果查询语句中有组函数,那其他列名必须是组函数处理过的或者是group by子句中的列,否则报错
4)引号方面:MySQL中可以用单引号、双引号包起字符串,Oracle中只可以用单引号包起字符串。

4、 对游标的理解?游标的分类?使用方法?
显示游标:自己打开关闭
隐式游标:自动打开关闭

5、 如何查找和删除表中的重复数据?给出方法或SQL。

delete ID1,email from email e1
 where rowid  < (select max(rowid) from email e2 where e1.email = e2.email AND e1.id1 = e2.id1);

 select ID1,email from email e1
 where rowid  > (select min(rowid) from email e2 where e1.email = e2.email AND e1.id1 = e2.id1);

6、 不借助第三方工具,怎么查看SQL的执行计划?

   Set autotrace on EXPLAIN PLAN FOR

8、 Oracle数据库中,有哪几种分区?各自特点是什么?作用是什么?分区索引的分类和作用?
范围分区:根据某个值的范围
Hash分区:散列分区,是数据均匀分布
复合分区:先范围分区再Hash分区

增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用;
维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可;
均衡I/O:能把不同的分区映射到磁盘以平衡I/O,改善整个系统性能;
改善查询性能:对分区对象的查询能仅搜索自己关心的分区,提高检索速度。

9、 表T(a,b,c,d),要根据字段c排序后取第21—30条记录显示,请给出sql。

select * from email where rownum <=30
minus
select * from email where rownum <=20
order by 2 //代表第二列

10、 备份如何分类?归档是什么含义?
逻辑备份:exp/imp
  物理备份:
  RMAN备份
  full backup/incremental backup(累积/差异)
  热备份:alter tablespace begin/end backup;
  冷备份:脱机备份(database shutdown)

关于归档日志:Oracle要将填满的在线日志文件组归档时,则要建立归档日志(archived redo log)。
  其对数据库备份和恢复有下列用处:
  数据库后备以及在线和归档日志文件,在操作系统和磁盘故障中可保证全部提交的事物可被恢复。
  在数据库打开和正常系统使用下,如果归档日志是永久保存,在线后备可以进行和使用。

数据库可运行在两种不同方式下:
  NOARCHIVELOG方式或ARCHIVELOG 方式数据库在NOARCHIVELOG方式下使用时,不能进行在线日志的归档,如果数据库在ARCHIVELOG方式下运行,可实施在线日志的归档。

问题 3: 简述数据库的设计过程。
答: 数据库设计分为以下五个阶段:
需求分析:主要是准确收集用户信息需求和处理需求,并对收集的结果进行整理和分析,形成需求说明。概念结构设计:对用户需求进行综合、归纳、抽象,形成一个与具体的 DBMS 无关概念模型(一般为 ER 模型)。
逻辑结构设计:将概念结构设计的概念模型转化为某个特定的 DBMS 所支持的数据模型,建立数据库逻辑模式,并对其进行优化,同时为各种用户和应用设计外模式。
物理结构设计:为设计好的逻辑模型选择物理结构,包括存储结构和存取方法等,建立数据库物理模式。
实施和维护:实施就是使用 DLL 语言建立数据库模式,将实际数据载入数据库,建立真正的数据库。
维护阶段是对运行中的数据库进行评价、调整和修改。

问题 4: 插入记录时可以不指定字段名称吗?
答: 不管使用哪种 INSERT 语法,都必须给出 VALUES 的正确数目。如果不提供字段名,则必须给每个字段提供一个值,否则将产生一条错误消息。如果要在 INSERT 操作中省略某些字段,这些字段需要满足一定条件:该列定义为允许空值;或者表定义时给出默认值,如果不给出值,将使用默认值。

问题 9: 如何设置网络数据包的大小?
答:一般情况下,设置网络数据包的大小可参考以下方法。如果应用程序常执行大容量复制操作或者是发送、接收大量的 text 和 image 数据的话,可以将此值设大一点。如果应用程序接收和发送的信息量都很小,那么可以将其设为 512 字节。

问题 10: 你对游标的理解,游标的分类?
答: 游标是结果集数据中的指针, 作用是为遍历结果集时, 存储每条记录的结果。游标分为显式游标和隐式游标。

问题 11: 触发器中能否用 COMMIT, 为什么?
答: 在触发器中不能使用 COMMIT 等事务控制语句。因为触发器是事务触发的如果有事务控制语句就会影响到触发它的事务。即连带触发它的语句之前的已经完成的没有提交的语句都要受到影响。这是会影响到数据的一致性的。

问题 23: 为什么要及时删除不用的触发器?
答:触发器定义之后,每次执行触发事件,都会激活触发器并执行触发器中的语句。如果需求发生变化,而触发器没有进行相应的改变或者删除,则触发器仍然会执行旧的语句,从而会影响新的数据的完整性。因此,要将不再使用的触发器及时删除。

5、触发器的作用?
触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

问题 12: 归档模式与非归档模式?为什么归档模式可以恢复到任意时刻?
答: 归档是在重做日志文件被覆盖之前,将该重做日志文件通过复制操作系统文件的方式,保存到指定的位置。保存下来的重做日志文件的集合被称为归档重做日志文件,复制的过程被称为归档。在归档日志(ARCHIVELOG)模式下, 数据库对重做日志文件进行归档操作。非归档日志(NOARCHIVELOG)模式下,不会对重做日志文件进行归档加粗样式操作。由于非归档模式不会在覆盖之前保存,这样就造成了数据库在一定时间之前的重做日志文件丢失,也就不能恢复到被覆盖之前。而归档模式在任意时间上都有重做日志文件,故可以恢复到任意时刻。

问题 13: 如何提高日志的切换频率?
答: 通过参数 ARCHIVE_LAG_TARGET 可以控制日志切换的时间间隔,以秒为单位。通过减少时间间隔,从而实现提高日志的切换频率。例如以下代码:
SQL> ALTER SYSTEM SET ARCHIVE_LAG_TARGET=50 SCOPE=both;
通过上面的命令,可以实现日志每 50 秒切换一次。

问题 20: 是不是索引建立得越多越好?
答: 合理的索引可以提高查询的速度,但不是索引越多越好。在执行插入语句的时候, 数据库要为新插入的记录建立索引。所以过多的索引会导致插入操作变慢。原则上是只有查询用的字段才建立索引。

问题 7: 谈谈你对索引的理解?
答: 索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的记录所在的数据块,从而大大减少读取数据块的 I/O 次数,因此可以显著提高性能。
问题 5: 本地索引与全局索引的差别与适用情况。
答: 对于本地索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由数据库自动进行。对于全局索引,可以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维护操作时,通常会导致全局索引的 INVALDED,必须在执行完操作后 REBUILD。

6、怎样创建一个索引,索引使用的原则,有什么优缺点
create index 索引名 on 表名(列名)
原则:
建议索引列建立not null约束
经常与其他表进行连接的表,在连接列上建立索引
优缺点:
创建索引能大大加快检索速度,加强表与表的连接,但是创建索引很占用空间

11、 如果系统现在需要在一个很大的表上创建一个索引,需要考虑那些因素,如何做到尽量减小对应用的影响?
nologging方式create,否则产生大量的redo。

create index intex_name on table (id) nologging;
select index_name,logging,status from user_indexs where table_name='table';

根据当前的数据库及系统压力情况,进行适当并行创建。
加大sort_area_size

问题 24: 什么是唯一索引?
答:唯一索引可以确保索引列不包含重复的值。在多列唯一索引的情况下,该索引可以确保索引列中每个值组合都是唯一的。例如,如果在 last_name、 first_name 和 middle_initial 列的组合上创建了唯一索引full_name,则该表中任何两个人都不可以具有相同的全名。
聚集索引和非聚集索引都可以是唯一的。因此,只要列中的数据是唯一的,就可以在同一个表上创建一个唯一的聚集索引和多个唯一的非聚集索引。
只有当唯一性是数据本身的特征时,指定唯一索引才有意义。如果必须实施唯一性以确保数据的完整性,则应在列上创建 UNIQUE 或 PRIMARY KEY 约束,而不要创建唯一索引。

1.索引有哪些类型?
就不同的算法结构来说,索引有B+树、有序数组、哈希等;
就DDL来说,可为字段创建普通索引、唯一索引、主键索引、全文索引,并可指定索引的算法结构。

2.什么是聚簇索引?
mysql的innodb引擎对应的主键索引类型属于聚簇索引、myisam引擎对应的是非聚簇索引,聚簇索引和非聚簇索引都是采用B+树的算法结构,区别在于叶子节点保存的是数据本身还是数据的实际位置。

12、 索引对模糊查询能起到优化查询的作用吗?为什么?
模糊查询百分号加在前面会使索引失效,但加在后面不影响。要想解决这个问题,使用覆盖索引能解决。
避免使用*的原因是回表查询,节约执行时间,提高使用效率。

7、索引的作用?和它的优点缺点是什么?

数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。

在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。

为表设置索引要付出代价的:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。

创建索引可以大大提高系统的性能(优点):
第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?
增加索引也有许多不利的方面:

第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。
第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。

索引是建立在数据库表中的某些列的上面。在创建索引的时候,应该考虑在哪些列上可以创建索引,在哪些列上不能创建索引。

一般来说,应该在这些列上创建索引:
(1)在经常需要搜索的列上,可以加快搜索的速度;
(2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构;
(3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度;
(4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的;
(5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
(6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

同样,对于有些列不应该创建索引:
第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。

13、 数据库的性能优化有哪些方法?
建立索引
数据库优化第一步就是建立合理的索引,这也是最初级的优化,也是DBA常用的优化方案!MySql索引类型有:普通索引,主键索引,唯一索引,组合索引!
优化SQL语句
从业务角度,优化SQL语句;
优化表结构
能用小字段类型,就尽量用小字段类型;如能用short,就不要用int;能用数字类型,就不要用字符串类型,举个例子,一般的订单号都是数字,很少有字母的。
拆分表
表的拆分一般分为横向拆分和纵向拆分,横向拆分不改变表结构,重复多建立几张表。这种优化方式类似于上文提到的SQL语句优化的例子;另一种是纵向拆分,两个表通过字段相关联。

11、如何实现数据库的优化
1)调整数据库结构的设计:需要考虑是否使用分区功能、是否建立索引等
2)调整数据库的SQL语句
3)调整服务器的内存分配
4)调整硬盘I/O
5)调整操作系统参数

常见的数据库优化方法:索引(数据库),缓存,分表,分库,sql优化。
索引:创建索引一般有以下两个目的:维护被索引列的唯一性和提供快速访问表中数据的策略。95% 的数据库能 问题都可以采用索引技术得到解决。索引有助于提高检索性能,但过多或不当的索引也会导致系统低 效。因为用户在表中每加进一个索引,数据库就要做更多的工作。过多的索引甚至会导致索引碎片。
缓存:hibernate,spring3有缓存模块
分表:针对每个时间周期产生大量的数据,可以考虑采用一定的策略将数据存到多个数据表中。
分库:就是将系统按照模块相关的特征分布到不同的数据中,以提高系统整体负载能力。
sql优化:

1、 索引的类型有哪些,使用场景
逻辑上:
Single column 单行索引
Concatenated 多行索引
Unique 唯一索引
NonUnique 非唯一索引
Function-based函数索引
Domain 域索引
物理上:
Partitioned 分区索引
NonPartitioned 非分区索引
B-tree:
Normal 正常型B树
Rever Key 反转型B树
Bitmap 位图索引

1)b-tree索引
Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。每当你发布基本的没有经过进 一步修改的CREATE INDEX语句时,就是在创建b-tree索引。这里不打算对b-tree索引进行更多深入的探讨,这些用户都可以自己了解。基本上这些索引存储你创建的 索引所在的列值以及用来查找自身行的指向实际数据表的指针。记住,这也就意味着要进行多路查询,其中一个查询各个节点和索引的叶节点,然后才是表的行自 身。这就是为什么Oracle的优化器在某种情况下会选择执行全表扫描而不执行索引查找的原因了,因为全表扫描执行起来实际上可能会更快一些。还要注意的 是,如果你的索引是创建在多个列上的话,那么第一列(leading column)非常重要。假设你有一个多列索引(也称为级联索引),索引列的排列顺序是c列到d列,你可以对使用该索引c列单独进行一次查询,但你不能使 用该索引对d列冶金行一次单独的查询。

2)基于函数的索引
如果在搜索时你读取很多行,或者你的索引选择性不大,又或者你在级联索引中使用了第一列以外的列,Oracle数据库有时候会选择不使用索 引。那么如果你想要执行一个大小写不敏感的搜索呢?像下面的指令:WHERE UPPER(first_name) = ‘JOHN’。

这也不会使用first_name字段上的索引。为什么?因为Oracle不得不将UPPER函数用在该索引所有(ALL)的值上,所以还不如做一次全表扫描。所以,很多时候Oracle创建基于函数的索引就是为了这个目的。
3)反转关键字索引
你还可以看到这些反转关键字索引,而且不时还要用到这些索引。假设有一列包含了“餐厅甲”、“餐厅乙”、“餐厅丙”等类似名字。可能这不是 一个很好的例子,不过关键的一点是拥有很多唯一值,但其关键字的前面一部分变化不大。因为Oracle会在将REVERSE关键字指定给b-tree前把 REVERSE字符串简化,所以使用反转关键字索引可能是最好的。这样的一个索引可能更平衡、有用,搜索起来更快。

Oracle还提供了很多更为复杂的索引类型。不过请注意,你最好全面阅读过相关的说明文档后再使用这些索引,因为它们各自都有各自特定的适用范围。
1)位图索引(bitmap index)
假设数据库表中有一列其选择性非常窄,例如性别列,该用什么类型的索引?你可能会考虑对其使用位图索引。因为位图索引正是为相异值很少的列 而创建的。但需要考虑的因素还不只这些。一般而言,只有当你对表中值相宜度较小的多个不同的列都使用位图索引,这样位图索引才有用,因为你可以一起使用这 些索引才能对列产生更大的选择性,否则你还是需要对这些列进行一次全表扫描。例如,对于性别列,其索引只能有两个唯一值,那么用这个索引对表的任何搜索有 可能都返回一半的记录。其次,这些索引是为数据仓库而设计的,所以其假定条件是数据不会发生很大的改变。这些索引不能用来满足事务数据库或更新频繁的数据 库。应该说,对位图索引的表进行更新根本没有一点效率。
2)位图连接索引(bitmap join index)
位图连接索引比位图索引更进了一步。这些索引将位图化的列完全从表数据中抽取出来,并将其存储在索引中。其假定条件是这些列集合必须一起查 询。同样的,这也是为数据仓库数据库而设计的。除了在句法最后有一个WHERE子句之外,位图连接索引的创建指令就像创建位图索引的CREATE BITMAP INDEX一样。
3)压缩索引
压缩索引实际是标准b-tree索引的一个选项。压缩索引的叶节点更少,所以总的I/O数量和需要的缓存也更少。这些都意味着Oracle 的优化器更可能使用这些压缩索引,而不倾向于使用标准的非压缩索引。不过,这些好处也是有代价的,当你对这些压缩索引进行存取操作时,要消耗更多的CPU 来进行解压缩。而且,当你阅读关于优化器如何使用这些索引,又是如何选择合适的压缩级别的资料时,就开始变得晦涩了。不同的用户不同的设置从压缩索引中得 到的好处也可能会有所不同。
4)降序索引(descending index)
这是基于函数索引的一种特殊类型。降序索引可以显著优化ORDER BY x, y, z DESC子句查询的。
5)分区索引(partitioned index)
如果你的数据库中有一个分区表,你就有机会体验几种新的索引类型,从贯穿所有分区的全局分区索引(global)和集中于各个单独分区的本地分区索引(local)。这里不再进行赘述,想知道细节问题可以查询相关文献。
6)索引组织表(index organized table,IOT)
这是在Oracle 9i中引进的一种新类型表。Oracle会将级联索引及其扩展类型的索引用于表中所有的列。当所有数据都载入到索引结构之后,表就成多余的了,你尽可以将表本身删除掉。这就是索引组织表。
7)簇索引(cluster index)
基本上,簇索引就是将多个表的相同列放在一起,而对该列使用用一个簇索引。这种索引在实际应用中比较少,因为还有各种有待解决的性能问题存在。
8)域索引(domain index)
当我们创建为用户自定义数据类型(datatype)创建用户自定义索引类型(indextype)时就要使用域索引。
9)隐藏索引(invisible index)
这是Oracle 11g中推出的新特性。其创建过程和标准索引一样,但创建后对于基于代价的优化器(CBO)是不可见的。这可以让你对性能进行大型测试查询,而不会影响现有的正在运行的应用程序。
10)虚拟索引(virtual index)
这是为测试人员和开发人员准备的又一个工具。虚拟索引(不分配段空间)可以让你在不需要实际创建索引的情况下,测试新索引及其对查询计划的影响。对于GB级的表来说,构建索引非常耗费资源而且还要占用大量时间。
11)其他的索引类型
Oracle数据库还提供了很多其他类型的索引,例如用来为字符型大型二进制对象(CLOB)或其他大型文本数据构建索引的Oracle TEXT,Oracle Spatial等。有兴趣的读者可以自己查找相关资料了解。
都是为了优化器
如果你曾经广泛接触过MySQL和其他的数据库,你会发现甲骨文虽然是全球领先的数据库供应商,但它们的数据库对于用户来说用起来其实并不 是很方便。提到优化器这个问题可能有点离题了,不过Oracle数据库最基本的食料就是优化器了,这的确是种挺特别的调料,而且变得越来越美味了。市面上 有很多以Oracle基于代价的优化器(Cost Based Optimizer,CBO)为主题内容的书籍,专门介绍分析表和索引的技巧和策略。
对于数据库,除了需要一直更新你的统计信息之外,你可能还需要不断测试新的查询。使用解析计划机制,并进行优化以便减少总I/O量以及排序和合并数据的计算量,只有这样你才能获得更好的性能表现。
总结
虽然Oracle数据库的索引世界有点吓人,不过实际上你平常经常使用的索引就只有那么一些。而且,不管唱反调的人怎样诋毁,Oracle 的优化器都已经设计相当出色;总体而言,Oracle很擅长于让你的数据库运行地更有效率。虽然这并不意味着你不需要对自己的SQL进行调优,不过,如果 你一直保持着最新的统计信息,并让Oracle为你整理出你所需要的最小数据集的话,它能够以极快的速度满足你的需要。

原文链接:https://blog.csdn.net/S630730701/article/details/51779378

问题 21: STR 函数在遇到小数时如何处理?
答: 在使用 STR 函数时,如果数字为小数,则在转换为字符串数据类型时,只返回其整数部分,如果小数点后的数字大于等于 5,则四舍五入返回其整数部分。

问题 22: 自定义函数支持输出参数吗?
答: 自定义函数可以接受零个或多个输入参数,其返回值可以是一个数值,也可以是一个表,但是自定义函数不支持输出参数。

问题 18: 存储过程和自定义函数的区别?
答: 存储过程,功能强大,可以执行包括修改表等一系列数据库操作,也可以创建为 SQL Server 启动
时自动运行的存储过程。而自定义函数,用户定义函数不能用于执行一组修改全局数据库状态的操作。存储过程,可以使用非确定函数。自定义函数,不允许在用户定义函数主体中内置非确定函数。存储过程,可返回记录集。 自定义函数,可以返回表变量, 也可以有任意个输出参数。存储过程,其返回值不能被直接引用,必须单独调用。 自定义函数,其返回值可以被直接引用,也就是可以直接 select * from 函数。

问题 25: 为什么 UNION ALL 比 UNION 快?
答:因为在使用 UNION 的时候,需要删除重复的记录,但是使用 UNION ALL 的时候不用删除。所以如果在知道需要 UNION 的查询不可能出现重复数据的时候,一定要使用 UNION ALL。

问题 1: 为什么 group by 和 order by 会使查询变慢?
答: group by 和 order by 操作通常需要创建一个临时表来处理查询的结果,所以如果查询结果很多的话会严重影响性能。

4.innodb引擎的优缺点?
优点:支持事务,适合大数据量、高并发的业务
缺点:查询数据总量需要逐行扫描,当表里的数据量大时,这个操作会很耗费资源和时间。
(myisam引擎统计全表数据总量会很快,因为总数会自动记录,可以直接获取。但是统计有条件筛选的范围总数则与innodb引擎相似)

5.视图
什么是视图
视图是虚表,只是对查询语句的封装,查询结果随基表的变动而变动,修改视图实际上还是修改基表。

为什么要使用视图
有的时候,我们可能只关系一张数据表中的某些字段,而另外的一些人只关系同一张数据表的某些字段…
那么把全部的字段都都显示给他们看,这是不合理的。
我们应该做到:他们想看到什么样的数据,我们就给他们什么样的数据…一方面就能够让他们只关注自己的数据,另一方面,我们也保证数据表一些保密的数据不会泄露出来…
(视图并不能提高查询效率)

1、 Oracle数据库,视图与表的区别?普通视图与物化视图的区别?物化视图的作用?materialized view
答:a:视图是虚拟表,提高了表的安全性,视图没有实际物理空间,而表有实际存储的物理空间
b:物化视图存储了实实在在的数据,而普通视图之存储了定义
c:物化视图的优点像索引一样,提高查询性能。当基表发生变化时,物化视图也应当刷新。

物化视图是数据库中的一种存储数据的对象,和表一样,存储了数据。用于预先计算并保存表连接或者聚集等耗时较多的操作。这样,在执行查询的时候,就可以避开连接、聚集等耗时的操作,从而快速的得到结果。它可以查询表,视图甚至是其他物化视图中的数据。和视图不同的是,它存储了实实在在的数据,而视图只是存储了定义而已,所以,也是可以在物化视图上创建索引的。物化视图在很多方面,和索引很相似:使用它的主要目的是为了提高查询性能;物化视图对应用是透明的,增加或者删除物化视图不会影响应用程序中查询语句的正确性和有效性;物化视图会占用存储空间;当基表发生变化时,物化视图也应当刷新。通常情况下,物化视图被称为主表(在复制期间)或者明细表(在数据仓库中。

问题 19: 视图的作用是什么?
答: 数据库视图的作用主要有:
1 . 数据库视图隐藏了数据的复杂性。
2. 数据库视图有利于控制用户对表中某些列的访问。
3. 数据库视图使用户查询变得简单。
视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。
但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。分布式查询也可用于定义使用多个异类源数据的视图。如果有几台不同的服务器分别存储组织中不同地区的数据,而您需要将这些服务器上相似结构的数据组合起来,这种方式就很有用。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。

4、什么是视图?
视图,是一个虚拟的表,不会给视图分配存储空间。视图的建立需要依赖于单个或多个普通表,被依赖的普通表就成为"基表"。可以就像 用 select 语句类似,在某些表中选取字段和筛选条件,可以查询出数据,把这数据构成一张虚拟的表,这就叫视图。

视图隐藏了数据的复杂性,还可以方便用户的查询,另外,还可以隔离物理表结构改变。视图通常是用来查询的,也可以对视图进行增删改。但是在视图上进行增删改要满足一些前提: 单表视图可以进行增删改操作;在多表视图中,只能对 键保留表进行删改操作;或者 定义触发器,替换掉增删改语句。对视图进行新增、删除、修改视图的数据是会把关联的基表数据给改变的。

CREATE[OR REPLACE] VIEW  [viewName]
AS
 select s.sno,s.sname,s.deptno 
        from STUDENT s
[WITH CHECK OPTION]
[WITH Read ONLY];

视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,试图通常是有一个表或者多个表的行或列的子集。对视图的修改不影响基本表。它使得我们获取数据更容易,相比多表查询。
如下两种场景一般会使用到视图:
(1)不希望访问者获取整个表的信息,只暴露部分字段给访问者,所以就建一个虚表,就是视图。
(2)查询的数据来源于不同的表,而查询者希望以统一的方式查询,这样也可以建立一个视图,把多个表查询结果联合起来,查询者只需要直接从视图中获取数据,不必考虑数据来源于不同表所带来的差异。
注:这个视图是在数据库中创建的 而不是用代码创建的。

6、 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么?
尽可能使用约束,如 check, 主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。

8.工作中你有什么印象比较深的优化经历?
根据业务对联合索引进行巧妙调整。
慢查询中有个业务查询类似于
select uid from t where name like ‘林%’ and age =20
原索引是(name,age),通过执行计划分析,发现该索引的效率之所以不够高是因为回表次数太多,也就意味着索引树上满足条件的数据太多。一般来说,条件筛选到这么小范围是不应该出现这个情况的,索引的区分度并没有这么差。事实上,是因为对name字段使用了模糊匹配,导致的联合索引失效。数据库从该索引树上找到所有姓林的员工,然后直接回到主索引树上再对age字段进行判别。而我们需要的是在索引树上就对这两个字段做判断,这样就可以筛除掉大部分不满足条件的数据。于是在确定修改索引不会造成其他业务出问题后,我就对索引进行了调整,改成(age,name)联合索引,结合mysql的ICP功能,完美解决本次慢查询问题。

9.你觉得rc和rr哪个隔离级别的性能更好?
RC级别没有gap锁,更新数据时只会锁住对应索引上和主树上的记录,不会给范围加锁,从并发上来说,比RR性能要好。不过同一个事务内多次查询相同范围的数据,看到的结果可能不一样。
第一句话 rc没有gap 一般书上都是这么说的 其实在碰到唯一索引的时候 某些场景还是会有gap的, 问题本身,一般来说基本上rc性能好,因为可以近似认为没有gap,都是记录锁,但是有一种极端情况,一个事务里都是读,读都是快照嘛 一般不涉及锁 这时候rr只会在事务开启的时候创建一个read view,rc是每个读都会创建,这种情况下rr性能更好

1、超键、候选键、主键、外键
超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以为作为一个超键,多个属性组合在一起也可以作为一个超键。超键包含候选键和主键。

候选键:是最小超键,即没有冗余元素的超键。

主键:数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。

外键:在一个表中存在的另一个表的主键称此表的外键。

2、什么是事务?什么是锁?
事务:就是被绑定在一起作为一个逻辑工作单元的 SQL 语句分组,如果任何一个语句操作失败那么整个操作就被失败,以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有组语句作为事务考虑,就需要通过 ACID 测试,即原子性,一致性,隔离性和持久性。

锁:在所以的 DBMS 中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。

问题 6: 事务和锁有什么关系?
答: 可以使用多种机制来确保数据的完整性,例如约束、触发器以及本章介绍的事务和锁等。事务和锁的关系非常紧密。事务包含一系列的操作,这些操作要么全部成功,要么全部失败,通过事务机制管理多个事务,保证事务的一致性,事务中使用锁保护指定的资源,防止其他用户修改另外一个还没有完成的事务中的数据。

问题 8: 谈谈你对事务的理解?
答: 事务从 COMMIT、 ROLLBACK、连接到数据库或开始第一条可执行的 SQL 语句时开始,到一条COMMIT、 ROLLBACK 语句或退出数据库时结束。如果在一个事务中包含 DDL 语句,则在 DDL 语句的前后都会隐含地执行 COMMIT 语句,从而开始或结束一个事务。如果一个事务由于某些故障或者由于用户改变主意而必须在提交前取消它,则数据库被恢复到这些语句和过程执行之前的状态。利用 ROLLBACK语句可以在 COMMIT 命令前随时撤消或回退一个事务。可以回退整个事务,也可以会退部分事务,但是不能回退一个已经被提交的事务。回退部分事务的 ROLLBACK 命令为: ROLLBACK to savepoint 存储点名,存储点是用户放入事务中的标记,用来表示一个可被回退的位置。存储点通过在事务中放入一个SAVEPOINT 命令而被插入。该命令的语法是: SAVEPOINT 存储点名,如果在 ROLLBACK 语句中没有给出存储点名,则整个事务被回退。

3、数据库事务的四个特性及含义
原子性:整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

隔离性:隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行 相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。

持久性:在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

3.事务是如何保证数据的准确性的?
通过ACID特性来保证的,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:最小执行单位,要么所有操作都成功,要么都失败
一致性:就是业务逻辑的前后一致,比如微信群里发红包,最后群里用户的账户总额都是与初始一致的。
隔离性:根据业务需要和并发程度来选择隔离级别,有四种隔离级别可选,分别是读未提交,读提交,可重复读,窜行化。
持久化:对数据的操作会被持久化到磁盘,不能再回滚。

17、数据库的三大范式是什么?
1)第一范式:原子件,要求每一列的值不能再拆分了
2)第二范式:一张表只描述一个实体(若列中有冗余数据,则不满足)
3)第三范式:所有列与主键直接相关

18、事务的特性(ACID)是指什么?
1)原子性(Atomic):事务中的各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败
2)一致性(Consistent):事务结束后系统状态是一样的
3)隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态
4)持久性(Durable):事务完成后,即使发生灾难性的故障,通过日志和同步备份可以在故障发生后重建数据

7.数据库的乐观锁和悲观锁是什么?
数据库的乐观锁和悲观锁是什么?

确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性,乐观锁和悲观锁是并发控制主要采用的技术手段。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作

在查询完数据的时候就把事务锁起来,直到提交事务
实现方式:使用数据库中的锁机制

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

在修改数据的时候把事务锁起来,通过version的方式来进行锁定
实现方式:使用version版本或者时间戳

2、 乐观锁、悲观锁
Oracle数据库悲观锁与乐观锁是本文我们主要要介绍的内容。有时候为了得到最大的性能,一般数据库都有并发机制,不过带来的问题就是数据访问的冲突。为了解决这个问题,大多数数据库用的方法就是数据的锁定。

数据的锁定分为两种方法,第一种叫做悲观锁,第二种叫做乐观锁。什么叫悲观锁呢,悲观锁顾名思义,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。而乐观锁就是认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息,让用户决定如何去做。

先从悲观锁开始说。在SqlServer等其余很多数据库中,数据的锁定通常采用页级锁的方式,也就是说对一张表内的数据是一种串行化的更新插入机制,在任何时间同一张表只会插1条数据,别的想插入的数据要等到这一条数据插完以后才能依次插入。带来的后果就是性能的降低,在多用户并发访问的时候,当对一张表进行频繁操作时,会发现响应效率很低,数据库经常处于一种假死状态。而Oracle用的是行级锁,只是对想锁定的数据才进行锁定,其余的数据不相干,所以在对Oracle表中并发插数据的时候,基本上不会有任何影响。

注:对于悲观锁是针对并发的可能性比较大,而一般在我们的应用中用乐观锁足以。

Oracle的悲观锁需要利用一条现有的连接,分成两种方式,从SQL语句的区别来看,就是一种是for update,一种是for update nowait的形式。比如我们看一个例子。首先建立测试用的数据库表。

CREATE TABLE TEST(ID,NAME,LOCATION,VALUE,CONSTRAINT test_pk PRIMARY KEY(ID))AS SELECT deptno, dname, loc, 1 FROM scott.dept

这里我们利用了Oracle的Sample的scott用户的表,把数据copy到我们的test表中。首先我们看一下for update锁定方式。首先我们执行如下的select for update语句。

select * from test where id = 10 for update

通过这条检索语句锁定以后,再开另外一个sqlplus窗口进行操作,再把上面这条sql语句执行一便,你会发现sqlplus好像死在那里了,好像检索不到数据的样子,但是也不返回任何结果,就属于卡在那里的感觉。这个时候是什么原因呢,就是一开始的第一个Session中的select for update语句把数据锁定住了。由于这里锁定的机制是wait的状态(只要不表示nowait那就是wait),所以第二个Session(也就是卡住的那个sqlplus)中当前这个检索就处于等待状态。当第一个session最后commit或者rollback之后,第二个session中的检索结果就是自动跳出来,并且也把数据锁定住。不过如果你第二个session中你的检索语句如下所示。

select * from test where id = 10

也就是没有for update这种锁定数据的语句的话,就不会造成阻塞了。另外一种情况,就是当数据库数据被锁定的时候,也就是执行刚才for update那条sql以后,我们在另外一个session中执行for update nowait后又是什么样呢。比如如下的sql语句。 由于这条语句中是制定采用nowait方式来进行检索,所以当发现数据被别的session锁定中的时候,就会迅速返回ORA-00054错误,内容是资源正忙, 但指定以 NOWAIT 方式获取资源。所以在程序中我们可以采用nowait方式迅速判断当前数据是否被锁定中,如果锁定中的话,就要采取相应的业务措施进行处理。

select * from test where id = 10 for update nowait

那这里另外一个问题,就是当我们锁定住数据的时候,我们对数据进行更新和删除的话会是什么样呢。比如同样,我们让第一个Session锁定住id=10的那条数据,我们在第二个session中执行如下语句。

update test set value=2 where id = 10

这个时候我们发现update语句就好像select for update语句一样也停住卡在这里,当你第一个session放开锁定以后update才能正常运行。当你update运行后,数据又被你update语句锁定住了,这个时候只要你update后还没有commit,别的session照样不能对数据进行锁定更新等等。

总之,Oracle中的悲观锁就是利用Oracle的Connection对数据进行锁定。在Oracle中,用这种行级锁带来的性能损失是很小的,只是要注意程序逻辑,不要给你一不小心搞成死锁了就好。而且由于数据的及时锁定,在数据提交时候就不呼出现冲突,可以省去很多恼人的数据冲突处理。缺点就是你必须要始终有一条数据库连接,就是说在整个锁定到最后放开锁的过程中,你的数据库联接要始终保持住。与悲观锁相对的,我们有了乐观锁。乐观锁一开始也说了,就是一开始假设不会造成数据冲突,在最后提交的时候再进行数据冲突检测。

在乐观锁中,我们有3种常用的做法来实现:

[1]第一种就是在数据取得的时候把整个数据都copy到应用中,在进行提交的时候比对当前数据库中的数据和开始的时候更新前取得的数据。当发现两个数据一模一样以后,就表示没有冲突可以提交,否则则是并发冲突,需要去用业务逻辑进行解决。

[2]第二种乐观锁的做法就是采用版本戳,这个在Hibernate中得到了使用。采用版本戳的话,首先需要在你有乐观锁的数据库table上建立一个新的column,比如为number型,当你数据每更新一次的时候,版本数就会往上增加1。比如同样有2个session同样对某条数据进行操作。两者都取到当前的数据的版本号为1,当第一个session进行数据更新后,在提交的时候查看到当前数据的版本还为1,和自己一开始取到的版本相同。就正式提交,然后把版本号增加1,这个时候当前数据的版本为2。

当第二个session也更新了数据提交的时候,发现数据库中版本为2,和一开始这个session取到的版本号不一致,就知道别人更新过此条数据,这个时候再进行业务处理,比如整个Transaction都Rollback等等操作。在用版本戳的时候,可以在应用程序侧使用版本戳的验证,也可以在数据库侧采用Trigger(触发器)来进行验证。不过数据库的Trigger的性能开销还是比较的大,所以能在应用侧进行验证的话还是推荐不用Trigger。

[3]第三种做法和第二种做法有点类似,就是也新增一个Table的Column,不过这次这个column是采用timestamp型,存储数据最后更新的时间。在Oracle9i以后可以采用新的数据类型,也就是timestamp with time zone类型来做时间戳。这种Timestamp的数据精度在Oracle的时间类型中是最高的,精确到微秒(还没与到纳秒的级别),一般来说,加上数据库处理时间和人的思考动作时间,微秒级别是非常非常够了,其实只要精确到毫秒甚至秒都应该没有什么问题。和刚才的版本戳类似,也是在更新提交的时候检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一致则OK,否则就是版本冲突。如果不想把代码写在程序中或者由于别的原因无法把代码写在现有的程序中,也可以把这个时间戳乐观锁逻辑写在Trigger或者存储过程中。

原文链接:https://blog.csdn.net/yemou_blog/article/details/50292433

8、drop,delete与truncate的区别
drop直接删掉表 。
truncate删除表中数据,再插入时自增长id又从1开始 。
delete删除表中数据,可以加where字句。

(1) DELETE语句执行删除的过程是每次从表中删除一行,并且同时将该行的删除操作作为事务记录在日志中保存以便进行进行回滚操作。TRUNCATE TABLE 则一次性地从表中删除所有的数据并不把单独的删除操作记录记入日志保存,删除行是不能恢复的。并且在删除的过程中不会激活与表有关的删除触发器。执行速度快。
(2) 表和索引所占空间。当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
(3) 一般而言,drop > truncate > delete
(4) 应用范围。TRUNCATE 只能对TABLE;DELETE可以是table和view
(5) TRUNCATE 和DELETE只删除数据,而DROP则删除整个表(结构和数据)。
(6) truncate与不带where的delete :只删除数据,而不删除表的结构(定义)drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger)索引(index);依赖于该表的存储过程/函数将被保留,但其状态会变为:invalid。
(7) delete语句为DML(data maintain Language),这个操作会被放到 rollback segment中,事务提交后才生效。如果有相应的 tigger,执行的时候将被触发。
(8) truncate、drop是DLL(data define language),操作立即生效,原数据不放到 rollback segment中,不能回滚。
(9) 在没有备份情况下,谨慎使用 drop 与 truncate。要删除部分数据行采用delete且注意结合where来约束影响范围。回滚段要足够大。要删除表用drop;若想保留表而将表中数据删除,如果于事务无关,用truncate即可实现。如果和事务有关,或老师想触发trigger,还是用delete。
(10) Truncate table 表名 速度快,而且效率高,因为:
(11) TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 DROP TABLE 语句。
(12) 对于由 FOREIGN KEY 约束引用的表,不能使用 TRUNCATE TABLE,而应使用不带 WHERE 子句的 DELETE 语句。由于 TRUNCATE TABLE 不记录在日志中,所以它不能激活触发器。
6.drop、delete与truncate分别在什么场景之下使用?
drop table
1)属于DDL 2)不可回滚 3)不可带where 4)表内容和结构删除 5)删除速度快

truncate table
1)属于DDL 2)不可回滚 3)不可带where 4)表内容删除 5)删除速度快

delete from
1)属于DML 2)可回滚 3)可带where 4)表结构在,表内容要看where执行的情况
5)删除速度慢,需要逐行删除
不再需要一张表的时候,用drop
想删除部分数据行时候,用delete,并且带上where子句
保留表而删除所有数据的时候用truncate

问题 2: delete、 truncate 和 drop 的区别?
答: Delete 命令用来删除表的全部或者一部分数据行,执行 delete 之后,用户需要提交(commmit)或者回滚(rollback) transaction 来执行删除或者撤销删除, delete 命令会触发这个表上所有的 delete 触发器。Truncate 删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器, truncate 比 delete更快,占用的空间更小。Drop 命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的 DML 触发器也不会被触发,这个命令也不能回滚。

二、 ETL工具
1、 Informatica中,Update组件叫什么?更新机制?
2、 Informatica中,LookUp组件有哪几类?区别是什么?
3、 Informatica中,如何调用存储过程?
4、 Informatica中,工作流控制有哪些组件?
5、 Informatica优化方案?
6、 DataStage的JOB有哪些类型?特点分别是什么?
7、 DataStage中,如何设置parallel job并行运行?
8、 DataStage中,Join Stage 与 Lookup Stage组件在使用上有何区别?
9、 DataStage的优化方案?

三、 模型设计
1、 有哪几种模型设计方法?特点分别是什么?
2、 模型设计的步骤?
3、 维度模型的设计方法?
4、 模型设计的思路?业务需求驱动?数据驱动?
3、模型设计经验说明。在概念模型设计、逻辑模型设计以及物理模型设计几个阶段主要的工作是什么?

四、 Cognos开发
1、 Cube刷新方案?

2、 报表数据权限控制方案?
3、 Cube增量刷新方案?

五、 Shell开发
1、 在Unix/Linux中,查看磁盘空间可以用哪些命令?
df -hl

2、 在Unix/Linux中,压缩和解压缩文件可以用哪些命令?
tar zxvf 解压
tar czvf 压缩

3、 sed命令的作用?
对文本进行操作,一次处理一行

4、 在Unix/Linux中,添加用户用什么命令?
add user

5、 在Unix/Linux中,查看文件行数什么命令?
wc -lcw file1
l:行数
w:字数
c:字节数

六、 数据仓库设计
1、 增量数据获取方案?
2、 请解释以下概念:数据集市、事实表、维度表、OLAP
3、 元数据管理在数据仓库中的运用有何心得?
4、 数据仓库系统的数据质量如何保证?方案?
5、 数据仓库系统组件接口设计方案?

你可能感兴趣的:(1,数据库)