未继续_android与腾讯云mysql数据库连接_windows

第一步

购买一个腾讯云服务

image-20211207215535055

然后初始化(请记住密码)

image-20211207221439709

开启外网地址(不然怎么连

image-20211207222027892

第二步,下载androidstudio

image-20211207215837466

第三步,下载对应数据库版本的jdbc,我的腾讯云是mysql8

jdbc位置是

MySQL :: MySQL Connectors

打开之后长这样,下载JDBC

image-20211207215936667

这儿选platform independent,然后点第二个下载

image-20211207220401699

解压之后能看到这个东西

image-20211207220521395

  1. 把上面那玩意引入android

首先在project底下的app文件夹的子目录找到libs文件夹,把那个jdbc的jar包拖进去

image-20211207221048176

如果没有,把左上角的这个调成ProjectFiles 看看,还没有就自己新建一个

image-20211207221113280

右键它,选择add as library

image-20211207221300723

21/12/7 存储管理-操作系统

存储管理

地址访问保护机制

  1. 上下界寄存器和地址检查机制

​ 作业拥有上下界,执行访存指令时,判断是否越界

​ 要求:作业程序是绝对地址静态可浮动

2. 基址寄存器、长度寄存器和动态地址转换机制

当作业被调度运行时,将作业所占内存基址及长度送基址、长度寄存器,在用户态每次执行访存指令时,先看访问地址是否小于长度,然后+基址进行访存。用户程序代码是动态浮动的

可变分区

思想:预先不划分内存,当作业需要时向系统申请,系统从其中挖出一块给该作业

Q:空闲区域如何管理?

多道连续可变分区法

特点:多道,连续,不固定划分内存
管理方法

系统设置一个空闲块队列,初始状态时队列中只有一个连续的空闲块。作业到达后,以某种策略分配空间。作业撤离时,将释放的空间加入空闲队列。

释放方法

相邻合并,否则插入

例一

进入执行顺序:(1,2,3)->(4)->(5)

image-20211112134311512

分配方法

  1. 首次满足法 从头到尾找,找到的第一个满足它的空间就给它
  2. 最佳满足法 从队列中找一个最接近的空闲队列给它
  3. 最大满足法 每次找最大的空间给最新创建的进程

可用空间管理

紧致机制–将已有的进程挪到一起,腾出大块的连续空间
可再定位式分区–浮动分区分配

页式存储管理

解决作业不连续存放的问题

特点: 作业 (进程) 分成页面,内存也划分成页面,将作业 **(进程 **) 页面不连续地分布到内存页面

image-20211112140406228

基本原理

image-20211112140441074

image-20211112141149243

分页逻辑地址 = P(页号).d( 页内位移 ** ) **

分页物理地址 = f(页帧号).d(同上)

P = 线性逻辑地址 / 页面大小;

d = 线性逻辑地址 **- P***页面大小。

为什么是2的k次幂?

将乘除法转成移位运算

为了取出一个数据,系统需要访问内存几次?–两次:1.取页表,2.取数据

快表

由一组联想寄存器(TLB, Translation Lookaside Buffer)组成。

联想寄存器:一种按内容进行并行查找的快速寄存器,访问速度比主存快得多

image-20211112142834494

使用bitmap数组/空闲页帧链管理可用页帧
共享

通过页表可以使几个逻辑空间指向同一个物理空间,实现程序共享。

越界保护

设置页表长度寄存器,查页表前,检查页号是否越界

访问保护

在每个页表项中增设一存储保护域,用于说明对该页的访问权限,每一个对该页存储的访问都首先要比照是否满足该页访问权限的说明,满足则访问,否则报异常。

Ø优点

ü没有外碎片,每个内碎片不超过页大小。

ü程序不必连续存放。

Ø主要缺点:

ü程序要一次全部装入内存才能执行。

ü采用动态地址变换机构会增加计算机的成本和降低处理机的速度。

ü各种数据结构(页表,空闲页表)要占用一定的内存空间,而且系统要花费一定的时间来建立和管理这些表格。

ü依然存在内碎片。

段式存储管理

特点:按作业的自然段将其逻辑空间分成若干段,作业以段为单位分配内存。

Ø用户作业逻辑空间为二维空间,由若干自然段组成。

Ø 逻辑地址:段号段内偏移,记作S,d。编译及装配时把所有地址记成(S,d)的形式。

Ø 物理内存空间管理:与多道可变划分法一样,系统以段为单位分配物理内存。

image-20211112144254340

image-20211112144844677

段页式管理

特点:将作业分成若干段,每段用页式管理实现内存分配

为了获得一条指令或者数据,需要访问内存几次?–3次,段表,页表,数据

内存扩充技术

借助大容量的辅存实现内存的扩充

覆盖技术

将用户空间划分成一个固定区和多个覆盖区。主程序放固定区,依次调用的子程序则放在同一个覆盖区。****操作系统提供覆盖系统调用函数,由用户编程序显式调用

相当于时间换空间

交换技术

将处于等待状态(等I/O结束)或就绪(等CPU)状态的作业从主存换出到辅存,把将要执行的进程移入主存。

优点:

提高并发性

缺点:

换入换出增加处理机开销

程序换入时存在重定位问题

和覆盖技术对比

image-20211116081410386

虚拟存储技术

基础

程序中不是每一条指令都会在程序的一次运行过程中执行到。
错误处理子程序
条件语句(if…else…)
程序中有的指令可能只执行一次
程序的初始化部分
程序执行的局部性原理:在一段时间内,作业一般不会执行到所有程序的指令,也不会存取绝大部分数据,执行的代码和要存取的数据往往集中在某些区域中(例如一个循环、一个数组)。

目的:提供用户进程一个巨大的虚拟存储空间
手段:利用外存(磁盘)实现此虚空间。

基本思想

系统为进程提供一个比物理内存大得多的虚拟存储空间,虚拟空间大小不受物理内存大小的限制。

虚拟空间的容量由系统的有效地址长度决定。假设地址长度为32,按字节寻址,则虚拟存储空间大小为$2^{32}$个字节。

原理

在程序装入时,不必一次将其全部读入到内存,而只需将当前需要执行的某些区域读入到内存,然后程序开始执行。在程序执行过程中,如果需执行的指令或访问的数据尚未在内存,则由处理器通知操作系统将相应的区域调入内存,然后继续执行。

分类

虚拟页式
页表增加外存标识位和外存地址项

当内存中没有空闲页面时,如果还要调入一个新页,如何处理?

​ 淘汰掉一个内存中的页(淘汰策略)

交换区

用来回写数据初始值和初值为0的工作区

页表项结构

image-20211116083233571

合法位:置上表示该页在内存。
修改位:置上表示该页被修改过,在释放或淘汰时应写
回外存。
页类型:零页时:表示该页在分配物理页帧时应清0页帧
空间;回写swap区页时:表示回写swap区。
保护码:R、W、E保护说明。
外存块号:该页所在外存的块号。
页 帧 号:当合法位置上时代表该页所在内存的页帧号。

缺页处理

根据发生页故障的虚地址得到页表项;
申请一个可用的页帧(根据所采用的替换策略可能需要引起淘汰某一页);
检查页类型,若为零页,则将页帧清0,将页帧号填入页表项的页帧号一栏,置合法位为1。若非零页,则调用I/O子系统将外存块号所指的数据读到可用页帧,将页帧号填入页表项中,合法位置1,结束。

页淘汰

查P页表项的修改位,若未修改,则清0合法位,将页帧送回空闲页帧队列。
若已修改,则检查类型栏。
若是零页或回写swap区页(代表还没有分配交换区空间),则申请一块swap区空间,将P的外存块号置上并清除页类型。
调用I/0子系统将页帧上的数据写到外存块号所指的外存空间。清0合法位,将页帧送回空闲页帧队列。

页面置换策略

出发点: 把未来不再使用的或者短时期内较少使用的页面调出

基本概念

驻留集:进程的合法页集合
访问串:进程访问虚拟空间的地址踪迹

举例:某进程依次访问如下地址,0100,0432,0101,0612,0102,0103,…
页式虚存管理以页为基本单位,只需页号即可。设页面大小为100,上述访问串可简化为1,4,1,6,1,1,…

驻留集大小固定的局部置换策略

FIFO(先进先出)

替换最早进入的页

效果奇差

Belady奇异 指置换策略不满足随着驻留集的增大,页故障数一定减少的规律。

OPT(最佳算法)

需要预先知道整个访问串的序列(因此不可实现)

理论最优

LRU(最近最少使用)

淘汰上次使用距当前最远的页

栈算法

LRU策略中,当驻留集大小为m时,S(m,t)中保持着最近使用过的m个页帧;当驻留集大小为m+1时,S(m+1,t)中保持着最近使用过的m+1个页帧。故S(m,t)属于 S(m+1,t),LRU策略是栈算法。

CLOCK

基于LRU的思想
硬件在页面被访问时设置页表项中的访问位
随着表针的移动,淘汰访问位是0的页面,或清除页面的访问位。
实用的页面置换算法

NRU(最近未使用)

为页帧在页表项中增加一位使用位,硬件每访存一次即将对应页的使用位置1,操作系统页面管理程序定时将所有使用位清0。淘汰时任选一个使用位为0(表示OS清0周期内没被使用过)的页。
操作系统选择淘汰页时,尽量避免选被修改过的页。因此,选择淘汰页次序:

驻留集大小可变的全局置换策略

WS

若驻留集中某页有$\triangle$个访问间隔没被访问则将其淘汰(正是因为这个特性,才是动态的)

实现:

每一页面设一计数器,每访存一次,将所有其他页计数器+1,所访存的计数器清零,淘汰计数器等于$\triangle$的页面

实际上:开销太大,没有用
SWS

定时检查计时器,淘汰计时器值大于等于$\triangle$的页面(当前时钟值-页表时钟值)>$\triangle$的页面)

