今天面试遇到一些问题

LoveAndroid520 2016-08-30 11:54:22
今天面试了三家公司,只有一家公司叫去复试
觉得有些问题,答得不是很好,固贴在这里,大家帮忙解答下,可能下次面试会用到,谢谢大家了!
1.你在设计db时,怎样解决锁?
2.有10000条数据,其中有1000条数据是错误的(比如pk了或数据格式不对),怎样把剩下9000条数据写进table?
3.你现在公司oracle db 是用什么备份?假如db down掉了,怎样恢复?
4.如果系统突然变慢了,你怎么处理?
5.分区有几种?解释一下什么时候用到范围分区,什么时候用到hash分区?
6.如果一个table很大,你怎样考虑建立索引?你建立组合索引考虑什么?
7.如果一条sql执行很慢,是走全表扫描,你怎样考虑建立索引?好像和6差不多。
...全文
8099 51 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
51 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaobluesky 2018-06-22
  • 打赏
  • 举报
回复
1.你在设计db时,怎样解决锁?
ORACLE DB设计的时候很少考虑锁的问题。mysql除外,不同的引擎锁的机制不一样。
大部分的锁是在表级别设计的时候,大部分锁是由于请求了大量的数据导致。尽量减少锁的范围即可。

2.有10000条数据,其中有1000条数据是错误的(比如pk了或数据格式不对),怎样把剩下9000条数据写进table?
存储过程、Java Excption处理就好了。

3.你现在公司oracle db 是用什么备份?假如db down掉了,怎样恢复?
冷备,Rman, DG都算备份。 DB Down掉看损坏程度的。有备库直接切,没有备库从冷备或者Rman中恢复即可。

4.如果系统突然变慢了,你怎么处理?
先看整体服务器的负载。包括IO、CPU ,IO的话一般是大量的数据扫描。Cpu的话很多是统计Count型过多,也可能是比较麻烦的锁。 再看当前所有的Session和Sql情况。 最简单的。跑个Awr的报告,看等待时间和TOP SQL就知道为什么慢了。

5.分区有几种?解释一下什么时候用到范围分区,什么时候用到hash分区?
大部分情况看数据类型和查询方式,时间范围式的查询多用范围分区。只需要查询指定分区即可。 Hash分区一般用于账号之类的精确查询。

6.如果一个table很大,你怎样考虑建立索引?你建立组合索引考虑什么?
表很大,索引是非常消耗资源的。尽量减少索引的使用,可以尝试使用分区索引。
组合索引最主要考虑的是前缀扫描问题。

7.如果一条sql执行很慢,是走全表扫描,你怎样考虑建立索引?好像和6差不多。
结合具体的where条件及数据分布情况进行分析。也可以直接使用Oracle sql advise直接优化。

都是偏向实用性的基础问答。
hp961218 2017-12-12
  • 打赏
  • 举报
回复
看到这些,感觉自己是初级中的初级
嶶風 2017-12-07
  • 打赏
  • 举报
回复
来学习的,看到那么多样的解答,学到了不少东东呢,感谢
自由的靈魂 2017-10-24
  • 打赏
  • 举报
回复
这些问题都很模糊~~~情况很多种~~~看经验
000X000 2017-10-23
  • 打赏
  • 举报
回复
66666666666666666666666666,我不会,哈哈哈
wangwei 2017-09-20
  • 打赏
  • 举报
