数据库工程师常见面试题
数据库工程师常见面试题
问题 1:为什么 group by 和 order by 会使查询变慢?
答:group by 和 order by 操作通常需要创建一个临时表来处理查询的结果,所以如果查询结果很多的
话会严重影响性能。
问题 2:delete、truncate 和 drop 的区别?
答:Delete 命令用来删除表的全部或者一部分数据行,执行 delete 之后,用户需要提交(commmit)或
者 回滚(rollback) transaction 来执行删除或者撤销删除,delete 命令会触发这个表上所有的 delete 触发器。
Truncate 删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,truncate 比 delete
更快,占用的空间更小。
Drop 命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的 DML 触发器也不会被
触发,这个命令也不能回滚。
问题 3:简述数据库的设计过程。
答:数据库设计分为以下五个阶段: 需求分析:主要是准确收集用户信息需求和处理需求,并对收集
的结果进行整理和分析,形成需求说
明。
概念结构设计:对用户需求进行综合、归纳、抽象,形成一个与与具体的 DBMS 无关概念模型(一般
为 ER 模型)。
逻辑结构设计:将概念结构设计的概念模型转化为某个特定的 DBMS 所支持的数据模型,建立数据
库 逻辑模式,并对其进行优化,同时为各种用户和应用设计外模式。
物理结构设计:为设计好的逻辑模型选择物理结构,包括存储结构和存取方法等,建立数据库物理模
式。
实施和维护:实施就是使用 DLL 语言建立数据库模式,将实际数据载入数据库,建立真正的数据库。
维护阶段是对运行中的数据库进行评价、调整和修改。
问题 4:插入记录时可以不指定字段名称吗?
答:不管使用哪种 INSERT 语法,都必须给出 VALUES 的正确数目。如果不提供字段名,则必须给
每个字段提供一个值,否则将产生一条错误消息。如果要在 INSERT 操作中省略某些字段,这些字段需要
满足一定条件:该列定义为允许空值;或者表定义时给出默认值,如果不给出值,将使用默认值。
问题 5:本地索引与全局索引的差别与适用情况。
答:对于本地索引,每一个表分区对应一个索引分区,当表的分区发生变化时,索引的维护由数据库
自动进行。对于全局索引,可以选择是否分区,而且索引的分区可以不与表分区相对应。当对分区进行维
护操作时,通常会导致全局索引的 INVALDED,必须在执行完操作后 REBUILD。
问题 6:事务和锁有什么关系?
答:可以使用多种机制来确保数据的完整性,例如约束、触发器以及本章介绍的事务和锁等。事务和
锁的关系非常紧密。事务包含一系列的操作,这些操作要么全部成功,要么全部失败,通过事务机制管理
多个事务,保证事务的一致性,事务中使用锁保护指定的资源,防止其他用户修改另外一个还没有完成的
事务中的数据。
问题 7:谈谈你对索引的理解?
答:索引是若干数据行的关键字的列表,查询数据时,通过索引中的关键字可以快速定位到要访问的
记录所在的数据块,从而大大减少读取数据块的 I/O 次数,因此可以显著提高性能。
问题 8:谈谈你对事务的理解?
答:事务从 COMMIT、ROLLBACK、连接到数据库或开始第一条可执行的 SQL 语句时开始,到一条
COMMIT、ROLLBACK 语句或退出数据库时结束。如果在一个事务中包含 DDL 语句,则在 DDL 语句的
评论