1、什么是liunx系统的挂载?

1.1 概念

指的就是将设备文件中的顶级目录连接到 Linux 根目录下的某一目录(最好是空目录),访问此目录就等同于访问设备文件

1.2 说明

纠正一个误区,并不是根目录下任何一个目录都可以作为挂载点,由于挂载操作会使得原有目录中文件被隐藏,因此根目录以及系统原有目录都不要作为挂载点,会造成系统异常甚至崩溃,挂载点最好是新建的空目录。举个例子,我们想通过命令行访问某个 U 盘中的数据,图 1 所示为 U 盘文件目录结构和 Linux 系统中的文件目录结构。

image.png

图 1 中可以看到,目前 U 盘和 Linux 系统文件分属两个文件系统,还无法使用命令行找到 U 盘文件,需要将两个文件系统进行挂载。接下来,我们在根目录下新建一个目录 /sdb-u,通过挂载命令将 U 盘文件系统挂载到此目录,挂载效果如图 2 所示。

image.png

可以看到,U 盘文件系统已经成为 Linux 文件系统目录的一部分,此时访问 /sdb-u/ 就等同于访问 U 盘。前面讲过,根目录下的 /dev/ 目录文件负责所有的硬件设备文件,事实上,当 U 盘插入 Linux 后,系统也确实会给 U 盘分配一个目录文件(比如 sdb1),就位于 /dev/ 目录下(/dev/sdb1),但无法通过 /dev/sdb1/ 直接访问 U 盘数据,访问此目录只会提供给你此设备的一些基本信息(比如容量)。总之,Linux 系统使用任何硬件设备,都必须将设备文件与已有目录文件进行挂载。

1.3 挂载命令

  1. mount []

2、数据库的存储过程(orcle)

2.1 什么是存储过程

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来调用存储过程。 简单的说就是专门干一件事一段sql语句。 可以由数据库自己去调用,也可以由java程序去调用。 在oracle数据库中存储过程是procedure。

2.2 优点

1.效率高 存储过程编译一次后,就会存到数据库,每次调用时都直接执行。而普通的sql语句我们要保存到其他地方(例如:记事本 上),都要先分析编译才会执行。所以想对而言存储过程效率更高。 2.降低网络流量 存储过程编译好会放在数据库,我们在远程调用时,不会传输大量的字符串类型的sql语句。 3.复用性高 存储过程往往是针对一个特定的功能编写的,当再需要完成这个特定的功能时,可以再次调用该存储过程。 4.可维护性高 当功能要求发生小的变化时,修改之前的存储过程比较容易,花费精力少。 5.安全性高 完成某个特定功能的存储过程一般只有特定的用户可以使用,具有使用身份限制,更安全。

3、MySQL 中NULL和空值的区别?

3.1 占用空间

总结:空值(’’)的长度是0,是不占用空间的;而的NULL长度是NULL,其实它是占用空间的 理解:通俗的讲:空值就像是一个真空转态杯子,什么都没有,而NULL值就是一个装满空气的杯子,虽然看起来都是一样的,但是有着本质的区别。

3.2 插入和查询方式

总结:如果要单纯查NULL值列,则使用 is NULL去查,单纯去查空值(’’)列,则使用 =’’。 建议查询方式:NULL值查询使用is null/is not null查询,而空值(’’)可以使用=或者!=、<、>等算术运算符。

3.3 COUNT 和 IFNULL函数

总结:使用 COUNT(字段) 统计会过滤掉 NULL 值,但是不会过滤掉空值。 说明:IFNULL有两个参数。 如果第一个参数字段不是NULL,则返回第一个字段的值。 否则,IFNULL函数返回第二个参数的值(默认值)。

3.4 索引问题

总结 :在有NULL值得字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。在官网查看在空间索引的情况下,说明了 索引列必须为NOT NULL。

总结

1、空值不占空间,NULL值占空间。当字段不为NULL时,也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时,只能查出字段中没有不为NULL的或者为 NULL 的,不能查出空值。

3、判断NULL 用IS NULL 或者 is not null,SQL 语句函数中可以使用IFNULL()函数来进行处理,判断空字符用 =’‘或者<>’’来进行处理。

4、在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。

5、MySql中如果某一列中含有NULL,那么包含该列的索引就无效了。这一句不是很准确。