回复
1.你在设计db时,怎样解决锁? 锁是关系型数据的一种机制,控制并发,保证事物的一致性 锁的问题要结合业务逻辑来设计,避免出现死锁和一次锁了大量的数据 避免死锁程序要设计合理逻辑来处理 避免数据库进行大事物,把大事物拆分为小事物 避免设计的表中对不同的字段进行大量修改,可以考虑把这种表进行拆分 2.有10000条数据,其中有1000条数据是错误的(比如pk了或数据格式不对),怎样把剩下9000条数据写进table? 如果用sqlldr进行导入,有个参数 errors -- 允许的错误的数目 (默认 50)也就是说遇到50个错误导入就终止了 那么可以把errors 设置为 大于1000 就可以顺利的吧9000导入到表中了 3.你现在公司oracle db 是用什么备份?假如db down掉了,怎样恢复? 物理备份加逻辑备份 物理备份使用rman进行备份,备份策略是每周六零点进行全量备份,1,3,5进行1级增量备份 逻辑备份每天零点进行expdp导出 db 如果down 可能有很多原因,不同的原因恢复不一样 1.首先启动,数据进行实例恢复,一般情况下数据可以正常启动不用人工参与的 2.如果是数据文件和数据块损坏,启动会报错,这是可以先进行recover进行恢复,如何不行进行数据文件恢复,restore datafile 然后在revcover 就可以了 3.如果是控制文件损坏,那要恢复控制文件 4.如果损坏严重可以整个数据库的恢复 restore database 5.一般情况线上环境都是高可用的 dataguard ,恢复前先进行主备切换(不同情况,不同处理) 4.如果系统突然变慢了,你怎么处理? 系统突然变慢,可能有多种原因 1.首先检查操作系统资源情况 cpu ,内存,磁盘等 (用top 看看进程资源占用情况) 2.进入数据库查看一些性能视图例如v$seession_wait 收集一下awr报告,确认问题原因 3.一般突然可能是慢sql导致的,通过上述分析可以查到相应的会话,把资源消耗高的会话kill掉,就可以解决了 4.最后就要分析根本原因,进行彻底的解决,如果是sql慢可能是全面表扫描导致,这是可以通过建立索引来解决 5.分区有几种?解释一下什么时候用到范围分区,什么时候用到hash分区? (1)范围分区(range); (2)哈希分区(hash); (3)列表分区(list); (4)范围-哈希复合分区(range-hash); (5)范围-列表复合分区(range-list)。 范围分区就是对数据表中的某个值的范围进行分区,根据某个值的范围 hash分区可以均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能; 根据实际场景进行不同的分区 6.如果一个table很大,你怎样考虑建立索引?你建立组合索引考虑什么? 如果表很大不要建立太多的索引,建立太多索引很占用很大的空间 首先在where条件经常使用的列建立索引 不要在大列上建立索引 组合索引建立考虑列的顺序,最好把区分度高的字段放在前导列上,组合索引中列的数量 7.如果一条sql执行很慢,是走全表扫描,你怎样考虑建立索引?好像和6差不多。 1.根据sql的执行计划去分析,在相应的字段建立索引
qq_38748910 2017-07-26
  • 打赏
  • 举报
回复
求解,,,,,
小张点对点 2017-07-10
  • 打赏
  • 举报
回复
我还没入门
有意1314 2017-06-29
  • 打赏
  • 举报
回复
----------------------------------------------------------------------------------------------------------------------------- 要考虑一下全表扫描是否是正确的执行计划,看一下查询的数据占表总数据量的多少,如果确定有索引更优则考虑建立索引。看这个表经常用来做什么样的DML,update、delete、insert的频率高不高。如果不高或者根本没有的话,看一下这个索引列重复值多不多,根据这些情况考虑建立bitmap还是普通索引。的建立索引的时候看一下表中已有的索引,看是否可以合并,合并后索引能否正常应用于这条慢的sql语句。 ------------------------------------------------------------- 转载itpub大牛---renfengjun
有意1314 2017-06-29
  • 打赏
  • 举报
回复
你在设计db时,怎样解决锁? 答:数据库系统本身是一个多用户并发处理系统,在同一时间点上,可能会有多个用户同时操作数据库。这里就涉及两个很重要的问题: 1.这些用户之间的操作不会相互破坏。比如两个用户同时在相同的物理位置上写数据时不能发生相互覆盖的情况。这叫串行化,也就是说即使两个用户同时写,也必须有先后。串行化会降低系统的并发性,但是这对于数据结构不被破坏是必需的。 2.在满足串行化的前提下,如何将并发性提升到最大。通过闩锁和锁定来解决这两个问题。
有意1314 2017-06-28
  • 打赏
  • 举报
