数据库实习总结1-3

数据库实习1-3
一. 堆组织表和索引组织表的理解
堆表(heap table)数据插入时时存储位置是随机的,主要是数据库内部块的空闲情况决定,获取数据是按照命中率计算,全表扫表时不见得先插入的数据先查到。索引表(iot)数据存储是把表按照索引的方式存储的,数据是有序的,数据的位置是预先定好的,与插入的顺序没有关系。索引表的查询效率比堆表高(相当于查询索引的效率),插入数据的速度比堆表慢。
索引表适用场景:
适用于信息检索、空间和OLAP程序。
1、 代码查找表。
2、 经常通过主码访问的表。
3、 构建自己的索引结构。
4、 加强数据的共同定位,要数据按特定顺序物理存储。
5、 经常用between…and…对主码或唯一码进行查询。数据物理上分类查询。如一张订单表,按日期装载数据,想查单个客户不同时期的订货和统计情况。
二. 常见sql语句练习
A. 用sql语句创建数据库(昨天是用了工具)
创建一个名为foods的数据库
下图为sql语句
数据库实习总结1-3_第1张图片
注意:初始文件大小最少为4mb(一开始3mb时有提示)
在这里插入图片描述
刷新后,数据库中有了foods数据库
在这里插入图片描述
而物理地址下也有相应的文件
数据库实习总结1-3_第2张图片
B. 删除数据库
DROP DATABASE 数据库名
C. 创建表(用sql语句,昨天用的工具)
创建好数据库以后,我们需要先把数据库打开(有人也叫选中数据库)
打开数据库语法: use 数据库名(服务器内的名称)
use foods
创建一个食品信息表foodsinfo,sql语句如下
数据库实习总结1-3_第3张图片
可以看到有食品信息表foodsinfo
数据库实习总结1-3_第4张图片
D. 查询Table_test1中所有数据
数据库实习总结1-3_第5张图片
E. 往foodsinfo中插入数据
1.insert into 表名values(数据1,数据2,数据3,数据4,数据5)
使用限制:插入的是表中的全部列时才可以使用
在这里插入图片描述
2.(插入部分数据)insert into 表名(列名1,列名2) values (数据1,数据2)
使用限制:主键和非空约束列必须添加数据
数据库实习总结1-3_第6张图片
F. 查询数据(带条件)
数据库实习总结1-3_第7张图片
G. 数据库中数据的修改
1.修改一个数据
语法: update 表名 set 列名=新数据 where 查询条件
数据库实习总结1-3_第8张图片
2.修改一行数据
语法: update 表名 set 列名1=新数据1,列名2=新数据2列名3=新数据3, where 查询条件
同上边类似
H. 表中数据的删除
delete from 表名where 查询条件;
数据库实习总结1-3_第9张图片