硬件消耗还是很大

置换策略选择

动态驻留集sws+淘汰页数据延迟清除

设立两个队列:自由链表和修改链表。
定时做页淘汰(SWS):淘汰时不立即抹去页中数据,根据页面修改否挂入自由链/修改链,修改链过长或自由链过短时,回写页面后改挂到自由链中。
若paging in要用空页时,选自由链的第一页帧,这时页中数据被覆盖。
若在自由链/修改链中的页面再次被访问时,则将该页从链中摘除,使该页又能通过页表项访问到。

1
2
3
 某计算机采用二级页表的分页存储管理方式,按字节编址,页大小为2^10 字节,页表项大小为2字节,逻辑地址结构为:

逻辑地址空间大小为2^16页,则表示整个逻辑地址空间的页目录表中包含表项的个数至少是: ?

image-20211119140231647

逻辑空间: 2^16 *2^10 =2^26

页大小为2^10 页表项大小为2,则一页能写2^9 个页表项

共2^16逻辑页,故需要 2^7页

21/12/7 设备管理

设备管理

1. 控制器

控制器的任务是在外设与内存之间完成比特流与字节块之间的转换

1.1寄存器

每个控制器有几个寄存器,操作系统可以往里写东西

1.2数据缓冲区

有些控制器上有,用于大数据传输

1.2.1磁盘控制器

将位流组装为字节存入缓冲区中,形成字节为单位的块

2.控制方式

2.1 程序直接控制

cpu控制全过程

效率低下(CPU一直在等)

2.2中断控制

cpu发送指令,去干别的,等io设备准备好,利用中断通知cpu