6:实际到底是使用NULL值还是空值(’’),根据实际业务来进行区分。个人建议在实际开发中如果没有特殊的业务场景,可以直接使用空值。 [

](https://blog.csdn.net/u010648555/article/details/94555199)

4、count(*)、Count(1)、Count(列名)的区别和执行效率比较


学习链接

5、 hive中的谓词优化

谓词下推

谓词下推的基本思想即:将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。 在SQL中,谓词就是返回boolean值即true或者false的函数,或是隐式转换为boolean的函数 。 SQL中的谓词主要有 LKIE、BETWEEN、IS NULL、IS NOT NULL、IN、EXISTS 将过滤表达式尽可能移动至靠近数据源的位置,以使真正执行时能直接跳过无关的数据。 在传统数据库的查询系统中谓词下推作为优化手段很早就出现了,谓词下推的目的就是通过将一些过滤条件尽可能的在最底层执行可以减少每一层交互的数据量,从而提升性能。

官网参考:https://cwiki.apache.org/confluence/display/Hive/OuterJoinBehaviorcbo参考:https://cwiki.apache.org/confluence/display/Hive/Cost-based+optimization+in+Hive

谓词下推:就是在join之前的 mr 任务的 map 阶段提前对表进行过滤优化,使得最后参与 join 的表的数据量更小

首先定义了join的四种类型的表:

1、Preserved Row table:
保留表,通俗地说就是
a left (outer) join b 中的 a 表;
a right (outer) join b 中的 b 表;
a full outer join b a 和 b 表都是 保留表。
2、Null Supplying table:
提供null值的表,也就是 非保留表,在join中如果不能匹配上的使用null填充的表
a left (outer) join b 中的 b 表;
a right (outer) join b 中的 a 表,
a full outer join b a 和 b 表都是 null值保留表
3、During Join predicate:
join中谓词,就是on后面的条件: R1 join R2 on R1.x = 5 —> R1.x = 5就是join中谓词
4、After Join predicate:
join后谓词,就是where后面的条件: a left join b where a.t=1 —> a.t=1 就是join后谓词

!!!测试时,关闭 cbo 优化:set hive.cbo.enable=false
==================================== Left outer Join & Right outer Join ===============================================

案例一:过滤条件写在 where, 且是 保留表的字段 —> 可以谓词下推(能在 map 阶段提前过滤)
explain
select o.id from bigtable b
left join bigtable o
where b.id <= 10;

案例二:过滤条件写在 where, 且是 非保留表的字段 —> 不可以谓词下推(能在 map 阶段提前过滤)
!!!注意: 关闭cbo去测 set hive.cbo.enable=false,如果开启了cbo,会自动优化成可以谓词下推;
explain
select b.id,o.id from bigtable b
left join bigtable o
where o.id <= 10;

案例三:过滤条件写在 on, 且是 保留表的字段 —> 不可以谓词下推(不能在 map 阶段提前过滤)
explain
select o.id from bigtable b
left join bigtable o
on b.id <= 10;

案例四:过滤条件写在 on, 且是 非保留表的字段 —> 可以谓词下推(能在 map 阶段提前过滤)
explain
select o.id from bigtable b
left join bigtable o
on o.id <= 10;

————————————————————————————————————————————————————-
总结:在关闭cbo的情况下:

  1. 保留表字段(left的左表) 非保留表字段 left的右表)<br />on 不可以 可以<br />where 可以 不可以(开启cbo,可以)

!!!注意:
1、对于 Left outer Join ,右侧的表写在 on后面、左侧的表写在 where后面,性能上有提高;
2、对于 Right outer Join,左侧的表写在 on后面、右侧的表写在 where后面,性能上有提高;

====================================== Full outer Join ====================================================

案例一:过滤条件写在 where, 且是 保留表的字段 —> 可以谓词下推(能在 map 阶段提前过滤)
explain
select o.id from bigtable b
full join bigtable o
where b.id <= 10;

案例二:过滤条件写在 where, 且是 非保留表的字段 —> 可以谓词下推(能在 map 阶段提前过滤)
explain
select b.id,o.id from bigtable b
full join bigtable o
where o.id <= 10;

案例三:过滤条件写在 on, 且是 保留表的字段 —> 不可以谓词下推(不能在 map 阶段提前过滤)
explain
select o.id from bigtable b
full join bigtable o
on b.id <= 10;

案例四:过滤条件写在 on, 且是 非保留表的字段 —> 不可以谓词下推(不能在 map 阶段提前过滤)
explain
select o.id from bigtable b
full join bigtable o
on o.id <= 10;

!!!总结: Full outer Join
如果不开启 cbo,写在 on后面,还是 where后面,都不会谓词下推
如果开启了 cbo,写在 where 可以 谓词下推, 写在 on 不可以 谓词下推


====================================== Inner Join ====================================================

案例一:过滤条件写在 where, 且是 保留表的字段 —> 可以谓词下推(能在 map 阶段提前过滤)
explain
select o.id from bigtable b
join bigtable o
where b.id <= 10;

案例二:过滤条件写在 where, 且是 非保留表的字段 —> 可以谓词下推(能在 map 阶段提前过滤)
explain
select b.id,o.id from bigtable b
join bigtable o
where o.id <= 10;

案例三:过滤条件写在 on, 且是 保留表的字段 —> 可以谓词下推(能在 map 阶段提前过滤)
explain
select o.id from bigtable b
join bigtable o
on b.id <= 10;

案例四:过滤条件写在 on, 且是 非保留表的字段 —> 可以谓词下推(能在 map 阶段提前过滤)
explain
select o.id from bigtable b
join bigtable o
on o.id <= 10;

!!!总结: Inner Join 不管有没有开启cbo,不管写在 on后面 还是 where后面,都会进行谓词下推

6、create table like 与 create table as select 区别

  1. CREATE TABLE A LIKE B

此种方式在将表B复制到A时候会将表B完整的字段结构和索引复制到表A中来。

  1. CREATE TABLE A AS SELECT x,x,x,xx FROM B LIMIT 0

此种方式只会将表B的字段结构复制到表A中来,但不会复制表B中的索引到表A中来。这种方式比较灵活可以在复制原表表结构的同时指定要复制哪些字段,并且自身复制表也可以根据需要增加字段结构。

注意:

两种方式在复制表的时候均不会复制权限对表的设置。比如说原本对表B做了权限设置,复制后,表A不具备类似于表B的权限。