免费智能真题库 > 历年试卷 > 系统分析师 > 2023年上半年 系统分析师 上午试卷 综合知识
  第44题      
  知识点:   数据操作   数据库性能
  章/节:   数据库系统       

 
在关系 R(A1, A2, A3)和 S(A1, A2, A3)上进行关系运算的 4 个等价的表达式E1、E2、E3 和 E4 如下所示:

如果严格按照表达式运算顺序,则查询效率最高的是( ),将该查询转换价的SQL 语句为: SELECT A1, A4 FROM R,S WHERE( )。
 
 
  A.  R.A2 <2022' OR S.A4 <95'
 
  B.  R.A2 <'2022' AND S. A4 <95'
 
  C.  R.A2 <'2022' OR S.A4 <95' OR R.A3=S.A3
 
  D.  R.A2 <2022 AND S.A4 <95' AND R.A3=S.A3
 
 
 

 
  第45题    2013年上半年  
   70%
给定关系模式科室K (科室号,科室名,负责人,科室电话)、医生Y (医生号,医生名,性别,科室号,联系电话,家庭地址)和患者B (..
  第41题    2016年上半年  
   77%
分布式事务的执行可能会涉及到多个站点上的数据操作,在两阶段提交协议中,当事务Ti的所有读写操作执行结束后,事务T..
  第41题    2018年上半年  
   45%
数据库的产品很多,尽管它们支持的数据模型不同,使用不同的数据库语言,而且数据的存储结构也各不相同,但体系结构基本上都具有..
 
  第45题    2018年上半年  
   49%
若某企业信息系统的应用人员分为三类:录入、处理和查询,那么用户权限管理的方案适合采用( )。
  第40题    2021年上半年  
   38%
在数据库系统中,一般将事务的执行状态分为五种。若“事务的最后一条语句自动执行后”,事务处于()状态。
  第45题    2022年上半年  
   59%
在数据库的安全机制中,通过提供()供第三方开发人员调用进行数据更新,从而保证数据库的关系模式不被第三方所获取。
   知识点讲解    
   · 数据操作    · 数据库性能
 
       数据操作
        在关系数据库中,数据操作主要包括查询和更新两大类。关系数据语言有关系代数语言,关系演算语言、具有关系代数和关系演算双重特点的语言3种。其中关系演算语言又包括元组关系演算语言,域关系演算语言。
                      集合运算
                      传统的集合运算是二目运算,包括并、交、差、广义笛卡儿积4种运算。
                      (1)并。设关系RS具有相同的关系模式,RS的并是由属于R或属于S的元组组成的集合,记为RS。形式定义如下:
                      RS≡{t|tRtS}
                      式中t是元组变量(下同)。显然,RS=SR
                      (2)差。关系RS具有相同的关系模式,RS的差是由属于R但不属于S的元组组成的集合,记为R-S。形式定义如下:
                      
                      (3)交。关系RS具有相同的关系模式,RS的交是由既属于R又属于S的元组组成的集合,记为RS。形式定义如下:
                      RS≡{t|tRtS}
                      显然,RS=R-(R-S),或者RS=S-(S-R)。
                      (4)笛卡儿积。设关系RS元数分别为rsRS的笛卡儿积是一个r+s元的元组集合,每个元组的前r个分量来自R的一个元组,后s个分量来自S的一个元组,记为R×S。形成定义如下:
                      R×S≡{t|t=<trts>∧trRtsS}
                      若Rm个元组,Sn个元组,则R×Sm×n个元组。
                      (5)集合运算实例。例如,设关系RS如下表一所示。则RSRS如下表二所示,R-SS-R如下表三所示,R×S分别如下表四所示。
                      
                      关系RS
                      
                      RSRS
                      
                      R-SS-R
                      
                      R×S
                      
                      关系运算
                      在3.4.1节的集合运算基础上,关系数据库还有一些专门的运算,主要有投影、选择、连接、除法和外连接。它们是关系代数最基本的操作,也是一个完备的操作集。在关系代数中,由五种基本代数操作经过有限次复合的式子称为关系代数运算表达式。表达式的运算结果仍是一个关系。我们可以用关系代数表达式表示各种数据查询和更新处理操作。
                      (1)投影。投影操作从关系R中选择出若干属性列组成新的关系,该操作对关系进行垂直分割,消去某些列,并重新安排列的顺序,再删去重复元组。记作:
                      πAR)≡{t[A]|tR}
                      其中AR的属性列。
                      (2)选择。选择操作在关系R中选择满足给定条件的所有元组,记作:
                      σFR)≡{t|tRFt)=true}
                      其中F表示选择条件,是一个逻辑表达式(逻辑运算符+算术表达式)。选择运算是从行的角度进行的运算。
                      (3)θ连接。θ连接从两个关系的笛卡儿积中选取属性间满足一定条件的元组记作:
                      
                      其中AB分别为RS上度数相等且可比的属性组。θ为“=”的连接,称作等值连接,记作:
                      
                      如果两个关系中进行比较的分量必须是相同的属性组,并且在结果中把重复的属性列去掉,则称为自然连接,记作:
                      
                      (4)除法。设两个关系RS的元数分别为rs(设r>s>0),那么R÷S是一个(r-s)元的元组的集合。(R÷S)是满足下列条件的最大关系:其中每个元组tS中每个元组u组成新元组<tu>必在关系R中。其具体计算公式如下:
                      R÷S=π1,2,…,r-sR)-π1,2,…,r-s((π1,2,…,r-sR)×S)-R
                      (5)外联接。两个关系RS进行自然连接时,选择两个关系RS公共属性上相等的元组,去掉重复的属性列构成新关系。这样,关系R中的某些元组有可能在关系S中不存在公共属性值上相等的元组,造成关系R中这些元组的值在运算时舍弃了;同样关系S中的某些元组也可能舍弃。为此,扩充了关系运算左外连接、右外连接和完全外连接。
                      .左外连接:RS进行自然连接时,只把R中舍弃的元组放到新关系中。
                      .右外连接:RS进行自然连接时,只把S中舍弃的元组放到新关系中。
                      .完全外连接:RS进行自然连接时,只把RS中舍弃的元组都放到新关系中。
                      (6)关系运算实例。设两个关系模式RS如下表一所示,则π1,2R)的结果如下表二所示,σ1>2(R)的结果如下表三所示,的结果如下表四所示,RS的左外连接如下表五所示,RS的右外连接如下表六所示,RS的完全外连接如下表七所示。
                      
                      关系RS
                      
                      对关系R求投影操作
                      
                      对关系R求选择操作
                      
                      对关系RS的自然连接
                      
                      RS的左外连接
                      
                      RS的右外连接
                      
                      RS的完全外连接
                      元组演算
                      在元组演算中,元组演算表达式简称为元组表达式,其一般形式为{t|Pt)},其中,t是元组变量,表示一个元数固定的元组;P是公式,在数理逻辑中也称为谓词,也就是计算机语言中的条件表达式。{t|Pt)}表示满足公式P的所有元组t的集合。
                      在元组表达式中,公式由原子公式组成。原子公式有下列3种形式。
                      (1)Rs),其中R是关系名,s是元组变量。其含义是“s是关系R的一个元组”。
                      (2)s[i]θu[j],其中su是元组变量,θ是算术比较运算符,s[i]和u[j]分别是s的第i个分量和u的第j个分量。原子公式s[i]θu[j]表示“元组s的第i个分量与元组u的第j个分量之间满足θ运算”。
                      (3)s[i]θaaθu[j],其中的a为常量。其含义类似于(2)。
                      在一个公式中,如果元组变量未用存在量词?或全称量词?等符号定义,那么称为自由元组变量,否则称为约束元组变量。公式的递归定义如下:
                      (1)每个原子是一个公式。其中的元组变量是自由变量。
                      (2)如果P1P2是公式,那么┓P1P1P2P1P2P1P2也是公式。
                      (3)如果P1是公式,那么(?s)(P1)和(?s)(P1)也都是公式。
                      (4)公式中各种运算符的优先级从高到低依次为:θ、?和?、┓、∨和∧、→。在公式外还可以加括号,以改变上述优先顺序。
                      (5)公式只能由上述4种形式构成,除此之外构成的都不是公式。
                      在元组演算的公式中,有下列4个等价的转换规则。
                      (1)P1P2等价于┓(┓P1∨┓P2)。
                      (2)P1P2等价于┓(┓P1∧┓P2)。
                      (3)(?s)(P1)(s))等价于┓(?s)(┓P1s))。
                      (?s)(P1s))等价于┓(?s)(┓P1s))。
                      (4)P1P2等价于┓P1P2
                      关系代数表达式可以转换为元组表达式,例如:
                      (1)RS可用{t|Rt)∨St)}表示。
                      (2)R-S可用{t|Rt)∧┓St)}表示。
                      (3)R×S可用{t|(?u)(?v)(Ru)∧Sv)∧t[1]=u[1]∧…∧t[r]=u[r]∧t[r+1]=v[1]∧…∧t[r+s]=v[s])}表示,此处设Rr元,Ss元。
                      (4)设投影操作是π2,3R),那么元组表达式可写成{t|(?u)(Ru)∧t[1]=u[2]∧t[2]=u[3])}。
                      (5)σFR)可用{t|Rt)∧F′}表示,F′是F的等价表示形式。例如,σ2=′dR)可写成{t|(Rt)∧t[2]=′d′)。
                      例如,设学生S、课程C、学生选课SC的关系模式分别为:S(Sno, Sname, Sage, Saddr)、C(Cno, Cname, Pcno),以及SC(Sno, Cno, Grade)。我们求与关系代数表达式等价的元组演算表达式。
                      因为涉及3个关系模式SSCC,为了转换成等价的元组演算表达式,需要设置3个元组变量uvw,而且这3个元组变量只要用存在量词?限定就可以了。(?uSu)表示在S关系中存在一个元组,(?vSCv)表示在SC关系中存中一个元组,(?wCw)表示在C关系中存在一个元组。因为u[1]对应的是S.Sno,v[1]对应的是SC.Sno,v[2]对应的是SC.Cno,w[1]对应的是C.Cno,w[2]对应的是C.Cname,所以S.Sno=SC.Sno且SC.Cno=C.Cno且Cname=′data′等价于u[1]=v[1]∧v[2]=w[1]∧w[2]=′data′。因为本题的结果集为Sno、Sname和Grade,而u[1]对应的是S.Sno,u[2]对应的是S.Sname,v[3]对应的是SC.Grade,所以对属性列Sno、Sname和Grade的投影等价于t[1]=u[1]∧t[2]=u[2]∧t[3]=v[3]。因此,与等价的元组演算表达式为{(?u)(?v)(?wSu)∧SCv)∧Cw)∧u[1]=v[1]∧v[2]=w[1]∧w[2]=′data′∧t[1]=u[1]∧t[2]=u[2]∧t[3]=v[3]}。
                      数据库访问接口
                      访问接口是指分布式环境中保证操作系统、通信协议、数据库等之间进行对话,互操作的软件系统。访问接口的作用是保证网络中各部件(软件和硬件)之间透明地连接,即隐藏网络部件的异构性,尤其保证不同网络,不同DBMS和某些访问语言的透明性,即下面3个透明性。
                      (1)网络透明性:能支持所有类型的网络。
                      (2)服务器透明性:不管服务器上的DBMS是何种型号的数据库系统,一个好的访问接口都能通过标准的SQL语言与不同DBMS上的SQL语言连接起来。
                      (3)语言透明性:客户机可用任何开发语言进行发送请求和接收回答,被调用的功能应该像语言那样也是独立的。
                      应用系统访问数据库的接口方式有多种,最常用的有专用调用、ODBC和JDBC。
                             专用调用
                             每个数据库引擎都带有自己的用于访问数据库的动态链接库,应用程序可利用它存取和操纵数据库中的数据。如果应用程序直接调用这些动态链接库,就说它执行的是专用调用,因为该调用对于特定的数据库产品来说是专用的。
                             专用调用接口的优点是执行效率高,由于是专用,编程实现较简单。但它的主要缺点是不具通用性,对于不同的数据库引擎,应用程序必须连接和调用不同的专用动态链接库,这对于网络数据库系统的应用是极不方便的。
                             ODBC
                             ODBC(Open Database Connectivity,开放数据库互连)是Microsoft公司提出的,被当前业界广泛接受的应用程序编程接口(Application Programming Interface, API)标准,它以X/Open和ISO/IEC的调用级接口规范为基础,用于对数据库的访问。
                             ODBC实际上是一个数据库访问函数库,使应用程序可以直接操纵数据库中的数据。ODBC是基于SQL语言的,是一种在SQL和应用界面之间的标准接口,它解决了嵌入式SQL接口非规范核心,免除了应用软件随数据库的改变而改变的麻烦。ODBC的一个最显著的优点是,用ODBC生成的程序是与数据库和数据库引擎无关的,为数据库用户和开发人员屏蔽了异构环境的复杂性,提供了数据库访问的统一接口,为应用程序实现与平台的无关性和可移植性提供了基础。
                             ODBC主要由4个部分组成:应用程序、驱动程序管理器、驱动程序、数据源。
                             (1)应用程序:执行处理并调用ODBC API函数,以提交SQL语句并检索结果。
                             (2)驱动程序管理器:根据应用程序需要加载/卸载驱动程序,处理ODBC函数调用,或把它们传送到驱动程序。
                             (3)驱动程序:处理ODBC函数调用,提交SQL请求到一个指定的数据源,并把结果返回到应用程序。如果有必要,驱动程序修改一个应用程序请求,以使请求与相关的DBMS支持的语法一致。
                             (4)数据源:包括用户要访问的数据及其相关的操作系统、DBMS及用于访问DBMS的网络平台。
                             ODBC的API一致性级别分为3级,分别是核心级、扩展1级和扩展2级。
                             (1)核心级:最基本的功能,包括分配、释放环境句柄,数据库连接,执行SQL语句等。核心级函数能满足最基本的应用程序的要求。
                             (2)扩展1级:在核心级的基础上增加了一些函数,通过它们可以在应用程序中动态地了解表的模式、可用的概念模型类型及它们的名称等。
                             (3)扩展2级:在扩展1级的基础上又增加了一些函数。通过它们可以了解到关于主关键字和外来关键字的信息、表和列的权限信息、数据库中的存储过程信息等,并且还有更强的游标和并发控制功能。
                             JDBC
                             JDBC(Java Database Connectivity, Java数据库连接)是一种可用于执行SQL语句的Java API。它由一些Java语言编写的类和接口组成。JDBC给数据库应用开发人员、数据库前台工具开发人员提供了一种标准的应用程序设计接口,使开发人员可以使用纯Java语言编写完整的数据库应用程序。而且因为JDBC基于X/Open的SQL调用级接口(CLI,这是ODBC的基础),JDBC可以保证JDBC API在其他通用SQL级API(包括ODBC)之上实现。这意味着所有支持ODBC的数据库不加任何修改就能够与JDBC协同合作。
                             通过使用JDBC,开发人员可以很方便地将SQL语句传送给几乎任何一种数据库。JDBC扩展了Java的能力,如使用Java和JDBCAPI就可以公布一个Web页,页面中带有能访问远端数据库的Applet。
                             JDBC与ODBC的比较
                             到目前为止,微软的ODBC可能是用得最广泛的访问关系数据库的API。它几乎能够连接任何一种平台、任何一种数据库。那么,为什么不直接从Java中使用ODBC呢?
                             (1)ODBC并不适合在Java中直接使用。ODBC是一个C语言实现的API,从Java程序调用本地的C程序会带来一系列类似安全性、完整性、健壮性的问题。
                             (2)完全精确地实现从C代码ODBC到Java API写的ODBC的翻译也并不令人满意。比如,Java没有指针,而ODBC中大量地使用了指针。因此,对Java程序员来说,把JDBC设想成将ODBC转换成面向对象的API是很自然的。
                             (3)ODBC并不容易学习,它将简单特性和复杂特性混杂在一起,甚至对非常简单的查询都有复杂的选项。而JDBC刚好相反,它保持了简单事物的简单性,但又允许复杂的特性。
                             (4)JDBC这样的Java API对于纯Java方案来说是必需的。当使用ODBC时,人们必须在每一台客户机上安装ODBC驱动器和驱动管理器。如果JDBC驱动器是完全用Java语言实现,那么JDBC的代码就可以自动的下载和安装,并保证其安全性。而且,这将适应任何Java平台。
                             总之,JDBC API是能体现SQL最基本抽象概念的,最直接的Java接口。它构建在ODBC的基础上。JDBC保持了ODBC的基本设计特征。实际上,这两种接口都是基于X/Open SQL的调用级接口。它们的最大区别是,JDBC以Java的风格和优点为基础,并强化了它。
 
       数据库性能
        数据库性能的调整是数据库管理员的日常工作之一。性能调整工作可以从逻辑上和物理上两个方面进行。
               SQL的性能优化
               SQL(Structured Query Language,结构化查询语言)语句是用户访问关系数据库中数据的唯一方法,通常在一个关系数据库上,服务器的SQL进程会使用该服务器60%~90%的资源,大部分数据库效率的问题都是由于SQL语句编写不善引起的,所以SQL语句的性能优化十分重要。
               为了编写出高效的SQL语句,首先应按照一定的具体规范来编写SQL语句,我们建议每一个DBA都应该收集和整理一份SQL编码规范。其次是在真实数据库上对这些SQL语句进行性能测试和跟踪并不断调整,达到最优后才正式上线运行。最后需要强调的是,随着数据量的变化和数据库版本升级后,往往会有部分SQL性能下降,所以对SQL的跟踪优化是DBA的一项持续不断的工作。
               数据库的性能优化
               DBS是一组程序作用在数据文件上对外提供服务,所以其本身的性能优化也十分重要,对其的优化工作主要是相应的参数调整,步骤一般如下:
               (1)通过监视DBS的内存对象,获得系统性能指标,发现系统的性能缺陷及原因。
               (2)针对导致系统性能缺陷的原因,进行相应的参数调整(如增加数据缓冲区的大小)。
               (3)跟踪参数调整后系统的各项性能指标,看是否达到预期要求,否则继续调整。
               以上3步反复循环迭代,持续进行,保证数据库本身运行状态的最优。
               例如,Oracle通常利用定时执行statspacke.snap包收集数据库的运行状态,然后利用程序spreport.sql对两个采集点之间的数据产生报表,以分析这段时间数据库的各种运行指标。Sybase数据库用sp_sysmon、sp_monitor、sp_configure命令来采集和分析一定时间段内数据库的各种运行指标。
               查询优化
               可以通过如下方法来优化查询:
               (1)把数据、日志、索引放到不同的I/O设备上,增加读取速度。数据量(尺寸)越大,提高I/O越重要。
               (2)纵向、横向分割表,减少表的尺寸。
               (3)根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好,不要对有限的几个值的列建单一索引。
               (4)用OR的子句可以分解成多个查询,并且通过UNION连接多个查询。它们的速度只与是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高。
               (5)在查询SELECT语句中用WHERE子句限制返回的行数,避免表扫描。如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担,降低了性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
               (6)注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。
               (7)在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。
               (8)一般在GROUP BY和HAVING子句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。
               (9)尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句(存储过程是数据库服务器端的一段程序),是控制流语言的集合,速度当然快。存储过程有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作。有的服务器允许同一个存储过程既可以返回数据又可以执行动作。
               (10)不要在一句话里再三地使用相同的函数,浪费资源,将结果放在变量里再调用更快。
               另外,还可以针对大量只读查询操作进行优化,常见的方法有:
               (1)数据量小的数据,可以考虑不存储在数据库中,而是通过程序常量的方式解决。
               (2)需要存储在数据库中的数据,可以考虑采用物化视图(索引视图)。当DBA在视图上创建索引时,这个视图就被物化(执行)了,并且结果集被永久地保存在唯一聚簇索引中,保存方式与一个有聚簇索引的表的保存方式相同。物化视图减除了为引用视图的查询动态建立结果集的管理开销,优化人员可以在查询中使用视图索引,而不需要在FROM子句中直接指定视图。
               (3)数据存储时可以考虑适当的数据冗余,以减少数据库表之间的连接操作,提高查询效率。
               (4)针对数据的特点,采取特定的索引类型。例如位图索引等。
   题号导航      2023年上半年 系统分析师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第44题    在手机中做本题