2.3 DMA方式(适合高速大量的外设)

cpu启动指令->DMA控制器->(data)->启动外设

整个数据的传输都是在DMA控制下进行的

2.4通道控制方式

cpu连接多个通道,通道连接多个控制器,再连接外部设备

imgtest

3.设备I/o子系统

申请设备

将数据写入设备

从设备读取数据

释放设备

分时式共享使用设备

以一次IO为单位分时使用设备

SPOOLING方式使用外设

利用磁盘上的输入输出并模拟高速外设

IO的组成

I.O交通管制程序

调度程序

设备处理程序

基本思想:分层构建,较低层为较高层服务,使较高层独立于硬件,为用户提供统一接口

I/O设计目标

设备独立性–使软硬件相对独立,给上层软件更好的可移植性

设备统一命名-每种设备都是有名称的,如何命名以方便系统管理和用户使用是一个重要的问题

采取预先设计的,统一的逻辑名称

出错处理:数据尽可能在接近硬件层处理,仅当低层无能为力时,才将错误上交

缓冲技术:设法使数据的到达率和离去率匹配,提高系统的吞吐量

设备的分配:共享设备和独占设备的分配问题

文件系统-操作系统

文件系统

文件管理

文件系统的功能

支持文件所占存储介质空间的分配/回收
支持文件相对起始数据的逻辑块定位到外存上的物理块
支持对文件访问的安全检查
支持对文件的读写访问

文件的结构

逻辑结构(文件组织):

用户看到的文件组织形式,和存储:设备无关

有结构的记录式文件:由一个以上的记录构成

无结构的流式文件:文件没有结构,由一串字符流构成

物理结构:

外存上存放形式,和存储设备特性有很大关系

文件存储器物理特性:

磁带

顺序访问设备→要求文件顺序存放于带上。

磁盘

直接(随机)访问设备→文件可顺序、链接式或随机(通过类似页表的索引结构访问)存放于设备上

文件系统重要作用(之一)

在用户逻辑文件和物理文件之间建立映射

文件存取方式

读写文件存储器上的一个物理块的方法

顺序存取:指对文件中的信息按顺序依次读写

随机存取法:

**直接存取法:允许用户随意存取文件中任意一个物理记录**

**按键存取法:根据文件中各记录的某个数据项内容来存取记录的,这种数据项称之为键**

几种常见的物理存储方式

1. 连续存储(顺序结构)

它将逻辑上连续的文件信息依次存放在编号连续的物理块上。

l优点:

存储方式简单。

对文件记录进行批量存取时,其存取效率较高。

支持定长记录的直接存取,可以通过计算获得存储位置。

l缺点:

不支持随机查找。如果要随机地查找或修改单个记录,此时系统需要逐个地查找诸记录,性能较差,尤其是当文件较大时情况将更为严重。

存在外部碎片。

不便于记录的增加或删除操作。

  1. 链接结构

    将逻辑上连续的文件信息存放在不连续的物理块上,每个物理块设有一个指针指向下一个物理块。

    l优点:

    提高了磁盘空间利用率,不存在外部碎片问题。

    有利于文件插入和删除,及其动态扩充。

    l缺点:

    仍然不支持随机查找。

    由于存储空间可能不连续,带来更多的寻道次数和寻道时间。

    需要牺牲一些空间存放链接指针,同时需要维护这些指针,增加了系统开销。

    可靠性问题,如指针出错。

  2. 索引结构
    将逻辑上连续的文件信息(记录)存放在不连续的物理块中,系统为每个文件建立一个专用数据结构——索引表,索引表中存放文件的逻辑块号和物理块号的对应关系

    1. 优点:
      既能顺序存取,又能直接存取。
      满足了文件动态增长、插入删除的要求。
      没有外碎片,外存空间利用率较高。
      缺点
      较多的寻道次数和寻道时间。
      索引表本身需要存储空间,同时对索引表的维护会增加系统开销。
    2. 索引表组织方式
      1. 链接文件方式:将多个索引表块按链接文件的方式串联起来
      2. 多重索引方式:将一个大文件的所有索引表(二级索引)的地址放在另一个索引表(一级索引)中。
        1. 多重索引优势
          1. 寻址空间较大,相比于链接文件,会大大减少读取对应物理块所需要的读盘次数(因为要从文件中读取索引项)

文件的目录

OS观点:文件包含文件控制块和文件体

文件控制块(FCB)的主要内容:

  • 文件名
    创建者
    文件物理位置信息:如索引表
    创建、修改时间、保存时间
    口令:用于对文件访问进行验证
    操作限制:如读、写、执行权限说明

文件目录提供的功能:

  • 实现“按名存取”。用户只须提供文件名,即可对文件进行存取。这是文件系统向用户提供的最基本的服务。
    提高对目录的检索速度。合理地组织目录结构,加快对目录的检索速度,从而加快对文件的存取速度。这是在设计一个大、中型文件系统时,所追求的主要目标。
    实现文件共享。在多用户系统中,应允许多个用户共享一个文件,以节省大量的存储空间并方便用户。
    解决文件重名问题。系统应允许不同用户对不同文件采用相同的名字,以便于用户按照自己的习惯命名和使用文件。

文件目录结构

l一级目录结构
  • 为外存上的全部文件设立一张平面(flat)的目录表,包含所有文件的FCB。每建立一个新文件即在目录中增加一个FCB,每当删除一个文件即抹去对应的FCB,当要访问一个文件时,先按文件名在目录中找到对应的文件FCB。
    为了快速查找到文件FCB,可按文件名进行Hash,或其它快速查找方式
  • 优点:简单
    缺点:
    1、查找速度慢
    2、不允许重名
    3、不便于实现文件共享