回复
5.分区有几种?解释一下什么时候用到范围分区,什么时候用到hash分区? ------------------------------------------------------------------------------------------------------ 引言:Oracle的range,hash,list三大分区可能我们大家在熟悉不过了,但什么每种分区适用于什么场景可能是很多人的疑惑点,那么在选择不同的分区时应该注意什么,为什么这么选,有哪些需要我们加以注意的地方,让我们一一来探索一下吧:) A.创建range分区,一般用于日期化处理,range分区可以很好的管理基于日期来分区的数据 创建一个新用户ls SYS@LEO> create user ls identified by ls; SYS@LEO> grant dba to ls; SYS@LEO> conn ls/ls 创建样本数据表 create table liusheng (orderid number(10),name varchar2(10),ls_date date); insert into liusheng values (1,'ls1',to_date('1981-01-02','yyyy-mm-dd')); insert into liusheng values (1,'ls2',to_date('1998-01-03','yyyy-mm-dd')); insert into liusheng values (1,'ls3',to_date('1999-01-04','yyyy-mm-dd')); insert into liusheng values (1,'ls4',to_date('2000-01-05','yyyy-mm-dd')); insert into liusheng values (1,'ls5',to_date('2000-01-06','yyyy-mm-dd')); insert into liusheng values (1,'ls6',to_date('2001-01-07','yyyy-mm-dd')); insert into liusheng values (1,'ls7',to_date('2001-01-08','yyyy-mm-dd')); insert into liusheng values (1,'ls8',to_date('2002-01-09','yyyy-mm-dd')); insert into liusheng values (1,'ls9',to_date('2002-01-10','yyyy-mm-dd')); insert into liusheng values (1,'ls10',to_date('2011-01-11','yyyy-mm-dd')); 创建range分区表 create table liusheng_part partition by range (ls_date) ( partition liusheng_part_1999_1 values less than (to_date('1999-01-01','yyyy-mm-dd')) , partition liusheng_part_2000_1 values less than (to_date('2000-01-01','yyyy-mm-dd')) , partition liusheng_part_2001_1 values less than (to_date('2001-01-01','yyyy-mm-dd')) , partition liusheng_part_2002_1 values less than (to_date('2002-01-01','yyyy-mm-dd')) , partition liusheng_part_2003_1 values less than (to_date('2003-01-01','yyyy-mm-dd')) , partition other values less than (maxvalue) ) as select * from liusheng; 查看分区 select * from liusheng_part partition (liusheng_part_1999_1); select * from liusheng_part partition (liusheng_part_2000_1); select * from liusheng_part partition (liusheng_part_2001_1); select * from liusheng_part partition (liusheng_part_2002_1); select * from liusheng_part partition (liusheng_part_2003_1); select * from liusheng_part partition (other); B.创建hash分区,利用hash函数打散某列使数据均匀分布,一般用于均衡I/O,缺点数据不容易管理,哈希分区不能DROP、SPLIT 以及MERGE分区 我们创建了拥有10个分区的哈希分区表“LIUSHENG_HASH” LS@LEO> create table liusheng_hash partition by hash(object_id) partitions 10 as select * from dba_objects; hash分区所占用的区个数,看每个分区占用的个数都差不多,说明数据还是比较均匀分布的 缺点:hash列上数值不能有太多的重复值,否则会导致数据分布不均匀 select partition_name,count(*) from user_extents where segment_name='LIUSHENG_HASH' group by partition_name; PARTITION_NAME COUNT(*) ------------------------------ ---------- SYS_P27 3 SYS_P26 3 SYS_P22 2 SYS_P28 3 SYS_P29 2 SYS_P21 2 SYS_P23 3 SYS_P25 3 SYS_P30 2 SYS_P24 3 select count(*) from liusheng_hash; COUNT(*) ---------- 9860 C.创建list分区,一般用于数据可枚举,有限个值,可以考虑列表分区,例如国家名字,按州来分区 创建list分区表,我们按国家来分别存放在不同的州,每个州是一个分区 create table liusheng_list (city_id NUMBER(5), city_name VARCHAR2(30), city_state VARCHAR2(20), city_amount NUMBER(10) ) partition by list (city_name) ( partition asia VALUES('china','japan'), partition europe VALUES ('germany','italy'), partition africa VALUES('libya','brazil'), partition other VALUES(DEFAULT) --默认分区 ); 插入数据 insert into liusheng_list values(1,'china','asia',100); insert into liusheng_list values(2,'germany','europe',101); insert into liusheng_list values(3,'libya','africa',102); insert into liusheng_list values(4,'liusheng_city','other',103); 查看数据 LS@LEO> select * from liusheng_list; CITY_ID COUNTRY_NAME STATE CITY_AMOUNT ---------- ------------------------------ -------------------- ----------- 1 china asia 100 2 germany europe 101 3 libya africa 102 4 liusheng_city other 103 小结:测试了上面的三大分区后,我相信现在不仅仅有感性的认识而且也加深了理性的认识,分区是个好东西,合理的利用可以提高我们管理收益(但不一定会提高查询收益),使用不当也会给我们添加许多麻烦,三思而后行是做DBA的一个好习惯。 补充:分区之优势 分区技术实质可以把数据分摊到不同的物理位置,增加I/O负载,提高检索效率。 可用性:分区表可以跨越表空间,而普通表则不然,好处就是如果表的一个分区损坏,其他分区不会受到影响我们只需要修复损坏的分区即可 ---------------------------------------------------------------------------------------------------------- 昨天这个问题回答和这差不多,但我觉得上面回答得更详细,这是我从网络找到的。 ---------------------------------------------------------------------------------------------------------- 复制一下自己看
yan_jg 2017-05-27
  • 打赏
  • 举报