三. 常见的执行语句及执行计划理解
1.查看执行计划(SQL Server的执行计划是从右向左看的)
A. 选中数据库test1,点击新建查询
数据库实习总结1-3_第10张图片
B. 弹出了一个新建查询的窗口的界面中,输入需要执行的sql的语句
在这里插入图片描述
C. 然后进行点击菜单中的查询的按钮选项,可以弹出下拉菜单中,进行选择为显示估计的执行计划
数据库实习总结1-3_第11张图片
D. 在执行窗口的界面中查看的执行计划执行的内容了
数据库实习总结1-3_第12张图片
2.执行计划理解
先在原有的foodsinfo表中,插入200条数据
数据库实习总结1-3_第13张图片
上述表暂时没有索引
A. 数据访问操作
1.表扫描与聚集索引扫描比较
表扫描:发生于堆表,并且没有可用的索引可用时,会发生表扫描,表示整个表扫描一次。
聚集索引扫描:发生于聚集表,也相当于全表扫描操作,但在针对聚集列的条件如(WHERE Id > 10)等操作时,效率会较好
数据库实习总结1-3_第14张图片
上下比较发现,上面有聚集索引,加了聚集索引之后,表就由堆表变成了聚集表
数据库实习总结1-3_第15张图片

  1. 表扫描,聚集索引扫描与非聚集索引扫描比较
    索引扫描:整体扫描非聚集索引。
    1 创建非聚集索引,并且查询比较执行计划
    数据库实习总结1-3_第16张图片
    此时查询语句如下:select fnum from foodsinfo
    数据库实习总结1-3_第17张图片
    2.此非聚集索引扫描能够覆盖所需要的数据。如果非聚集索引不能覆盖呢?例如,我们将SELECT改为SELECT *再来看看
    Select * from foodsinfo
    数据库实习总结1-3_第18张图片
    好明显,返回结果所包括的记录太多,用非聚集索引反而不合算。因此使用了聚集索引扫描。
    3.此时删除聚集索引,在执行select *如下(已没有聚集索引,如下)
    在这里插入图片描述
    没有聚集索引,下图为表扫描
    数据库实习总结1-3_第19张图片
    3.书签查找
    fnum列有非聚集索引
    首先通过非聚集索引找到所求的行,但这个索引并不包含所有的列,因此还要额外去基本表中找到这些列,因此要进行键查找,如果基本表是以堆进行组织的,那么这个键查找(Key Lookup)就会变成RID查找(RID Lookup),键查找和RID查找统称为书签查找。不过有时当非聚集索引返回的行数过多时,SQL Server可能会选择直接进行聚集索引扫描了。
    B. 流聚合操作
    1 流聚合:在相应排序的流中,计算多组行的汇总值。
    所有的聚合函数(如COUNT(),MAX())都会有流聚合的出现,但是其不会消耗IO,只有消耗CPU。
    数据库实习总结1-3_第20张图片
    2.计算标量
      计算标量:根据行中的现有值计算新值。比如COUNT()函数,多一行,行数就加1。
      除MIN和MAX函数之外的聚合函数都要求流聚合操作后面跟一个计算标量。
    数据库实习总结1-3_第21张图片
    3.散列聚合(哈希匹配)
      对于加了Group by的子句,因为需要数据按照group by 后面的列有序,就需要Sort来保证排序。注意,Sort操作是占用内存的操作,当内存不足时还会去占用tempdb。SQL Server总是会在Sort操作和散列匹配中选择成本最低的。
    数据库实习总结1-3_第22张图片
    4.排序
    当数据量比价少时,例如执行以下语句,新建一个只有数十条记录的与foodsinfo一样的表。
     数据库实习总结1-3_第23张图片
    C. 连接
    当多表连接时(包括书签查找,索引之间的连接),SQL Server会采用三类不同的连接方式:循环嵌套连接,合并连接,散列连接。这几种连接格式有适合自己的场景,不存在哪个更好的说法。
    把数据库中两张表连接如下:
    1 嵌套循环
    数据库实习总结1-3_第24张图片
    循环嵌套连接的图标同样十分形象,处在上面的外部输入(Outer input),这里也就是表扫描。和处在下面的内部输入(Inner Input),这里也就是聚集索引查找。外部输入仅仅执行一次,根据外部输入满足Join条件的每一行,对内部输入进行查找
    根据嵌套循环的原理不难看出,由于外部输入是扫描,内部输入是查找,当两个Join的表外部输入结果集比较小,而内部输入所查找的表非常大时,查询优化器更倾向于选择循环嵌套方式。
    2.合并连接
    不同于循环嵌套的是,合并连接是从每个表仅仅执行一次访问。从这个原理来看,合并连接要比循环嵌套要快了不少。
    从合并连接的原理不难想象,首先合并连接需要双方有序.并且要求Join的条件为等于号。因为两个输入条件已经有序,所以从每一个输入集合中取一行进行比较,相等的返回,不相等的舍弃,从这里也不难看出Merge join为什么只允许Join后面是等于号。
    数据库实习总结1-3_第25张图片
    3 哈希连接
    散列连接同样仅仅只需要只访问1次双方的数据。散列连接通过在内存中建立散列表实现。这比较消耗内存,如果内存不足还会占用tempdb。但并不像合并连接那样需要双方有序。
    要进行下面这两个实现,得把两个列的聚集索引不要建在ColumnId列,否则不会采用哈希连接。
    先删除聚集索引,给fname设置聚集索引
    数据库实习总结1-3_第26张图片
    在这里插入图片描述
    之后查询如下

数据库实习总结1-3_第27张图片

你可能感兴趣的:(实习记录)