l二级目录结构
  • 设一个主目录MFD,为系统的每个用户设用户目录UFD,用户目录是用户所有文件FCB的集合,主目录中存放每个用户目录的用户目录名和UFD的索引表等(当我们把UFD看作是一个文件时,这个文件的内容是用户所有文件FCB集合,MFD中则包含每个UFD文件的FCB
  • 路径名
    将用户名与文件名连到一起组成路径名。例如:/songhong/test.c
多级目录——树形目录结构
  • 树状的多级目录结构
    任何一级目录中的FCB既可以描述次一级的子目录,又可以描述一个文件

  • 特点:

    • 利于文件分类,从文件路径名可看出文件类别。
      查找文件FCB耗费时间,要得到文件FCB,必须从根查起。
      唯一确定文件的路径名太长,故引入当前目录 概念,提供相对于当前目录的相对路径名可加速文件FCB的查找,进程控制块存有当前目录信息

  • 访问

  • 必须指出文件所在路径名:从根目录到该文件的路径上各级目录名的组合。也称为文件全名。
    例如:/usr/lib/man
    相对路径:设置一个“当前目录”(也叫“工作目录”),此时对于文件的查找是从当前目录中进行的。可以带来两点好处:
    用户使用更加方便
    检索效率更高

  • 优缺点

    l树形多级目录结构的优点

    提高了检索目录的速度。

    较好地解决了重名问题。

    l缺点

    不便于用户共享文件

无环图目录结构
当一个文件副本可以同时属于两个不同目录(类别)时,即同一个文件有二条路径名,或多条路径名时出现无环图目录结构。
特点:

方便文件共享,分类。
两个或多个FCB的一致性难保证,因此将FCB独立存放,引入带文件/目录名和FCB指针的目录项

image-20211130092527762

文件共享

    1. 指向同一个索引结点
  1. 符号链接

    1. 建立符号链文件,该文件内容为要访问文件的路径名

文件存储器空间布局与管理

空闲区表

image-20211203133204515

位示图

image-20211203133252860

image-20211203133418295

空闲块链

image-20211203134255752

image-20211203135715385

image-20211203140034820

21/12/6 Database 数据库的安全性

数据库的安全性

8.4 存取控制

用户权限定义和合法的权限检查机制一起组成了DBMS的安全子系统

常用存取控制方法

自主存取控制

灵活

同一用户对不同的数据对象有不同的…

授权粒度

授权的数据对象粒度

数据库,表,属性列,行…

  1. 实现–GRANT REVOKE
  2. 数据库角色
    在用户量较大的情况下引入
    定义:一组与数据库操作有关的角色
    可以为具有相同权限的用户创建一个角色
  3. 权限传播

强制存取控制

主体与客体
敏感度标记

DBMS为每个实例指派一个敏感度标记

敏感度分为若干级别(绝密..

主体的敏感度标记称为许可证级别

客体的称为密级

MAC机制就是通过对比主体的Label和客体的Label,最终确定主体是否能够存取客体

强制存取控制规则
  1. 读 主体许可证级别>=客体密级
  2. 写 主体的许可证级别=客体密级
  3. 修正规则*****
    1. waiting for write

权限,只有具有合法的许可证才能存取

每一个用户被授予某一个级别的许可证

对于任意一个对象,只有具有合法的许可证才能存取

8.5 视图机制

21/12/6 Database 数据库操作

数据库

select

from

where

group by

having

order by

insert

指定属性列–不包含的取空

不指定-不能省略任何属性

数据库完整性概述

9.1 数据库完整性概述

数据库完整性–数据的正确性,有效性,西安共性

列级约束

对属性的数据类型,等的定义

元祖约束

元组中各个属性之间的约束关系

实现完整性约束的方法

  1. 提供定义机制
  2. 提供检查方法
  3. 违约处理

9.4用户定义的完整性

9.5触发器

一类用户定义在关系数据表上的一类由事件驱动的特殊过程,用编程的方法实现复杂的业务规则

是一种特殊类型的存储过程

可用触发器完成很多数据库完整性保护的过程

  1. 复杂的业务规则
  2. 比较数据修改前后状态

SQL:CREATE TRIGER命令

事务

原子性:不可分割

一致性:事务执行结果必须从一个状态转换到另一个状态时保持一致,即若中间出现错误,则将所有操作撤销

事务应当具有ACID性质,
A是原子性(atomic):事务中包含的各项操作必须全部成功执行或者全部不执行。任何一项操作失败,将导致整个事务失败,其他已经执行的任务所作的数据操作都将被撤销,只有所有的操作全部成功,整个事务才算是成功完成。
C是一致性(consistent):保证了当事务结束后,系统状态是一致的。那么什么是一致的系统状态?例如,如果银行始终遵循着”银行账号必须保持正态平衡”的原则,那么银行系统的状态就是一致的。上面的转账例子中,在取钱的过程中,账户会出现负态平衡,在事务结束之后,系统又回到一致的状态。这样,系统的状态对于客户来说,始终是一致的。
I是隔离性(isolated):使得并发执行的事务,彼此无法看到对方的中间状态。保证了并发执行的事务顺序执行,而不会导致系统状态不一致。
D是持久性(durable):保证了事务完成后所作的改动都会被持久化,即使是发生灾难性的失败。可恢复性资源保存了一份事务日志,如果资源发生故障,可以通过日志来将数据重建起来。

事务应处在下列状态之一

活动状态

失败状态:意味着要回滚

中止状态:数据库已经回滚完毕,恢复到提交前状态

提交状态:当数据更改完全写入磁盘时,进入提交状态

10.3.1事务故障的恢复

1.反向扫描日文件日志,查找该事务的更新操作

2.对该事务的更新操作执行你操作

3.继续反向扫描,直到读到此事务的开始操作

10.3.2系统故障恢复

1.正向扫描日志文件,列出Redo队列,Undo队列

日志

<u>登记两条原则 </u>

<u>1.登记次序严格按并行事物执行顺序 </u>

<u>2.先写日志文件,后写数据库 </u>

21/12/6 Database 查询优化

查询优化

游标

目的-解决集合性操作语言与过程性操作语言的不匹配
原因:sql一条语句一般能产生或处理多条记录,而主语言一次只能存放一条记录
是什么:是系统为用户开设的一个数据缓冲区,存放sql语句的执行结果

用户可以用SQL语句逐一地从游标中获取记录,并赋给主变量

定义游标: 使用Declare语句

EXEC SQL DECLARE <> CURSOR……

打开游标–执行相应的select语句,吧所有满足查询条件的记录从指定表取到缓冲区中

EXEC SQL OPEN <游标名>

此时游标指针指向查询结果集中第一条记录之前

推动游标

使用FETCH语句

EXEC SQL FETCH [[NEXT]]….

指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理

要求:主变量与select语句中的目标列表达式具有一一对应关系

关闭游标

CLOSE语句

EXEC SQL CLOSE <游标名>

7.1查询处理过程

7.1.1 查询分析

对查询语句进行扫描,词法分析和语法分析

7.1.2查询检查

根据数据字典中的用户权限和完整性约束定义对用户的存取权限进行检查

检查通过后将SQL查询语句转换成等价的<u>关系代数表达式</u>

7.1.4查询优化

选择一个高效执行的查询处理策略

代数优化-关系代数表达式优化

物理优化-存取物理介质及…的优化

7.1.5查询执行

不用多言

7.2执行查询操作的基本算法

1. 选择操作

顺序扫描/二分查找/索引[散列]/复合选择

索引–提供元组指针,间接检索

B+树索引:同样是提供元组指针,同时支持顺序集中依次查找

如是 sdept=’cs’ and sae>20:则

算法一:分别查询,求交集

算法而:先找到第一个查询的指针,然后在第一个查询的指针基础上进行第二个查询

2.连接操作

连接操作是查询处理中最耗时的操作之一

[例2]

SELECT *

FROM Student,SC

WHERE Student.Sno=SC.Sno

[例2end]

  1. 嵌套循环法
    对外层循环的每一个元组,检测内层循环中的每一个元组,检查两个元组在连接属性上是否相等
    满足,即串接后作为结果输出
  2. 索引链接法
    在输出表上建立属性Sno的索引(如果原来没有)
    对student中每个元组,有Sno值通过Sc……..
  3. 排序合并法
    适合连接的诸表已经排好序的情况
    没排序则排序
    取Student表中第一个sno,然后依次找sc表中具有相同sno的元组
    扫到sno不相同的第一个sc元组时,返回Student扫描它的下一个元组
    之后循环
  4. 散列连接法
    把连接属性作为散列码,
    然后划分

3.投影操作

选取关系的某些列,从垂直的方向减小关系的大小

如果投影属性列包括了关系R的主键,则操作可言直接执行,操作结果将于R中元组个数相同

否则则需要消除重复元组

4.集合运算操作

并,查,交,笛卡尔积

并查缴类似排序合并法

笛卡尔积一般嵌套循环合并

7.3关系数据库系统的查询优化

分布式数据库:总代接=I/O代价+*****

7.3.2查询优化实例

假定学生-课程数据库中有1000个学生记录,10000个选课记录

其中选修二号课程的选课记录为50个

查询选修了2号课程的学生姓名

第一种情况
1.计算广义笛卡尔积

-把student和sc的每个元组连接起来的做法

2.做选择操作

依次读入连接后的元组,按照选择条件选取满足要求的记录

3.做投影操作

把第二步操作的结果在Sname上作投影输出,得到最终输出

第二种情况
1.计算自然连接
2.读取中间文件块,进行选择操作
3.投影输出
第三种情况
1.先对sc表进行选择运算
2.读取Student表,把读入的student元组和内存中收到sc元组做连接
3.把连接结果投影输出

假如SC表的Cno字段/Student表上的Sno有索引,可加快读取

有选择和连接操作时,先做选择操作–代数优化

选择操作算法有权标扫描和索引扫描两种,在第三种情况下,索引扫描效果好–物理优化

7.3.3 代数优化

关系代数表达式的等价变换规则

指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的

常用的等价变换规则

代数优化策略-通过对关系代数表达式的等价变化来提高查询效率

启发式规则
  1. 选择运算尽可能先做,最重要最基本的一条
  2. 把投影运算和选择运算同时进行
  3. 把投影同其前后的双目运算结合起来
  4. 把某些选择同在它前面要执行的笛卡尔积结合起来形成一个连接运算’
  5. 找出公共子表达式

代数优化算法

输入:一个查询树

输出:优化的查询树

物理优化

代数优化改变查询语句中操作的次序和组合,不涉及底层的存取路径

定义:选择高效合理的操作算法/存取路径

基于存取路径的优化

选择操作的启发式规则–

  1. 对于小关系,使用全表顺序扫描,即使有索引

  2. 对于大关系–

    1. 对于选择条件是主键=值的查询
      选择主键索引
    2. 对于选择条件是非主属性=值的查询,且选择列上有索引
      估算查询结果的元组书目–比例小(10%),索引,比例大-全表
    3. 选择条件是属性上的非等值查询或范围查询,且存在索引
      估算查询结果的元组书目–比例小(10%),索引,比例大-全表
    4. 对于用and连接的合取选择条件
      优先采用组合索引扫描….
    5. or连接
      一般全表

连接操作的启发式规则

  1. 两个比哦啊都已经按照连接属性排序
    排序合并法
  2. 一个表在连接属性上有索引
    索引连接法
  3. 都不是1,2,而其中一个表比较小
    散列连接法
  4. 可以选用嵌套循环阀,并选择较小的表作为外表
基于代价估算的优化
二者结合的优化

21/12/6 Database exp 8

  1. 分析系统功能

    1. ER图

      image-20211120140233739
    2. 关系模型

      1. 对象的属性描述

        客户(<u>客户编号</u>,电子邮箱,登录密码,身份证,联系方式,姓名)
        银行卡(<u>卡号</u>,类型,客户编号)
        理财产品(<u>理财产品编号</u>,理财年限,购买金额,产品名称,产品描述)
        基金(<u>基金编号</u>,基金名称,基金类型,风险等级,基金管理者,基金金额)
        保险(<u>保险编号</u>,保险名称,适用人群,保险项目,保险金额,保险年限)
        资产(<u>客户编号</u>,<u>资产编号</u>,状态,购买数量,收益,购买时间)
      2. 对象之间关系描述

        一个客户可以购买多种理财产品
        可以办理多张银行卡
        一个客户可以购买多种保险
        一个客户可以购买多种基金
        image-20211120145443968
  2. 物理设计与数据字典

    1. 表及其属性

      client(c_id,c_name,c_mail,c_id_card,c_phone,c_password)
      bank_card(b_id,b_type,b_c_id)
      property(p_id,p_c_id,p_i_id,p_status,p_amount,p_get_time,p_income,p_type)
      fund(f_name,f_id,f_type,f_amount,risk_level,f_manager)
      insurance(i_name,i_id,i_amount,i_person,i_year,i_project)
      f_product(fp_id,fp_name,fp_description,fp_amount,fp_year)
    2. 数据字典

      1. 表1-1 client表

        字段名称字段类型约束说明
        c_idINTEGERPRIMARY KEY客户编码
        c_nameVARCHAR(100)NOT NULL客户名称
        c_mailCHAR(30)UNIQUE客户邮箱
        c_id_cardCHAR(20)UNIQUE NOT NULL客户身份证
        c_phoneCHAR(20)UNIQUE NOT NULL客户手机号
        c_passwordCHAR(20)NOT NULL客户登录密码
      2. 表1-2bank_card表

        字段名称字段类型约束说明
        b_idINTEGERPRIMARY KEY银行卡号
        b_typeCHAR(20)NOT NULL银行卡类型
        b_c_idINTERGERNOT NULL
        FOREIGNKEY
        客户编号
      3. 表1-3 property资产表

        字段名称字段类型约束说明
        p_idINTEGERPRIMARY KEY资产编号
        p_c_idINTEGERNOT NULL
        FOREIGN KEY
        客户编号
        外键,对应client中的c_id
        p_i_idINTEGERNOT NULL
        FOREIGN KEY
        商品编号 ,对应三种产品的id
        p_statusCHAR(20)NOT NULL状态
        p_amountINTERGERNOT NULL购买数量
        p_get_timeDATENOT NULL购买时间
        p_incomeINTERGER收益
        p_typeINTERGERNOT NULL1代表是理财产品,2代表保险,3代表基金
      4. 表1-4 f_products 理财产品表

        字段名称字段类型约束说明
        fp_idINTEGERPRIMARY KEY理财产品编号
        fp_yearINTEGER理财年限
        fp_amountINTERGER购买金额
        fp_nameVARCHAR(200)NOT NULL产品名称
        fp_descriptionVARCHAR(2000)NOT NULL产品描述
      5. 表1-5 insurance 保险表

        字段名称字段类型约束说明
        i_idINTEGERPRIMARY KEY保险编号
        i_nameVARCHAR(100)NOT NULL保险名称
        i_personCHAR(30)适用人群
        i_projectVARCHAR(200)保险项目
        i_amountINTERGER保险金额
        i_yearCHAR(20)NOT NULL保险年限
      6. 表1-6 fund基金表

        字段名称字段类型约束说明
        f_idINTEGERPRIMARY KEY基金编号
        f_nameVARCHAR(100)NOT NULL基金名称
        f_typeCHAR(30)基金类型
        f_riskINTERGER风险等级
        f_managerINTERGERNOT NULL基金管理者
        f_amountINTERGERNOT NULL基金金额
  3. 创建数据库表

    1. 创建finance数据库作为项目数据库,数据库编码为UTF-8。(2分)

      1. 切换到omm用户
        image-20211120152854123
      2. 启动数据库服务
        image-20211120152924367
      3. 登入postres数据库(为了在里面创建新的数据库)
        image-20211120152949937
      4. 创建finance数据库,设置编码为UTF-8
        image-20211120153159839
    2. 连接finance数据库,创建名为finance的schema,并设置finance为当前的schema。(2分)

      1. 连接finance数据库
        image-20211120153222258
      2. 创建名为finance的schema,并设置finance为当前的schema
        image-20211120153259340
    3. 在finance模式下完成金融管理系统中所有数据库对象(数据表)的创建,并完成数据的填充。其中客户数据不少于20条,银行卡数据不少于10条,其他数据不少于5条;(6分)

      1. 数据表创建

        1. 客户表创建

          image-20211120162145657

          image-20211120162136314

        2. 银行卡表创建
          image-20211120161519458
          image-20211120161510470

        3. 理财产品表创建
          image-20211120161622995

          image-20211120161716375

        4. 保险信息表创建

          image-20211120161636166
          image-20211120161724463

        5. 基金信息表创建

          image-20211120161645388

          image-20211120161745238

        6. 资产信息表创建

          image-20211120161659959

          image-20211120161759138

      2. 添加数据

        1. 客户信息添加
          image-20211120163251246

        2. 银行卡数据填充
          image-20211120163727388

        3. 理财产品填充

          INSERT INTO finance.f_products

          (fp_id ,fp_year ,fp_amount ,fp_name ,fp_description ) VALUES

          (1 ,2 ,4000000 ,’储蓄’ ,’储蓄理财产品’ ),

          (2 ,1 ,3000 ,’债券’ ,’债券是政府、企业、银行等债务人为筹集资金,按照法定程序发行并向债权人承诺于指定日期还本付息的有价证券’),

          (3 ,1 ,200000 ,’股票’ ,’股份公司为筹集资金而发行给各个股东作为持股凭证并借以取得股息和红利的一种有价证券’),

          (4 ,3 ,2000 ,’国债’ ,’国家以其信用为基础,按照债的一般原则,通过向社会筹集资金所形成的债权债务关系’),

          (5 ,2 ,10000 ,’大宗商品’ ,’与大宗商品期货挂钩的理财产品。目前市场上主要以挂钩黄金、石油、农产品的理财产品居多’)image-20211120174858479

        4. 保险产品填充

          INSERT INTO finance.insurance(i_name,i_id,i_amount,i_person,i_year,i_project) VALUES

          (‘意外保险’,3,5000,’所有人’,20,’平安保险’),

          (‘医疗保险’,4,2000,’所有人’,20,’平安保险’),

          (‘健康保险’,1,2000,’老年人’,10,’平安保险’),

          (‘人寿保险’,2,3000,’老年人’,10,’平安保险’),

          (‘财产损失保险’,5,1500,’中年人’,3,’平安保险’);
          image-20211120175159475

        5. 基金表格填充

          INSERT INTO finance.fund (f_id,fp_name,f_type,f_risk,f_manager,f_amount) VALUES

          (1,’股票基金’,’股票型’,3,1,200000),

          (2,’债券基金’,’债券型’,2,2,3000),

          (3,’投资基金’,’债券型’,3,2,1000),

          (4,’国债’,’货币型’,1,4,2000),

          (5,’期货’,’期货型’,2,5,1500);

          image-20211120180449122

        6. 资产表格填充

          INSERT INTO finance.property

          (p_id , p_c_id ,p_i_id , p_status , p_amount ,p_get_time ,p_income ,p_type ) VALUES

          (1 ,1 ,1 ,’可用’ ,100 ,’2021-11-20’ ,2000 ,1 ),

          (2 ,1 ,2 ,’可用’ ,100 ,’2021-11-21’ ,3020 ,1 ),

          (3 ,1 ,1 ,’冻结’ ,100 ,’2021-11-20’ ,2000 ,2 ),

          (4 ,1 ,4 ,’可用’ ,101 ,’2021-11-10’ ,3000 ,3 ),

          (5 ,2 ,5 ,’可用’ ,100 ,’2021-11-20’ ,2000 ,2 )

          image-20211120181110730

    4. 对表添加外键约束,在银行信息表和资产信息表中,都存在每个银行卡必须有一个持卡者、每份资产必须都有一个资产拥有者这样的对应关系。因此针对这种对应关系,创建外键约束。(4分)

      添加外键约束

      1. 信用卡的外键
        ALTER TABLE finance.bank_card ADD CONSTRAINT fk_c_id FOREIGN KEY (b_c_id) REFERENCES finance.client(c_id) ON DELETE CASCADE;
        image-20211120182046151
      2. 资产的外键
        ALTER TABLE finance.property ADD CONSTRAINT fk_pro_c_id FOREIGN KEY (p_c_id) REFERENCES finance.client(c_id) ON DELETE CASCADE;
        image-20211120182231938
    5. 在理财产品表、保险信息表和基金信息表中,都存在金额这个属性,在现实生活中,金额不会存在负数。因此针对表中金额的属性,增加大于0的约束条件。(4分)

      增加大于0的约束

      1. f_products表
        ALTER table finance.f_products ADD CONSTRAINT c_p_mount CHECK (fp_amount >=0);
        image-20211120182747860

      2. fund表

        ALTER table finance.fund ADD CONSTRAINT c_f_mount CHECK (f_amount >=0);
        image-20211120182809449

      3. insurance表
        ALTER table finance.insurance ADD CONSTRAINT c_i_mount CHECK (i_amount >=0);
        image-20211120182806605

    6. 输出:

      1. 输出查询所有表的数据字典的查询语句和结果,可以截图或者复制黏贴代码。(基本都在之前有展示,这里对所有的表及schema进行了一次查询)
        select * from pg_tables;
        image-20211120183633861

      2. 输出查询所有表的数据的查询语句和结果,可以截图或者复制黏贴代码。

        1. client表
          select * from finance.client;

          image-20211120182955194

        2. bank_card表
          select * from finance.bank_card;
          image-20211120183115059

        3. fund表
          select * from finance.fund;
          image-20211120183213621

        4. f_products表
          select * from finance.f_products;
          image-20211120183232153

        5. insurance表
          select * from finance.insurance;
          image-20211120183242518

        6. property表
          select * from finance.property;
          image-20211120183254782

      3. 输出所有创建约束的语句和创建结果,可以截图或者复制黏贴代码(这在之前已经放上了)

  4. 对表中的数据进行查询操作

    1. l 至少完成1条单表查询和1条表查询。(4分)
      单表查询–查询客户表中所有的客户id

      select c_id from finance.client;
      image-20211120183930730

      表查询
      select c_name from finance.client;
      image-20211120191355193

    2. l 至少完成两条聚合查询,例如查询用户表中有多少个用户;查询保险信息表中,保险金额的平均值等。(4分)
      查询property表的income平均值
      select avg(p_income) from finance.property
      image-20211120191618236
      查询用户表中用户总数
      select count(*) from finance.client;
      image-20211120191822353

    3. l 至少完成3条连接查询,例如:半连接、反连接、多表查询和子查询。(6分)

      1. 等值连接查询,查询每个用户及其拥有的资产
        select finance.client.*,finance.property. *
        from finance.client,finance.property
        where finance.client.c_id=finance.property.p_c_id;
        image-20211120192143231
      2. 自身连接,在fund表中对每一个基金项,查询manager 和自身id相同的基金
        select first.*,second.f_manager
        from finance.fund first,finance.fund second
        where first.f_id = second.f_manager
        image-20211120192923196
      3. 子查询,查询和p_id=3的资产处于相同状态的资产(然后发现就它自己冻结着)
        select * from finance.property
        where p_status=
        (select p_status from finance.property where p_id=3);
        image-20211120193259515
    4. 至少完成1条ORDER BY查询。(2分)
      将资产按照收益逆序输出
      select * from finance.property order by p_income desc;
      image-20211120193418297

    5. 至少完成1条GROUP BY……HAVING查询。(4分)

    6. 查询收益在2000及以上的资产及其平均收益,将结果按p_id分组显示,且只显示平均收益大于2500的组
      select *,avg(p_income) from finance.property
      where p_income>=2000

      group by p_id
      having avg(p_income)>=2500;
      image-20211120194044403

    7. 查询基金,将其按f_id分组,且只显示平均数量大于等于2000的组
      select *,avg(f_amount) from finance.fund
      group by f_id
      having avg(f_amount)>=2000;
      image-20211120194430725

4.5 创建视图和索引

  1. 创建一个视图

    查看client中属性,除了c_mail属性
    create view see_client
    as
    select c_id,c_name,c_id_card,c_phone,c_password
    from finance.client
    image-20211120195705769

  2. 修改视图

    修改视图所属schema
    alter view see_client set schema finance;
    image-20211120202011203

  3. 使用视图进行查询
    image-20211120202005604

  4. 重命名视图
    alter view finance.see_client
    rename to oh_my_god;
    image-20211120202200841

  5. 删除视图
    image-20211120202227819

  6. 创建索引
    为客户电话号码创建索引
    CREATE INDEX index_phone on finance.client(c_phone) ;
    image-20211120202553719

  7. 重建索引
    对整个客户表重建索引
    image-20211120202715402

  8. 重命名索引
    alter index finance.index_phone rename to ind_phone;
    image-20211120202831047

  9. 删除索引
    image-20211120202849544

1.4.6 数据修改和删除(5分)

任务:

l 修改数据:至少修改2个不同的数据。(3分)

  1. 将client表中第1个元素的值c_name改为’年没怀念’
    之前的表
    image-20211120205008902
    修改语句:
    update finance.client
    set c_name=’年没怀念’
    where c_id=1;
    image-20211120205223012

    修改后表情况
    image-20211120205200129

  2. 将property中p_get_time小于2021-11-11 00:00:00的值修改为2021-11-19 00:00:00

    修改前状态
    image-20211120205546236
    修改
    update finance.property
    set p_get_time=’2021-11-19’
    where p_get_time<’2021-11-11’;
    image-20211120205628164
    修改后状态
    image-20211120205638384

l 删除指定数据:至少删除2个不同数据表的数据。(2分)

  1. 将finance.property中p_amount=101的数据删除

    删除前表情况

    image-20211120205638384

    删除
    delete from finance.property where p_amount=101;

    image-20211120210444230

    删除后表情况image-20211120210451058

  2. 删掉c_id>20的用户信息

    删除前表情况

    image-20211120210652108

    删除操作

    delete from finance.client where c_id>20;
    image-20211120210705838

    删除后表情况image-20211120210710547

1.4.7 创建新用户(6分)

任务:

  1. 新用户的创建和授权:创建用户dbuser,密码为Gauss#3demo;给用户dbuser授予finance数据库下银行卡信息表的查询和插入权限,并将finance模式的权限也授予dbuser用户。(3分)

    创建用户
    image-20211120210919044

    给用户dbuser授予finance数据库下银行卡信息表的查询和插入权限,并将finance模式的权限也授予dbuser用户
    image-20211120210938886

  2. 新用户连接数据库:使用新用户连接finance数据库;访问finance数据库的银行卡信息表。(2分)

    新用户连接

    image-20211120211203343
    新用户访问finance数据库的银行卡信息表

    image-20211120211232019

  3. 删除finance模式。(1分)
    image-20211120211528768

1.4.8 使用jdbc连接openGauss数据库

  1. 创建测试数据库demo;
    image-20211120211928291

  2. 创建名为demo的schema,并设置demo为当前的schema
    image-20211120211933670
    设置搜索路径为demo

    SET search_path TO demo;

  3. 创建测试表websites(id,name,url),数据为(’1’, ‘openGauss’, ‘https://opengauss.org/zh/'),(‘2’, ‘华为云’, ‘https://www.huaweicloud.com/'), (‘3’, ‘openEuler’, ‘https://openeuler.org/zh/'), (‘4’, ‘华为support中心’, ‘https://support.huaweicloud.com/')。(3分)
    create table websites
    (
    id Integer primary key,
    name varchar(200),
    url varchar(200)

    );
    image-20211120212236363
    插入数据

    INSERT INTO websites (id,name,url) VALUES

    (‘1’, ‘openGauss’, ‘https://opengauss.org/zh/'),

    (‘2’, ‘华为云’, ‘https://www.huaweicloud.com/'),

    (‘3’, ‘openEuler’, ‘https://openeuler.org/zh/'),

    (‘4’, ‘华为support中心’, ‘https://support.huaweicloud.com/')

    image-20211120212401022

  4. 查看入站规则是否包括tcp26000端口
    image-20211120213457003

  5. 查看java版本是否为8
    image-20211120213634213

  6. 创建项目,引入postgres.jar包
    image-20211206104756935

  7. 写下测试程序如下
    image-20211206104819179
    image-20211206104832554

  8. 结果
    image-20211206104851481

本实验完成