面试可能会遇到的问题
- 数仓怎么设计?
数仓分为ODS层,DW层和DM层,ODS层从数据源抽取数据,对数据进行清洗,并将数据加载到中间表。DW层通过维度建模建好事实表和维度表,将ODS层的数据加载到事实表和维度表中。DM层则建好主题表,将DW层的数据加载到主题表中,最后将数据给下游。
- kettle常用的组件。
表输入,表输出。EXCEL输入输出之类的。
调用存储过程。
合并记录,数据同步。
字段选择,获取系统信息。
3.(1)十亿数据要更新其中的100万条怎么更新
先问问是否有表分区,100万数据是否在一个分区,如果有表分区,那按照表分区更新。如果没有,那先create table temp as select 选出10亿数据中非100万的数据,然后将100万新的数据插入temp表,将原表删除,将temp表改名为原表名。(此题应该尽量避免全表扫描和使用update,因为update更新一次扫描一次全表,不用merge是因为merge要排序)
(2)十亿数据添加一个字段
先问是否有数据源,有的话先备份原表,然后将原表删除,从数据源create一个有新字段的新表。
(3)十亿数据删除1万条
直接delete即可。
4.如何查数据是否重复
select * from emp e1 where exists(select 1 from emp e2 where e1.empno=e2.empno and e1.rowid>e2.rowid);
5.视图和物化视图的优缺点
视图优点:提高安全性,不占用表空间,简化查询步骤,提高效率。
缺点:不能增删改,存储过程中视图不能当数据集用,可能会有性能上的问题。
物化视图优点:反映某个查询的结果,本身可以存储数据,占用空间。
缺点:占用表空间。
那什么时候用物化视图呢?要提高查询效率,在线优化的时候用。
6.oracle sqlserver和mysql的区别
Oracle:稳定性优于sqlserver,收费,安全性高,性能好,开发公司是甲骨文。
Mysql:支持500万条记录的数仓,适用于所有平台,开源。
Sqlserver:数据导出方面功能强,只能在window上运行,Microsoft开发。
7.如何保证数据的准确性?
数据质量监控:
数据每个字段校验规则,反过来查看是否有数据,例:原来的条件是=1那用!=1测试。
查看字段映射有没有问题。
检测数据是否重复(用exists);(数据重复的原因:1、一对多。2、关联条件少了。3、数据本身重复,关联的时候没有去重)
与数据源的数据量是否一致。
(如果数据有问题,那么修正代码)
8.对数据量很多的表如何优化
分表分区,例:按年分表,按月分区
9.递归
伪列有3行
- rownum
- rowid
- level
递归用到level
(题外话:如何用select求出1加到100
select sum(level) from dual
connect by level<=100;)
例:
select e.*,level from emp e
start with ename='KING'
connect by prior empno=mgr;
可以看出递归层数
10.调度原则(怎么调度的)
(1)依据业务流程和数据依赖关系进行调度
(2)如果没有依赖关系,那就并行
11.一个项目中会有哪些文档
(1)需求文档
(2)数据字典
(3)测试报告
(4)上线步骤
12.需求文档有什么内容
文档信息,需求总览,具体需求,功能设计
13.你的数据量有多大?
反问什么数据量?是最大的表?日增量还是存量?
14.你是怎么优化的?
1.先找出性能瓶颈(日志监控)
2.单独运行每一段
如果是insert,update,delete慢?
先查看是否是索引导致的,是就先停掉索引,更改完数据再重建。
如果不是索引导致的,那就优化查询。
- 查看是否关联太多导致查询慢,可以建临时表存储中间数据。(或者用子查询)
- 查看代码里sql是否可以改进,比如union 可以改成union all,in改为exists,子查询改为分析函数,distinct可以改成exists。
- 查看执行计划,看看扫描方式,全表还是索引,如果是全表,看看有没有索引,没有的话建一个,有的话看看为什么失效了。(索引失效原因:1.隐式转换PS:数字转字符不走索引,但字符转数字走索引。2.字段引用函数。3.空值判断PS:非位图索引。4.索引列进行运算。5.组合索引且不按组合索引顺序。)
- 索引优化完看看IO COST 变小没有,看看关联机制有没有走默认情况,如果有,可以用hints修改关联机制
Select /*+use_hash(e,d)*/ e.*,d.dname from emp e
Join dept d on e.deptno=d.deptno
/*+parallel(2)*/ hints强制使用多线程,要小于线程数的一半。
- 再看看表的数据量以及占用的表空间情况,建表分区。
15.一个存储过程,本来跑3分钟,两个月后跑3小时,怎么办
(1)看看是否偶然现象,比如那天数据量刚好比较大
(2)如果不是偶然,那么看看是否表结构改变,有别的人动了表。
接着看看是否增删改产生的碎片占据表空间,导致变慢。
进行表分析,用hints把机制固定下来,或者使用动态sql。
16.主键和唯一索引同与异
主键自动建唯一索引
异:1.主键不能为空。
2.主键失效后无法插入数据。
- Object类型不一样,主键是约束,唯一索引是索引类型。
17.数据字典有什么内容
字段名,字段中文名,字段数据类型
18.测试报告有什么内容
需求名字,你的解决需求的代码,测试用例和结果
19.游标类型
(1)系统游标
父游标(全局,SGA)select * from v$sql;
子游标(进程,PGA)select * from v$sqlarea;
(2)会话游标
静态游标
显式游标(open cursor;)
隐式游标(select into;for循环)
动态游标
Sys_refcursor
20.上线步骤有什么内容
自动化,运维,一个软件,按依赖关系一一放上去,启动。
手工。
- 自己,按依赖关系一一执行代码
- 运维,可以将代码放在一个一个标好数字的文件夹,让他按照数字和层数一一执行。
也可以写word文档,第一步执行什么代码,第二步执行什么代码。
21.hadoop是什么
分布式存储与计算的框架
22.怎么按主题存储数据
按命名规范存到相应的表里
23.kettle版本
19年之前 7.1
19年之后 8.3
现在 9.2
24.数据源怎么获取
Kettle表输入,文件输入
25.代码怎么管理
Svn
26.假如上线的新版本有bug怎么办
先回退回上一版本
27.上线的时候你在做什么
排队
28.HIVE是什么?
把sql翻译成MapReduce的软件
29.动态行列转换
30.数仓的特点
集成的,稳定的,反应历史变化,面向主题
31.truncate和delete的区别
(1)Truncate是DDL,不用commit,delete是DML,需要手动commit。
(2)truncate 清空全表,delete可以带条件删。
(3)truncate不会导致高水位线。
31.缓慢变化的三种表示方法
1.直接覆盖,只能看到当前值
2.加一个新值字段,只能多记录一个状态
3.拉链表,能体现历史状态
(拉链表的三步:1.游标取数据;2.update;3.insert;)
32.常用的linux命令
Cat chmod touch mv vi cp rm
Awk sed cut sort
33.数仓解决什么问题
(1)数据存储问题和数据挖掘问题
(2)集成数据,稳定,并且反映历史变化,面向主题。
Q:什么是数仓
A: 数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。
数仓的特点:
- 面向主题的:经过ETL抽数、清洗、转换加载后,数据按不同主题存放在同一个库中,梳理归类;
- 集成的:不来来源的数据的集合。
- 相对稳定的:不会人为改变任何数据,只同步。如果源系统出故障了,数据仓库的数据依然存在。
- 反应历史变化:源系统数据库一般只保存几个月,定期删除,数据仓库可保存几年后压缩在硬盘里。
Q:数据仓库分为几层,主要是干嘛的?
A: 我们项目是传统数仓,主要分为三层,贴源层,数仓层,集市层。
三层的工作内容:
ODS层(贴源层/可操作数据层),主要是做数据的抽取,转换和同步,通过调度工具(CTM)按照每天/每月,定期从源系统中将数据抽取到ODS层。
DW层(数据仓库层),主要是从ODS层同步数据到数据仓库,根据业务的需要对事实表和维度表进行建模(星型或雪花模型)。
DM层(数据集市层),主要是为报表展示提供数据支撑,会从DW层同步数据到DM层,同时对各项指标提供数据或者通过函数计算得到报表需要的数据指标。
三层的解释:
ODS 是贴源层,主要是做数据的收集汇总,通过ETL工具来实现,数据抽取,转换,同步。
ODS层是数据仓库准备区,为DWD层提供基础原始数据,可减少对业务系统的影响。
建模原则:建模方式及原则:从业务系统增量抽取、保留时间由业务需求决定、可分表进行周期存储、数据不做清洗转换与业务系统数据模型保持一致、按主题逻辑划分。
DW层,是数据仓库,主要是从ODS数据库中,去除我们需要的数据按照事实表和维度进行建模,比如星型模型和雪花模型。
建模方式及原则:数据模型与ODS层一致,不做清晰转换处理、为支持数据重跑可额外增加数据业务日期字段、可按年月日进行分表、用增量ODS层数据和前一天DWD相关表进行merge处理。
DM层,数据集市,主要是做数据分析和报表数据展示。
根据DW层数据按照各种维度或多种维度组合把需要查询的一些事实字段进行汇总统计并作为单独的列进行存储,(宽表)满足一些特定查询、数据挖掘应用;
建模方式及原则:尽量减少数据访问时计算,优化检索;维度建模,星型模型;事实拉宽,度量预先计算;分表存储。
Q:有哪几种模型,他们有什么区别?
A: 星型模型:所有的维度表都能直接跟事实表关联,存在冗余数据,一般来说性能会更好
雪花模型:一个或多个维度表没有直接跟事实表关联,需要通关其他维度表才能关联到事实表,去除了冗余数据,因为跟维度表要关联多次,所以效率不一定有星型模型好
两种数据模型的优缺点:
星型模型因为数据的冗余所以很多统计查询不需要做外部的连接,因此一般情况下效率比雪花型模型要高。星型结构不用考虑很多正规化的因素,设计与实现都比较简单。
雪花型模型由于去除了冗余,有些统计就需要通过表的联接才能产生,所以效率不一定有星型模型高。正规化也是一种比较复杂的过程,相应的数据库结构设计、数据的 ETL、以及后期的维护都要复杂一些。
因此在冗余可以接受的前提下,实际运用中星型模型使用更多,也更有效率。
Q:项目流程 /开发流程 /最近项目的工作内容是什么?
A: 整体开发流程主要从 需求阶段---> 设计阶段 --> 开发阶段--> 测试阶段 --> 上线阶段
- 需求阶段,产品经理给我们交接完需求 ,项目经理会根据需求给我们分配开发任务
- 设计阶段,我们会根据需求完成,表结构的设计,整理出数据字典。
- 开发阶段,我们会根据自己负责的开发任务进行开发,每天项目经理会跟我们开晨会,过一下每个人的开发进度 ,开发完成以后 ,我们会自己做UT测试(单元测试) , 转测之前我们项目经理会组织我们进行代码评审,评审通过以后提交测试验证。
- 测试阶段,主要是改BUG ,测试发现问题我们修复,然后跟踪缺陷闭环。
- 上线阶段,参与上线支持,项目组的全体成员都参与,上线当天有负责生产环境部署的同事进行版本上线的工作,有问题我们就及时定位解决,没问题就在公司休息,等上线结束。
Q:OLTP 和 OLAP
A: OLTP:连机事务处理。
需要实时处理大量请求,而每次处请求的数据量都是很小的。OLTP是传统的关系型数据库的主要应用,
主要是基本的、日常的事务处理,例如银行交易。
性能好坏的重要指标:响应时间与请求处理并发数。
OLAP:联机分析处理。
可以简单地理解为在海量数据中得出统计/综合信息,是数据仓库的主要应用。做OLAP应用的数据库,数据量通常量非常大。和OLTP不同,OLAP应用的并发处理量是很低的,所以基本不用考虑并发问题。而在
处理数据量方面,OLAP每次操作所需要处理的数据量通常都是非常大的,这点也和OLTP相反。
性能好坏的重要指标:查询大量数据的速度。
由于OLTP和OLAP是两个不同应用方向,所以在优化数据库时应采取不同的优化策略。
Q:维表和事实表都是什么?什么是指标?怎么来区分?
A: 1、事实表就是你要关注的内容;
2、维度表就是你观察该事务的角度,是从哪个角度去观察这个内容的。
比如商品的销量,是从地区这个角度观察商品销量的。事实表就是销量表,维度表就是地区表。
指标是需要去计算的,可以是销售量或者销售额的同比或者环比之类的,叫做指标。
Q:主题域是什么?
A:主题域通常是联系较为紧密的数据主题的集合。可以根据业务的关注点,将这些数据主题划分到不同的主题域。主题域的确定必须由最终用户和数据仓库的设计人员共同完成。
Q:元数据是什么
A: 元数据的定义
数据仓库的元数据是关于数据仓库中数据的数据。它的作用类似于数据库管理系统的数据字典,保存了逻辑数据结构、文件、地址和索引等信息。
广义上讲,在数据仓库中,元数据描述了数据仓库内数据的结构和建立方法的数据。
元数据是数据仓库管理系统的重要组成部分,元数据管理器是企业级数据仓库中的关键组件,贯穿数据仓库构建的整个过程,直接影响着数据仓库的构建、使用和维护。
Q:概念模型,逻辑模型,物理模型
A: 概念模型:概念模型就是在了解了用户的需求,用户的业务领域工作情况以后,经过分析和总结,提炼出来的用以描写叙述用户业务需求的一些概念的东西。如销售业务中的“客户”和“订单”,还有就是“商品”,“业务员”。
逻辑模型(关系模型):逻辑模型就是要将概念模型详细化。要实现概念模型所描写叙述的东西,须要那些详细的功能和处理那些详细的信息。这就到了需求分析的细化阶段。
还以销售业务为例:“客户”信息基本上要包含:单位名称,联系人,联系电话,地址等属性;“商品”信息基本上要包含:名称,类型,规格,单位价格等属性;“订单”信息基本上要包含:日期和时间属性。而且“订单”要与“客户”,“业务员”和“商品”明细关联。
系统须要建立几个数据表:业务员信息表,客户信息表,商品信息表,订单表。
系统要包含几个功能:业务员信息维护,客户信息维护,商品信息维护,建立销售订单 。
以上这些均属于建立逻辑模型,这些说明仅仅表明系统要实现什么,但如何实现,用什么工具实现还没有讲,后者属于物理模型范围。
物理模型: 编写详细的SQL脚本在数据库server上将数据库建立起来。当中包含业务员信息表,客户信息表,商品信息表,订单表。包含:业务员信息维护,客户信息维护,商品信息维护,建立销售订单等功能,并用工具将每个表创建出来。
总结
这三个过程,就是实现一个软件系统的三个关键的步骤,是一个从抽象到详细的一个不断细化完好的分析,设计和开发的过程,结合PowerDesigner来依据须要分析、设计、到数据库表就是整个理解的过程
Q:会计中的三大报表是什么?
A: 会计的三大报表是指《资产负债表》,《利润表》,《现金流量表》。
资产负债表反应企业报表日财务状况,损益表反应企业会计期间的盈利情况,现金流量表反应企业会计期间的经营、投资、筹资现金流情况。
三张报表以一个三维立体式展现一家公司的财务状况,多角度对同一经济实体的资产质量和经营业绩作报告。
从三大报表的时间属性上看,损益表、现金流量表属于期间报表,反应的是某一段时期内企业的经营业绩,资产负债表是期末报表,反应的是报表制作时企业的资产状况。
从相互作用上看一个经营期间损益表、现金流量表改变资产负债表结构,但长期而言,资产质量对企业盈利能力起到决定性作用,这又是资产负债表决定损益表、现金流量表。
从某种意义上讲,资产负债表系静态报表,而损益表、现金流量表系动态报表,表现为在一段时期内如何改变资产负债表,有点像资产负债表提供一个平台。
Q:oracle数据的备份和恢复
A: Oracle中的备份分为两大类:逻辑备份和物理备份。其中物理备份又分为两类:冷备份和热备份。
逻辑备份是指利用exp命令进行备份。利用该命令进行备份,简单易行,也不影响正常的数据库操作。因此,经常被作为日常备份的手段。exp命令可以添加多个参数选项,以实现不同的导出策略。
1.冷备份/恢复 冷备份是指在数据库关闭的状态下,备份所有的数据库文件。这些文件包括:所有数据文件、所有控制文件、所有联机REDO LOG文件和Init.ora文件(可选)。
2.热备份/恢复 数据库的热备份是指对处于启动状态下的数据库进行备份。热备份一个数据库,首先要保证数据库运行于归档模式,然后备份表空间的数据文件,最后备份控制文件。
Q:项目上线的时候需要注意些什么
A:主要是几个方面:代码检查,整理上线脚本清单,及时定位和解决生产环境的BUG,事后做好总结。
- 从代码管理的方面来说,我们上线之前会进行代码的检查,确保提交的代码是最新的,并且没有遗漏。
- 上线开始前,我们会提前到公司准备上线,跟生产环境的环境管理员做好沟通。
- 上线过程中,发现了报错或者其他的情况,是我负责的,我会及时定位并修复。如果不是我负责的问题,其他同事遇到的问题,我也会主动协助他们进行问题的定位。
- 最后无论上线过程中是否有自己负责的BUG,都应该总结经验,好的方法或者思路继续保持,有风险的做法要尽量避免。
代码技术问题
Q:分析函数有哪些?
A: 常用的分析函数如下所列:
row_number() over(partition by … order by …)
rank() over(partition by … order by …)
dense_rank() over(partition by … order by …)
count() over(partition by … order by …)
max() over(partition by … order by …)
min() over(partition by … order by …)
sum() over(partition by … order by …)
avg() over(partition by … order by …)
first_value() over(partition by … order by …)
last_value() over(partition by … order by …)
lag() over(partition by … order by …)
lead() over(partition by … order by …)
Q:如何用分析函数去重?
A: DELETE FROM TABLE_A
WHERE ROWID IN (
SELECT ROWID
FROM (
SELECT A.*,
ROW_NUMBER() OVER(PARTITION BY NAME ORDER BY NAME) AS RN
FROM TABLE_A A
)
WHERE RN > 1
);
Q:什么是内关联,外关联?
A: 内连接:内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。
左连接(左外连接)以左边的表作为主表,主表的记录全部显示,右边的表是从表,从表表的关联字段跟主表相同的就显示,不相同的则自动补null 。
右连接(右外连接)跟左关联相反,以右边的表作为主表,左边的表作为从表,主表信息全部展示,从表只显示跟主表关联字段相同的数据,其余的自动补null。
全外连接(FULL JOIN 或 FULL OUTER JOIN)完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
Q:存储过程出现异常怎么处理?
A: 在PLSQL中可以使用 EXCEPTION ,在EXCEPTION 中把过程数据记录到错误日志表,然后对主过程的事务做回滚 ,并且针对异常我们会记录异常的日志,方便后续的问题分析。
Q: Hadoop的存储原理是什么样的
A: HDFS(Hadoop Distributed File System ,分布式文件系统);
HDFS采用了主从(Master/Slave)结构模型,一个HDFS集群是由一个NameNode和若干个DataNode组成的。其中NameNode作为主服务器,管理文件系统的命名空间和客户端对文件的访问操作;集群中的DataNode管理存储的数据。
NameNode(管理节点)作为master服务,它负责管理文件系统的命名空间和客户端对文件的访问。NameNode会保存文件系统的具体信息,包括文件信息、文件被分割成具体block块的信息、以及每一个block块归属的DataNode的信息。对于整个集群来说,HDFS通过NameNode对用户提供了一个单一的命名空间。
DataNode(数据节点)作为slave服务,在集群中可以存在多个。通常每一个DataNode都对应于一个物理节点。DataNode负责管理节点上它们拥有的存储,它将存储划分为多个block块,管理block块信息,同时周期性的将其所有的block块信息发送给NameNode。
Q:truncate 在存储过程中能直接用吗?
A: 不能,要使用动态SQL , 在存储过程中的 BEGIN 和 AND 中间写:
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE 目标表;
END;
Q:你知道的行转列的函数或者方法
A: oracle 11G以后支持 行列互换 pivot() 和 unpivot() 函数。
还可以使用以下方法进行行列转换:
- 用分析函数lead/lag ;
- 用DECODE;
- 部分关联(查询表中的部分数据,然后通过关联的方式查出结果);
- 集合运算 UNION ALL 来实现行列转换 ;
Q:使用left join时,on and和on where条件的区别
A: 1、on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。
2、where条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有left join的含义(必须返回左边表的记录)了,条件不为真的就全部过滤掉,on后的条件用来生成左右表关联的临时表,where后的条件对临时表中的记录进行过滤。
工具问题
ETL相关
Q:什么是ETL
A:ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。E_JOB >> T_JOB >> L_JOB;
Q:kettle抽数一般遇到什么问题,你们是怎么解决的?
A: 遇到过几个,比如:
Kettle在不同的数据库抽取数据时,有时会出现中文乱码问题
解决方法:
如果数据库设置正确仍然存在中文乱码,则可能是因为有的客户端数据库默认的编码集不是UTF-8,我们只需要在输出时对输出的数据库进行编码配置
如果还不行 可以打开Options,添加参数characterEncoding,设置值为gbk/utf8。
Q:datastage常用的控件有哪些
A: COPY STAGE(复制)
Filter Stage(过滤)
Funnel Stage(合并)
Tansformer Stage
Sort Stage(排序)
LookUp Stage(关联)
Join Stage(关联)
Aggregator Stage(聚合)
Remove Duplicates Stage(去重)
Q:怎么用DS设计job?
A: 打开data stage
1.建一个数据库 mydb,建Schema schema_ytao,建表AA,schema为schema_ytao,只有一列 ID(int),插入数据1,2,3..
2.在数据库sample和mydb中分别建表BB,schema分别为 db2admin 和 schema_ytao
3.新建一个server job (猜测:因为server job,所以后面的Db 组件都不需要指定server ip 或 server name,这个字面真的让我犯困了)
4.拖两个 Db2 api 组件,一个用作输入dc in,一个用作输出 dc out
5.拖一个 transfer 组件
6.连接。点击link,左击 dc in,靠中间一点,不要放掉鼠标,向右拉开到 transfer 组件,这样才能出来一条线,这个地方试了很久。同样的方法连接 transfer 和 dc out
Q:datastage都有哪些控件
A: Transformer Stage 在 DataStage 中是一个重要的,功能强大的组件,在 ETL 过程中,它承担“T”( Transformer即数据的转化 ) 的责任。
Transformer Stage 在 DataStage job 中可实现的功能
1. 字段转换
2. 字段逻辑运算及判断
3. 数据复制
4. 数据过滤
5. 字段关联
Q:如果抽来的数据有重复的怎么解决?
A: 在kettle的核心组件中,有一个字段选择,里面有一个 去除重复记录(Unique Rows(hashset)) 的控件,在抽数的时候 可以通过这个控件对数据进行去重。
具体操作为:创建几个核心对象,分别是输入->表输入,将数据根据字段排序,数据去重,将去重好的数据输出到另一个表中,这里需要注意,数据去重前必须要经过根据相关字段排序;
Q:ETL脚本开发好以后 ,怎么运维?
A:我们会定期进行巡检 ,一般2周做一次检查,检查ETL脚本跑数是否正常,是否有报错 ,分析脚本跑数的时间 是否越跑越慢,这种情况下 需要分析脚本 和 目标表,比如目标表是否后来建了索引 导致更新表的时候越来越慢,索引会影响更新表的效率 。 如果是这种情况 可以先删除目标表的索引,然后更新完以后再重新创建,这样可以提高跑数的效率。
Q:一张特别大的表 ,几千万的表 怎么通过ETL工具同步?
A:在ETL工具中 我们插入数据的时候 可以设置批量提交 比如 10万条记录提交一次 ,而不是一次性提交 。
另外如果特别慢的话 还要考虑是否锁表了,比如在对目标表进行更新的时候,转换的状态一直不变, 可能是目标表产生了排它锁 导致无法更新,这个要具体分析一下。
Q:数据同步以后,源系统的表结构发生了改变,比如源系统的表增加了字段,你的kettle脚本是否会报错?
A:题目意思实际是:你的kettle脚本已经开发好了,这时候源表的列增加了 ,你的脚本是否会报错?
你应该说不会 ,因为我们抽数的时候 对源表和目标表的每个字段都做过映射 ,所以源系统的表增加了字段 ,我们的脚本是不会报错的。
但是如果这些新增的列 也需要同步到数仓,那我们会对ODS层表的结构进行变更,然后修改KETTLE的脚本,然后重新跑数。
报表相关
Q:做报表开发,如何确保你拿到的数据是准确的?
A:我们都是根据需求来验证的,如果是计算的话 都有计算公式,我会自己先算一遍,然后通过调用函数对比计算结果。
如果是存储过程的话,我会根据需求中的取值逻辑和判断,验证一下取值是否正确。
Q:你们用的报表工具是收费的吗?多少钱?
A:这方面我不太清楚,都是公司统一采购的,我主要负责使用报表工具完成需求开发,价格方面我没有关注。
Q:做出来的报表是以什么文件或者形式发给客户,客户又是通过什么方式查看报表的呢?
A:首先要看是什么报表,每张报表有URL链接的,如果是帆软或者Cognos是有客户端的,以WEB形式展现的,客户有登录账号密码的,我们也有,但是权限不一样,我们相当于系统管理员,是可以操作报表系统的,我们把报表文件,帆软是.cpt文件格式,上传到服务器,然后我们自己把文件放到对应的菜单目录下,自己运行下看是正常可以展示的,那么客户端那边也可以看到了
性能优化
Q:Oracle怎么进行性能优化
A: Oracle性能优化三板斧,索引优化,分区表优化,执行计划(HINTS 优化器优化);
索引优化:
注意索引是否失效,这一般是比较烂的SQL语句引起的问题。
经常过滤的字段需要创建索引,但是一张表的索引数最多不要超过5个,否则可能影响性能
Q:原表数据过亿了怎么建分区
A: 对于数据量过大的表,可以考虑先对数据先分表,再通过分区表存储,以提高查询的性能;
分表:对亿级数据的表可以通过定时任务,使用存储过程执行动态SQL实现每年创建一张表,先对数据进行分表存储。比如,每年的数据存在一张表中,一年内的数据可以通过分区表进行存储 。
分区:年表创建过后,查询就是查询年表中的数据,可是虽然分表了,但是年表中的数据量仍然很大,查询速度虽然有提升,但并不能满足用户的要求。便考虑到分表再分区,即将历史数据以不同的年表来存储,在年表中按月分区。
总的来说,分区的主要目的还是避免了全表扫描,从而提升查询速度。
Q:Oracle的关联查询执行原理?
A:多表连接的三种方式:
HASH JOIN:散列连接、优化器使用两个表中较小的表(通常是小一点的那个表或数据源)利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描较大的表,同样对JOIN KEY进行HASH后探测散列表,找出与散列表匹配的行。
SORT MERGE JOIN:排序合并连接、 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。
NESTED LOOP:嵌套循环连接 ,Nested loops 工作方式是循环从一张表中读取数据(驱动表outer table),然后访问另一张表(被查找表 inner table,通常有索引)。驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。
Q:有两张很大的表关联,怎么做才能关联性能好
A: SELECT子句中避免使用 *
使用DECODE函数来减少处理时间
用TRUNCATE替代DELETE
尽量多使用COMMIT
用Where子句替换HAVING子句
使用表的别名
用EXISTS替代IN、用NOT EXISTS替代NOT IN
用索引提高效率,避免在索引列上使用NOT 通常,避免在索引列上做计算。
用>=替代>
用UNION替换OR (适用于索引列)
用IN来替换OR
避免在索引列上使用IS NULL和IS NOT NULL
用WHERE替代ORDER BY
优化GROUP BY,将不需要的记录在GROUP BY 之前过滤掉
Q:什么是执行计划?怎么用?
A: 执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述 。
在SQL窗口执行完一条select语句后按 F5 即可查看刚刚执行的这条查询语句的执行计划。
执行计划的常用列字段解释:
基数(Rows):Oracle估计的当前操作的返回结果集行数
字节(Bytes):执行该步骤后返回的字节数
耗费(COST)、CPU耗费:Oracle估计的该步骤的执行成本,用于说明SQL执行的代价,理论上越小越好(该值可能与实际有出入)
时间(Time):Oracle估计的当前操作所需的时间 。
执行顺序:
根据Operation缩进来判断,缩进最多的最先执行;(缩进相同时,最上面的最先执行)
同一级如果某个动作没有子ID就最先执行
同一级的动作执行时遵循最上最右先执行的原则。
SQL执行顺序即为:
INDEX RANGE SCAN —> TABLE ACCESS BY GLOBAL INDEX ROWID —> INDEX UNIQUE SCAN —> TABLE ACCESS BY INDEX ROWID —> NESTED LOOPS OUTER —> SORT GROUP BY —> SELECT STATEMENT, GOAL = ALL_ROWS 。
表访问的几种方式:(非全部)
TABLE ACCESS FULL(全表扫描):查询出该表所有数据,获取的数据执行where语句。
TABLE ACCESS BY ROWID(通过ROWID的表存取):通过ROWID获取表数据。
TABLE ACCESS BY INDEX SCAN(索引扫描)。
索引扫描又分五种:
- INDEX UNIQUE SCAN(索引唯一扫描):查询条件中包含主键,因为主键是有唯一性约束的特殊索引。
- INDEX RANGE SCAN(索引范围扫描)
- INDEX FULL SCAN(索引全扫描)进行全索引扫描时,查询出的数据都必须从索引中可以直接得到,且查询条件不包含索引前导列。
- INDEX FAST FULL SCAN(索引快速扫描)扫描索引中的所有的数据块,与 INDEX FULL SCAN 类似,但是一个显著的区别是它不对查询出的数据进行排序(即数据不是以排序顺序被返回)。
- INDEX SKIP SCAN(索引跳跃扫描)。
1你们什么时候用到数据库(Oracle)?
在测试工作中经常要用到啊,比如:造数据啊,修改数据啊(比如测试短信的失效时间,修改逾期时间等),测试接口时验证返回数据的准确性,比如测试报表时验证报表数据的准确性等。
2数据库(Oracle)都会些哪些?
除了基本的增,删,改,查,外,还有分组,子查询,多表查询都没问题。
3 Oracle客户端如何连接服务器?
1、安装Oracle客户端和PL/SQL远程连接工具。
2、把服务器目录:app/administartor/product/11g/network/admin/tnsname.ora这个文件中拷贝到客户端相同的位置并多加一组连接服务器的字符串。
4数据库怎么查中间数据,怎么处理?
Oracle:使用rownum伪列, Mysql:使用Limit Sqlserver:使用top
Oracle语句如下:
select * from (select s.*,rownum r from student s) t where t.r>=10 and r.r<=20
Mysql语句如下:
select * from student limit 5,10
5如何一次性在数据库中插入10000条数据?
begin
for a in 1 .. 10000 loop
insert into student values(a,'张三'||a,'男',18);
end loop;
end;
6 DML有哪些?语法是什么?
数据定义语言(DDL),包括CREATE(创建)命令、ALTER(修改)命令、DROP(删除)命令等。
Ø数据操纵语言(DML),包括INSERT(插入)命令、UPDATE(更新)命令、DELETE(删除)命令等。
Ø数据查询语言(DQL),包括基本查询语句、Order By子句、Group By子句等。
Ø事务控制语言(TCL),包括COMMIT(提交)命令、ROLLBACK(回滚)命令。
Ø数据控制语言(DCL),GRANT(授权)命令、REVOKE(撤销)命令。
7 连接查询有哪些?怎么使用?
连接方式分内连接和外连接,内连接就是取交集,
oracle的写法是:
select * from emp a,dept b where a.deptno = b.deptno ;
内连接的写法:
select * from emp a inner join dept b on a.deptno = b.deptno
8 UNION ALL?和 UNION 的区别
合并结果集, UNION 会去重, UNION ALL 合并结果集不会去重。
9数据类型有哪些?
我们用的是oracle数据库,常用的数据类型 字符型 varchar2 ,数字 number ,日期 date
10 delete与truncate的区别
delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作;
truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
( 触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。 )
11 不小心delete了表中的数据怎么恢复?
如果没提交,直接rollback。
如果提交了,数据库都会设置自动备份,,可以使用数据库闪回, 非常简单
--得到一个当前序列号.
select dbms_flashback.get_system_change_number scn from dual;
--7827319是序列号
select * from table as of scn 7827319;
你可以慢慢减序列号,直到你能查询到数据.
例如, 我删除数据提交, Oracle会给这个操作一个序列号. 然后每一次操作都会生成序列号.
你用 as of scn 序列 查询时, 查询当时那个操作的数据情况.
Linux常见面试题
1你们什么时候用到Linux?
Linux使用的是什么版本?
服务器是什么品牌?
主要就是操作服务器时,比如搭建测试环境等!通过Xshell或CRT连接CentOS远程操作!
版本是最新的:CentOS7
品牌是用的是"惠普"
2 Linux你都会哪些命令?
1、查看日志:tail -f catalina.out
2、查看进程:ps -ef | grep java (查看tomcat是否启动方法1)
3、查看端口:netstat -anp | grep 8080 (查看tomcat是否启动方法2
4、修改权限:chmod或者是一些解压缩等命令。
5、其他命令:ifconfig(查看IP),vi(编辑),free -m(查看内存),top(查看实时进程),history等
3 你们Linux怎么搭建测试环境
1、首先到网上下载和开发版本一致的安装包(如:jdk的包,tomcat的包,数据库包)
2、安装jdk1.8并配置jdk的环境变量(配置环境变量文件:vi /etc/profile)
3、tomcat8.0是绿色版,用tar -zxvf命令解压缩就可以了
4、安装数据库,并设置远程连接。
5、把项目包.war文件放入tomcat的webapps目录,把.sql文件的数据导入数据库
6、修改项目连接数据库的文件(叫:database.propties)。
离职公司相关的面试题
1你是什么时候离职的?
半个月之内,切记不能太久。
2 你们公司在哪里?主要业务是什么?老板叫什么?
有多少个人?几个项目组?几个BI?
一定要自己去查公司地址(包括几楼几室),公司业务是什么?老板叫什么?总共有多少人?几个项目组?跟你一样做BI岗位的有哪些人?
3 入职工资多少?离职工资多少?
离职工资和你的期望工资一般不要超过1000块,入职工资根据情况计算,一般一年涨一次,一次涨500-1千的样子
4 你如何评价你上一家公司或者领导
我的上司大家都叫他某某,平时很亲切,工作上偶尔的话比较严格,不过还是蛮喜欢他的,也很感谢一起共事的时候教了我很多东西。
BI理论
1数仓是什么?
数据仓库(Data Warehouse)是一个面向主题的(Subject Oriented)、集成的(Integrated)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策(Decision Making Support)。
面向主题的:经过ETL抽数、清洗、转换加载后,数据按不同主题存放在同一个库中,梳理归类;
集成的:不来来源的数据的集合。
相对稳定的:不会人为改变任何数据,只同步。如果源系统出故障了,数据仓库的数据依然存在。
反应历史变化:源系统数据库一般只保存几个月,定期删除,数据仓库可保存几年后压缩在硬盘里。
2 数据仓库怎么分层
主要分三层,ODS层(也叫铁元层),DW层(数据仓库),DM层(数据集市)
数据仓库的整理架构,各个系统的元数据通过ETL同步到操作性数据仓库ODS中,对ODS数据进行面向主题域建模形成DW(数据仓库),DM是针对某一个业务领域建立模型,具体用户(决策层)查看DM生成的报表。
3 对ETL和BI的理解?
ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。E_JOB>>T_JOB>>L_JOB;
商业智能(BI,Business Intelligence)。商业智能的概念最早在1996年提出。当时将商业智能定义为一类由数据仓库(或数据集市)、查询报表、数据分析、数据挖掘、数据备份和恢复等部分组成的、以帮助企业决策为目的技术及其应用。
4 数据仓库的架构的理解,数据仓库和数据集市的理解,主题域是什么?
数据仓库(DataWarehouse),一般缩写成DW、DWH。数据仓库是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。
一、数据仓库
中文定义:数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。
二、主题
主题是与传统数据库的面向应用相对应的,是一个抽象概念,是在较高层次上将企业信息系统中的数据综合、归类并进行分析利用的抽象。
三、主题域
主题域通常是联系较为紧密的数据主题的集合。可以根据业务的关注点,将这些数据主题划分到不同的主题域。主题域的确定必须由最终用户和数据仓库的设计人员共同完成。
5 数仓的架构?
三层架构 ODS / DW / DN
DB1,DB2... ---> ODS ----> DW ( DATA WARHOUSE ) ----> WM ( DATA MATE )
源系统 ODS层 数据仓库 数据集市
6 DW层是什么,到里面做些什么
1,DW层主要提供来源明细数据,提供业务系统细节数据的长期沉淀,为未来分析类需求的扩展提供历史数据支撑;
2,建模(星型模型/雪花模型),数据模型与ODS层一致,不做清晰转换处理、为支持数据重跑可额外增加数据业务日期字段、可按年月日进行分表、用增量ODS层数据和前一天DWD相关表进行merge处理
7 数仓每一层是干嘛的?
ODS层,主要是做数据的集成,转换和同步,通过调度工具按照每天/每月,定期从源系统中将数据抽取到ODS层。
DW层,主要是从ODS层同步数据到数据仓库,根据业务的需要对事实表和维度表进行建模(星型或雪花模型)。
DM层,主要是为报表展示提供数据支撑,会从DW层同步数据到DM层,同时对各项指标提供数据或者通过函数计算得到报表需要的数据指标。
8 对于ODS、DW、DM层数据的理解
同上
9 项目人员构成,你们的项目架构是什么样的?你在哪一层开发?
按照数据仓库的系统架构,每一层一个独立的团队,每个团队因为所属层级不同,所以负责的事情也不同。
10 数据架构分几层,详细说明每层都是干嘛的还有他们的联系
ODS 是贴源层,主要是做数据的收集汇总,通过ETL工具来实现,数据抽取,转换,同步。
ODS层是数据仓库准备区,为DWD层提供基础原始数据,可减少对业务系统的影响。
建模原则:建模方式及原则:从业务系统增量抽取、保留时间由业务需求决定、可分表进行周期存储、数据不做清洗转换与业务系统数据模型保持一致、按主题逻辑划分
DW层,是数据仓库,主要是从ODS数据库中,去除我们需要的数据按照实事和维度进行建模,比如星型模型和雪花模型。
建模方式及原则:数据模型与ODS层一致,不做清晰转换处理、为支持数据重跑可额外增加数据业务日期字段、可按年月日进行分表、用增量ODS层数据和前一天DWD相关表进行merge处理
DM层,数据集市,主要是做数据分析和报表数据展示。
根据DW层数据按照各种维度或多种维度组合把需要查询的一些事实字段进行汇总统计并作为单独的列进行存储,(宽表)满足一些特定查询、数据挖掘应用;
建模方式及原则:尽量减少数据访问时计算,优化检索;维度建模,星型模型;事实拉宽,度量预先计算;分表存储。
11 数仓的定义
同 4
数据仓库(DataWarehouse),一般缩写成DW、DWH。数据仓库是一个面向主题的(Subject Oriented)、集成的(Integrate)、相对稳定的(Non-Volatile)、反映历史变化(Time Variant)的数据集合,用于支持管理决策。
12维表和事实表都是什么?怎么来区分?
1、事实表就是你要关注的内容;
2、维度表就是你观察该事务的角度,是从哪个角度去观察这个内容的。
上线时,一般先跑维度表再跑事实表
13 维度表具体有哪些信息
维度表可以看作是用户来分析数据的窗口,维度表中包含事实数据表中事实记录的特性,有些特性提供描述性信息,有些特性指定如何汇总事实数据表数据,以便为分析者提供有用的信息,维度表包含帮助汇总数据的特性的层次结构。
维度表包含了事实表中指定属性的相关详细信息,比如,详细的产品,客户属性,存储信息等。
例如,包含产品信息的维度表通常包含将产品分为食品、饮料、非消费品等若干类的层次结构,这些产品中的每一类进一步多次细分,直到各产品达到最低级别。在维度表中,每个表都包含独立于其他维度表的事实特性,
例如,客户维度表包含有关客户的数据。维度表中的列字段可以将信息分为不同层次的结构级。
14 什么是维度表,什么是指标
比如商品的销量,是从地区这个角度观察商品销量的。事实表就是销量表,维度表就是地区表。
指标是需要去计算的,可以是销售量或者销售额的同比或者环比之类的,叫做指标。
15 三范式的理解
1,每一列都要拆分到不能再拆分的最小粒度。
2,每个表都要有主键,并且主键列必须和其他列有关联。
3,主键必须和所有列直接关联,而不是间接关联。
16 星型模型和雪花模型?
事实表和维度表直接关联,星型模型。
只要有任何一个维度表和事实表是间接关联的,雪花模型。
17 什么是哈希
你说的的 哈希 只是 执行计划中的 哈希连接 还是 表分区类型的 哈希分区?
在oracle中,关联机制有三种方式:嵌套循环、哈希连接、(归并)排序合并连接
哈希关联(Hash Join(HJ)):计算出整张被探查表关联字段的哈希值,这些哈希值和整张被探查表一起放入缓存区,然后从驱动表逐条取记录,计算出关联字段对应的哈希值,再与被探查表的哈希值匹配,匹配上了再精准匹配每一条记录。
优点:性能好,匹配次数大大减少
缺点:只适用于等值关联,占用内存较大
注意:把两张表最终需要关联的数据对比,小表适合做被探查表,因为怕缓存不够。如果缓存足够的前提下,大表适合做被探查表。
表分区的一种类型:散列(哈希)分区:HASH
这类分区是在列值上使用散列算法,以确定将行放入哪个分区中。当列的值没有合适的条件时,建议使用散列分区。
散列分区为通过指定分区编号来均匀分布数据的一种分区类型,因为通过在I/O设备上进行散列分区,使得这些分区大小一致。
18 粒度是什么
统计粒度:数据库中数据的细化和综合程度。细化程度越高,粒度越小。
在建表的三范式中第一范式中提到的,表中的字段要拆分到不能拆分的最小粒度,不能同行同列出现2个不同的值。
19 水晶报表的原理是什么?
Crystal Reports(水晶报表)是一款商务智能(BI)软件,主要用于设计及产生报表。
工作原理: 从数据库中通过Pull 模式或者Push 模式取数据,然后通过水晶报表工具做数据的选择和样式的展示,最后将报表文件导出成为我们想要的类型,我们可以对数据源代码进行编辑,得到我们想要的报表。
水晶报表具有非常强大的功能,还可进行导出WORD、EXCEL、RTF等文件,还可生成复杂、漂亮图表,是进行WEB和WINDOWS报表开发的利器
ETL工具
1 datastage都有哪些控件
Transformer Stage 在 DataStage 中是一个重要的,功能强大的组件,在 ETL 过程中,它承担“T”( Transformer即数据的转化 ) 的责任。
Transformer Stage 在 DataStage job 中可实现的功能
1. 字段转换
2. 字段逻辑运算及判断
3. 数据复制
4. 数据过滤
5. 字段关联
2什么是Hash Join
Hash join散列连接是CBO 做大数据集连接时的常用方式,优化器使用两个表中较小的表(通常是小一点的那个表或数据源)利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描较大的表,同样对JOIN KEY进行HASH后探测散列表,找出与散列表匹配的行。
使用情况:
Hash join在两个表的数据量差别很大的时候.
3 Hash Join和Merge的优缺点
HASH JOIN和SORT MERGE JOIN 是SQL在做多表联合查询的时候,执行计划中的关联方式,多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪种类型的连接
取决于当前的优化器模式 (ALL_ROWS 和 RULE);
取决于表大小;
取决于连接列是否有索引;
取决于连接列是否排序;
HASH JOIN是散列连接,SORT MERGE JOIN是排序合并连接,Hash join在两个表的数据量差别很大的时候性能会比 MERGE 连接的性能好,但是如果源表中已经做了排序,那么用MERGE连接的性能会比 HASH JOIN 好。
4业务系统数据到数据仓库过程,数据怎么处理的?
ODS层如何抽数的。增量和全量
6 抽数频率是什么?有没有做实时抽数
我们抽数是动过调度工具来抽的,不同job的抽数频率不一样,有些T+1天抽取,有些是没2小时。
7 kettle抽取数据类型可以是其他格式的吗?比方说文本文档之类的也是有数据的,像excel,csv等等。
kettle抽数,可以使从数据库到数据库,比如mysql到oracle或者其他数据库到oralce目标库,也可以是数据文件 比如 excel 表格,csv表格,文本文件等 ,我之前在项目组的时候使用kettle抽数的时候遇到过 源系统是 mysql的,或者源数据是通过csv表格记录的,都可以通过kettle转换成目标库支持的数据类型。
8数据从源系统抽到ods层怎么处理
我们是通过kettle 这个ETL工具来实现的,主要是从不同的源系统中抽取数据,做数据清洗,把不同数据类型的数据转换成目标表的数据类型,然后通过调度工具每天跑数。
9 视图
视图:预定义的查询,作为表一样的查询使用,是一张虚拟表。
10 物化视图和视图图区别,怎么使用
普通视图和物化视图根本就不是一个东西,说区别都是硬拼到一起的,首先明白基本概念,普通视图是不存储任何数据的,他只有定义,在查询中是转换为对应的定义SQL去查询,而物化视图是将数据转换为一个表,实际存储着数据,这样查询数据,就不用关联一大堆表,如果表很大的话,会在临时表空间内做大量的操作。
11 什么叫物化视图,什么是查询重写?
物化视图,说白了,就是物理表,只不过这张表通过oracle的内部机制可以定期更新,将一些大的耗时的表连接用物化视图实现,会提高查询的效率。
物化视图是包括一个查询结果的数据库对象,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照(类似于MSSQL Server中的snapshot,静态快照)。对于复制,物化视图允许你在本地维护远程数据的副本,这些副本是只读的。如果你想修改本地副本,必须用高级复制的功能。当你想从一个表或视图中抽取数据时,你可以用从物化视图中抽取。对于数据仓库,创建的物化视图通常情况下是聚合视图,单一表聚合视图和连接视图。(这个是基于本地的基表或者视图的聚合)。
查询重写(Query Rewrite):Enable Query Rewrite和Disable Query Rewrite两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为Disable Query Rewrite。
函数与存储过程
1 Oracle常用函数有哪些?
聚合函数:SUM(),COUNT(),AVG(),MAX(),MIN()
日期函数: LAST_DAY(),ADD_MONTH()
字符函数: INSTR,SUBSTR,REPLACE,TRIM
分析函数: 函数() OVER (PARTITION BY ... ORDER BY...)
2 空值怎么转换?varchar与varchar2在转空值时的区别?
通过赋值函数进行转换 ,
varchar 是mysql数据库中字符串的数据类型 ,空值转换函数 ifnull( comm, 0 ) ;
-- 注意这里的 comm是拿我们emp表中的提成(comm),来举例,在工作中可以用我们需要的字段替换
varchar2 是oracle数据库中字符串的数据类型,控制转换函数 nvl( comm , 0);
3 三种排序函数的区别?
分析函数的三种排序。
①ROW_NUMBER:
ROW_NUMBER函数返回一个唯一的值,当碰到相同数据时,排名按照记录集中记录的顺序依次递增。
②DENSE_RANK:
DENSE_RANK函数返回一个唯一的值,当碰到相同数据时,此时所有相同数据的排名都是一样的。
③RANK:
RANK函数返回一个唯一的值,当碰到相同的数据时,此时所有相同数据的排名是一样的,
同时会在最后一条相同记录和下一条不同记录的排名之间空出排名。
4 聚合函数和分析函数有哪些?有哪些区别?
聚合函数:SUM(),COUNT(),AVG(),MAX(),MIN()
分析函数: 排序、移位和分组聚合运算
区别:聚合函数一般和GROUP BY配合使用,对于每个组只返回一行,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行。
5 RANK(),DENSE_RANK()与ROW_NUMBER()的区别:
同问题3
6 函数与存储过程的区别?
1.函数是用来进行数值计算的,存储过程是对表中数据进行逻辑加工的
2.函数一般是直接查询调用,而存储过程是在程序块中调用的
3.函数都是有返回值的,存储过程是可以不用返回任何结果的
7 函数与存储过程可不可以互相调用?
一般在存储过程会调用函数,函数不会去调用存储过程
8包是怎么用的
1.先要创建包头,然后创建包体
2.包可以把相关的存储过程、函数、变量、常量和游标等PL/SQL程序组合在一起
3.调用包里面的对象要加上包名
9 包、存储过程、函数之间的区别
1.包要创建包头,然后创建包体,存储过程和函数是直接创建
2.包中的函数和存储过程是属于包这个对象,而函数和存储过程是独立的对象
3.包中函数和存储过程的调用需要加水包名,而函数和存储过程则作为独立对象调用
10 存储过程中的异常有哪些解决方式 ?
在程序运行时出现的错误,称为异常。参考我们讲过的 ORA- 异常编码 或者 异常名
比如:
异常名称 异常码 描述
DUP_VAL_ON_INDEX ORA-00001 试图向唯一索引列插入重复值
异常发生时,进入异常处理部分,具体的异常与若干个WHEN子句中指明的异常名匹配,匹配成功就进入对应的异常处理部分,如果对应不成功,则进入OTHERS进行处理。
比如:
EXCEPTION -- 异常处理开始
WHEN 异常名1 THEN
--对应异常处理
WHEN 异常名2 THEN
--对应异常处理
……
WHEN OTHERS THEN
--其他异常处理
11 truncate 在存储过程中能直接用吗?
不能,要使用动态SQL , 在存储过程中的 BEGIN 和 AND 中间写:
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE EMP';
END;
12 存储过程有哪两种状态去同步数据到下一层
增量,全量
13 原表数据过亿了怎么建分区
可以通过2中方式进行分区,水平分区(Range(范围)) 比如按照时间,可以按年,也可以按天进行分区。将数据保存到不同的表空间中。
14 循环分区
就是通过循环的方式创建分区,可以用while循环或者 loop循环;
比如:oracle建表时按天分区的自动生成语句
DECLARE
V_SQL VARCHAR2(1000);
V_SQL_HEAD VARCHAR2(100);
V_SQL_TAIL VARCHAR2(10);
V_DAY VARCHAR2(8);
CURSOR C_CUR IS
SELECT TO_CHAR((TO_DATE('2012-01', 'yyyy-mm') + (ROWNUM - 1)),
'YYYYMMDD') S_DATE
FROM DUAL
CONNECT BY ROWNUM <= LAST_DAY(TO_DATE('2012-12', 'yyyy-mm')) -
TO_DATE('2012-01', 'yyyy-mm') + 1;
BEGIN
DBMS_OUTPUT.ENABLE(1000000);
OPEN C_CUR;
V_SQL_HEAD := 'PARTITION BY RANGE(ACCT_DAY)' || CHR(13) || '(';
V_SQL_TAIL := CHR(13) || ')';
DBMS_OUTPUT.PUT_LINE(V_SQL_HEAD);
LOOP
FETCH C_CUR
INTO V_DAY;
EXIT WHEN C_CUR%NOTFOUND;
V_SQL := 'PARTITION PART_' || V_DAY || ' ' || 'VALUES LESS THAN (''' ||
TO_CHAR((TO_DATE(V_DAY, 'YYYYMMDD') + 1), 'YYYYMMDD') || ''')';
DBMS_OUTPUT.PUT_LINE(V_SQL);
END LOOP;
DBMS_OUTPUT.PUT_LINE(V_SQL_TAIL);
CLOSE C_CUR;
END;
15 分区有几种?有什么区别?什么时候分区?
1.范围分区:RANGE
2.列表分区:LIST
3.散列(哈希)分区:HASH
4.组合分区(符合模式)
-- 水平分区的几种模式
* Range(范围) – 这种模式允许DBA将数据划分不同范围。例如DBA可以将一个表通过年份划分成三个分区,80年代(1980's)的数据,90年代(1990's)的数据以及任何在2000年(包括2000年)后的数据。
* Hash(哈希) – 这中模式允许DBA通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区,。例如DBA可以建立一个对表主键进行分区的表。
* List(预定义列表) – 这种模式允许系统通过DBA定义的列表的值所对应的行数据进行分割。例如:DBA建立了一个横跨三个分区的表,分别根据2004年2005年和2006年值所对应的数据。
* Composite(复合模式) - 其实是以上模式的组合使用而已,就不解释了。举例:在初始化已经进行了Range范围分区的表上,我们可以对其中一个分区再进行hash哈希分区。
缓慢变化
1 缓慢变化是什么
缓慢变化维:维度建模的数据仓库中,有一个概念叫Slowly Changing Dimensions,中文一般翻译成“缓慢变化维”,经常被简写为SCD。
2 缓慢变化维是怎么实现的
缓慢变化维的方法通常分为三种方式:
第一种方式是直接覆盖原值。这样处理,最容易实现,但是没有保留历史数据,无法分析历史变化信息。第一种方式通常简称为“TYPE 1”。
第二种方式是添加维度行。这样处理,需要代理键的支持。实现方式是当有维度属性发生变化时,生成一条新的维度记录,主键是新分配的代理键,通过自然键可以和原维度记录保持关联。第二种方式通常简称为“TYPE 2”。
第三种方式是添加属性列。这种处理的实现方式是对于需要分析历史信息的属性添加一列,来记录该属性变化前的值,而本属性字段使用TYPE 1来直接覆盖。这种方式的优点是可以同时分析当前及前一次变化的属性值,缺点是只保留了最后一次变化信息。第三种方式通常简称为“TYPE 3”。
在实际建模中,我们可以联合使用三种方式,也可以对一个维度表中的不同属性使用不同的方式,这些,都需要根据实际情况来决定,但目的都是一样的,就是能够支持方便的分析历史变化情况。
3 缓慢变化:哪些表适合,哪些表不适合,有没有明确界限?
拉链表是为了保留看历史数据,并且使存储最为节约。不需要保留历史记录的表一般不做拉链表。
拉链表的使用场景
在数据仓库的数据模型设计过程中,经常会遇到下面这种表的设计:
有一些表的数据量很大,比如一张用户表,大约10亿条记录,50个字段,这种表,即使使用ORC压缩,单张表的存储也会超过100G,在HDFS使用双备份或者三备份的话就更大一些。
表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等。
需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态。
表中的记录变化的比例和频率不是很大,比如,总共有10亿的用户,每天新增和发生变化的有200万左右,变化的比例占的很小。
4 拉链表的实现方式有哪几种?
实现拉链表的三种方式:
方案一:每天只留最新的一份,比如我们每天用Sqoop抽取最新的一份全量数据到Hive中。
方案二:每天保留一份全量的切片数据。
5 拉链表怎么更新的
方案一,每天drop掉前一天的数据,重新抽一份最新的。
优点:很明显,节省空间,一些普通的使用也很方便,不用在选择表的时候加一个时间分区什么的。
缺点:同样明显,没有历史数据,先翻翻旧账只能通过其它方式,比如从流水表里面抽。
方案二,每天一份全量的切片是一种比较稳妥的方案,而且历史数据也在。
缺点:就是存储空间占用量太大太大了,如果对这边表每天都保留一份全量,那么每次全量中会保存很多不变的信息,对存储是极大的浪费,这点我感触还是很深的......
当然我们也可以做一些取舍,比如只保留近一个月的数据?但是,需求是无耻的,数据的生命周期不是我们能完全左右的。
6 用过缓慢变化吗,结合具体例子说说你是怎么做缓慢变化的
比如我有100w用户,用户表记录了他们的状态,如果部分用户状态每天都有更新,我采用每天存全量用户数据的方式来记录历史和更新的状态,这样极大浪费存储空间,我用拉链表的话,每天把跟新用户的数据插入到用户表,这样既保留了历史数据,并且使存储最为节约
行列
1 行转列,oracle版本不支持函数写,用另外的方式
oracle 10G之前不支持行转列函数(pivot函数),可以用 case when 或者decode ,还可以通过查询然后 union 查询结果。
oracle 11G以后支持 行列互换 pivot 和 unpivot
2 举例一个有行转列的例子至少三种方法
方法一,用分析函数lead/lag
SELECT S.Y, S.AMT Q1, S.LD1 Q2, S.LD2 Q3, S.LD3 Q4
FROM (SELECT S.*,
LEAD(S.AMT, 1) OVER(PARTITION BY S.Y ORDER BY S.Q) LD1,
LEAD(S.AMT, 2) OVER(PARTITION BY S.Y ORDER BY S.Q) LD2,
LEAD(S.AMT, 3) OVER(PARTITION BY S.Y ORDER BY S.Q) LD3
FROM S) S
WHERE S.Q = 1
方法二,用DECODE
SELECT S.Y,
SUM(DECODE(S.Q, 1, AMT, NULL)) Q1,
SUM(DECODE(S.Q, 2, AMT, NULL)) Q2,
SUM(DECODE(S.Q, 3, AMT, NULL)) Q3,
SUM(DECODE(S.Q, 4, AMT, NULL)) Q4
FROM S
GROUP BY S.Y
方法三,部分关联(查询表中的部分数据,然后通过关联的方式查出结果)
SELECT S.Y, S.AMT Q1, A.AMT Q2, B.AMT Q3, C.AMT Q4
FROM S,
(SELECT * FROM S WHERE S.Q = 2) A,
(SELECT * FROM S WHERE S.Q = 3) B,
(SELECT * FROM S WHERE S.Q = 4) C
WHERE S.Y = A.Y
AND S.Y = B.Y
AND S.Y = C.Y
AND S.Q=1
方法四,UNION ALL
WITH A AS
(SELECT S.Y,
SUM(DECODE(S.Q, 1, AMT, NULL)) Q1,
SUM(DECODE(S.Q, 2, AMT, NULL)) Q2,
SUM(DECODE(S.Q, 3, AMT, NULL)) Q3,
SUM(DECODE(S.Q, 4, AMT, NULL)) Q4
FROM S
GROUP BY S.Y) --将结果集命名为A,把A行转列
SELECT A.Y, 1, A.Q1
FROM A
UNION ALL
SELECT A.Y, 2, A.Q2
FROM A
UNION ALL
SELECT A.Y, 3, A.Q3
FROM A
UNION ALL
SELECT A.Y, 4, A.Q4 FROM A
去重
1 工作数据去重的话distinct和group by的区别
直接去重 ,分组去重
2 一亿级表里面数据重复,重复字段列行都有,怎么去重
通过伪列 ROWID 进行删除重复记录去重。
DELETE FROM 表名 别名
WHERE ROWID NOT IN
(SELECT MIN(ROWID) FROM 表名 别名 GROUP BY 列名); --查出最小的ROWID
游标
1 游标是什么?
游标是指向查询结果集的一个指针,通过游标可以将查询结果集中的记录逐一取出,并在PL/SQL程序块中进行处理。
2 显式游标和隐式游标的区别以及优缺点
1.隐式游标一般是处理单行数据的时候使用,显式游标一般是处理多行数据集合时使用。
2.隐式游标不需要申明、打开和关闭,但是显式游标需要
优缺点:处理单行结果集,隐式游标比显式游标性能好;
隐式游标只能处理单行结果集,显式游标可以多行结果集数据。
3 游标怎么用的?隐式游标和显示游标区别是什么
1.隐式游标通过select into 对变量进行赋值(只能是单行值)
2.显示游标必须先申明,然后打开游标,遍历数据,最后关闭游标
优化
1 Oracle的关联查询执行原理?
多表连接的三种方式:
HASH JOIN:散列连接、优化器使用两个表中较小的表(通常是小一点的那个表或数据源)利用连接键(JOIN KEY)在内存中建立散列表,将列数据存储到hash列表中,然后扫描较大的表,同样对JOIN KEY进行HASH后探测散列表,找出与散列表匹配的行。
SORT MERGE JOIN:排序合并连接、 是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。
NESTED LOOP:嵌套循环连接 ,Nested loops 工作方式是循环从一张表中读取数据(驱动表outer table),然后访问另一张表(被查找表 inner table,通常有索引)。驱动表中的每一行与inner表中的相应记录JOIN。类似一个嵌套的循环。
2 程序跑得慢怎么知道是哪一块跑得慢
分段注释代码,进行验证,直到找出执行那段SQL耗时最长。
3 oracle优化是怎么做的?
SELECT子句中避免使用 ‘ * ‘
使用DECODE函数来减少处理时间
用TRUNCATE替代DELETE
尽量多使用COMMIT
用Where子句替换HAVING子句
使用表的别名
用EXISTS替代IN、用NOT EXISTS替代NOT IN
用索引提高效率,避免在索引列上使用NOT 通常,避免在索引列上做计算。
用>=替代>
用UNION替换OR (适用于索引列)
用IN来替换OR
避免在索引列上使用IS NULL和IS NOT NULL
用WHERE替代ORDER BY
优化GROUP BY,将不需要的记录在GROUP BY 之前过滤掉
4 INSERT /*+ append */ 调优性能为什么会好?有什么优缺点?
关于insert /*+ append */我们需要注意以下三点:
a、非归档模式下,只需append就能大量减少redo的产生;归档模式下,只有append+nologging才能大量减少redo。
b、insert /*+ append */ 时会对表加锁(排它锁),会阻塞表上的除了select以外所有DML语句;传统的DML在TM enqueue上使用模式3(row exclusive),其允许其他DML在相同的模式上获得TM enqueue。但是直接路径加载在TM enqueue使用模式6(exclusive),这使其他DML在直接路径加载期间将被阻塞。
c、insert /*+ append */ 直接路径加载,速度比常规加载方式快。因为是从HWM的位置开始插入,也许会造成空间浪费。
5程序跑得慢怎么知道是哪一块跑得慢
每个存储过程在进行数据同步时都会记录日志,日志中会记录数据同步的开始和结束时间,找到最慢的程序,然后一点点
6 数据量很大时候,你怎么优化,除开索引,表空间这样的?
同前一个性能优化的回答,不说索引和分区的
测试
1 项目怎么自测?
我会先检查语法吗,会不会报错,然后不带参数调用一下,看能不能正常调用,最后带数据跑一下,验证一下 数据同步的结果正不正确。
2 用什么工具自测的?测试报告有什么?
测试的时候用的是PLSQL工具来测试我们的代码,在包体里面创建的存储过程,直接在存储过程名称上右键选择 test .
测试报告 有我们版本信息,还有对应需求,以及我们开发的功能,比如创建的存储过程或者函数,测试会根据我们一起评审过的测试用例进行验证。
(一般验证的内容 包括 目标表的表结构,字段类型,长度,主键检查,索引,存储过程能否调用/存储过程中的取值字段是否正确,注释是否准确,是否会记录日志,函数计算结构是否正确等等)
3 怎样知道测试结果符合上线的要求?
我们都是根据需求来验证的,如果是计算的话 都有计算公式,我会自己先算一遍,然后通过调用函数对比计算结果。
如果是存储过程的话,我会根据需求中的取值逻辑和判断,验证一下取值是否正确。
日志
1 日志怎么用,怎么看报错信息
存储过程同步数据之前和同步完成之后,调用记录日志的存储过程,把存储过程执行的过程记录到日志表中,如果数据同步失败,那么exception返回的错误信息会记录到日志明细表中,我们通过查询日志表中报错信息的错误编码和报错信息定位问题。
2 日志的使用
通过存储过程实现。
索引
1索引的种类
唯一,组合,基于函数的索引,位图索引
2 为什么要建索引,有哪些索引,有哪些优缺点?
加快查询速度, 缺点,占用表空间,增删改时,需要更新索引
3 全表扫描和索引扫描的区别是什么?
为什么建了索引在单表扫描时还是走的全表扫描?
读取全表和部门数据的区别;提高效率;数据量少的时候,可以全表扫描
4 索引为什么会失效?
索引列有函数处理,隐式转换,组合索引,模糊查询,<> 、not in 、not exist、!=;对索引列进行运算包括(+,-,*,/,! 等)
5 位图索引什么时候用?
静态数据,值不经常变化的数据 性别,已婚未婚
6 你们项目中后台开发具体是怎么分配任务的(我说是按指标),你做的什么指标?说说你这个指标是怎么计算的?
注册转化率,客服转化率,收藏转化率,商品贡献率(毛利率=(毛利润/营业收入)),销售额,耗损,周转率
7 根据具体的项目给我具体描述一下存储过程
客户信息表,电话、地址拆分;性别补充;拆分另外一张表
8 一张500W的表同步过来数据变成了800W,分析哪里的问题
全量:表里原来就有数据,没有清空;增量的时候限定的时间有问题
9怎么用control-m来调度的
把依赖关系写在表中,给负责调度的人
10 数据迁移具体怎么操作的
通过工具kettle datestage,通过SQL存储过程;不同库,需要Dblink
11 什么是正则表达式
正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
12 元数据管理的方案和作用?
元数据的定义
数据仓库的元数据是关于数据仓库中数据的数据。它的作用类似于数据库管理系统的数据字典,保存了逻辑数据结构、文件、地址和索引等信息。广义上讲,在数据仓库中,元数据描述了数据仓库内数据的结构和建立方法的数据。
元数据是数据仓库管理系统的重要组成部分,元数据管理器是企业级数据仓库中的关键组件,贯穿数据仓库构建的整个过程,直接影响着数据仓库的构建、使用和维护。
13 MYSQL怎么获取行号
通过自定义变量rownum,表示行号。
select
@rownumber :=@rownum +1 as rownum, e.* from emp e, (select @rownum :=0 ) t
order by e.empno asc ;
14 项目中同比环比是怎么计算的
环比 = (本期 - 上期) / 上期
15 有两张很大的表关联,怎么做才能关联性能好
关联之前先过滤,再关联,
16 使用DS遇到的一些问题
1、从别的地方将SQL复制到DS控件里的时候,如果输入法不一致,中文会变成乱码
2、LOOKUP控件从表的数据量过大,内存不够的话,会导致报错
3、各个控件中相同字段的字段类型必须一致,否则会报错