回复
问题6 遇到过类似情况 。。 希望大神们指教 遇到过一个导入表的问题,大概几万数据 Date格式 有问题 。 比如说 这种数据‘2012-02-30’ 在源库中是用varchar2形式存储的 转换到正式库 字段类型是 date 使用 to_date 函数的时候就会报错 很头疼 当时写了一个小函数 解决了这个问题。把格式不正确的数据 返回null 插入的时候 插入 fun_check_date(column) is not null 的列就行了。 create or replace function fun_check_date(v_sj varchar2) return varchar2 is Result varchar2(4); d_date date; begin d_date := to_date(v_sj, 'yyyy-mm-dd'); return(d_date); exception WHEN OTHERS THEN Result := null; return(Result); end fun_check_date;
wa金色传说 2017-04-13
  • 打赏
  • 举报
回复
针对第六条。 1.根据实际应用考虑联合索引,如果有两列或者三列经常性被组合使用,可以考虑建立联合索引(可以对根据业务分析,将等值查询列放在前面)。 2.如果没有上述情况,或者其中某个字段是主键,可以考虑只建立单字段索引(复合索引开销大)。 3.要是没有固定字段,然而又有几个字段经常被条件所涉及,就分别建立单字段索引。 4.如果会被作为被驱动表,连接字段要建立索引。 5.如果有外键,外键加上索引列。 ………… 欢迎指正错误,我也是新人 - -
流浪墨尔本 2017-03-16
  • 打赏
  • 举报
回复
这个岗位一个月得多少K?
世间过客LV 2017-03-15
  • 打赏
  • 举报
回复
提的问题挺多的,不过面试答案不一定要很标准,看上面的问题多半是想看看你的经验及工作积累。比如问题6中的表很大怎么建立索引,首先不建议在白天建立,因为白天业务一般都比较繁忙影响生产环境,你可以选择在晚上此表几乎没有数据变动的时候进行这样会比较快的建立好索引。
szylicaihua 2017-03-02
  • 打赏
  • 举报
回复
顶一个,不错的帖子
baidu_37401244 2017-03-01
  • 打赏
  • 举报
回复
hao
sawzhou 2017-02-15
  • 打赏
  • 举报
回复
值得新人学习
qq_23117175 2017-02-15
  • 打赏
  • 举报
回复
值得学习,不错不错
jiangliangtong 2017-02-14
  • 打赏
  • 举报
回复
学习了,不错!
加载更多回复(29)

17,382

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