《数据库系统概论》课程学习(9)——第九章 关系查询处理和查询优化

查询操作的实现

1、选择操作:

  • 简单的全表扫描:顺序扫描,逐一检查每个元组;
  • 索引(散列)扫描:选择条件有索引,可按索引扫描,用指针取元组;
  • 对形如“条件1 and 条件2”选择的处理:  

① 分别检索满足条件1的元组指针和满足条件2的元组指针,然后求两指针集合的交集,按交集指针取元组;  

② 先检索满足条件1的元组指针集合,再在该结果集合中检索满足条件2的元组;  

③ 全表扫描,直接检索出满足条件的元组。

2、连接操作:

  • 嵌套循环法:对外层的每一个元组,检索内层的每一个元组;
  • 排序合并法:对连接属性排序,然后进行归并;
  • 索引连接法:若连接属性有索引,则直接进行归并。若没有则建立;
  • 散列连接法:将连接属性散列到一个桶中,再进行连接。

查询优化

关系代数等价变换

查询的启发式优化

基于启发式规则的查询物理优化

1、选择操作的启发式规则

  • 对于小关系使用全表顺序扫描,即使有索引;
  • 对于选择条件为主码的等值查询,选择主码索引检索;
  • 对于选择条件为非主码的值比较查询,并且选择列上有索引,则要估算结果的元组数目,若数目较少,则在索引上检索,否则在全表上检索;
  • 对于用and连接的查询条件,若有涉及属性的组合索引,则优先采用组合索引检索;若只是某些属性上有索引,可采用选择操作的三种实现方法之一进行,否则采用全表检索;
  • 对于用or连接的查询条件,一般使用全表顺序扫描。

2、连接操作的启发式规则

  • 若两个表都已按连接属性排序,则选用排序合并法;
  • 若一个表在连接属性上有索引,则可选用索引连接法;
  • 若上面2条都不适用,其中一个表较小,则可选用散列法;
  • 最后可选用嵌套循环法,并选择较小的表作为外层。

基于代价的查询物理优化

问题:你还记得“代价”是指什么吗?

统计信息:

  • 对每个基表,该表元组数N、元组长度、占用块数B等等;
  • 对其表的列,该列不同值的个数、选择率(=该值元组数/N)、最大值、最小值、该列是否建了索引,是哪种索引等等;
  • 对索引,如B+树索引,该索引的层数L、不同索引值的个数、索引的选择基数S(即有S个元组具有某个索引值)、索引的叶结点数Y等等

估算代价示例:

  • 全表扫描:代价为B;若选择条件为码=值,则平均代价为B/2;
  • 索引扫描:若选择条件为码=值,则代价为L+1;若选择条件为非码属性=值,则代价为L+S;若比较的不是相等的条件(如>),假设估计有一半的元组满足条件,则代价为L+Y/2+B/2;
  • 嵌套循环连接:令Br、Bs分别为外表和内表的块数,连接使用内存K块,分配K-1块给外表,则代价为Br+(Br/K-1)Bs。

一个现实的问题

SQL执行效率低分析

索引统计信息

作用:SQL Server允许创建有关列中值分布情况统计信息。查询优化器使用这些统计信息并通过估计使用索引评估查询的开销来确定最佳查询计划。

知识要点:

  • CREATE STATISTICS语句可用于手工创建统计信息;
  • 创建统计信息后,数据库引擎对列值进行排序;
  • 根据这些列值(最多200个,按间隔分隔开)创建一个“直方图”;
  • 直方图指定有多少行精确匹配每个间隔值,有多少行在间隔范围内,以及间隔中值的密度大小或重复值的发生率;
  • 对字符类型的列创建“字符串摘要”信息,使LIKE条件可以更准确地估计结果集大小,并不断优化查询计划;
  • 如果列样本摘要的大小超过了数据库引擎可以维护的范围,则不对字符串摘要信息进行维护;
  • 创建索引时,查询优化器自动存储有关索引列的统计信息。另外,当数据库AUTO_CREATE_STATISTICS选项设置为ON(默认值)时,数据库引擎自动为没有索引的列创建统计信息。
  • 随着列中数据发生变化,索引和列的统计信息可能会过时,从而导致查询优化器选择的查询处理方法不是最佳的;
  • 当AUTO_UPDATE_STATISTICS数据库选项设置为ON(默认值)时,查询优化器会在表中的数据发生变化时自动定期更新这些统计信息。常规情况是:在大约有20%的数据行发生变化时更新统计信息;
  • 从磁盘读取一个数据页后,该数据页上的所有行都被用来更新统计信息。对于小于8MB的表,则始终进行完整扫描来收集统计信息;
  • 有时统计采样无法获得表数据的精确特征。可使用UPDATE STATISTICS语句的SAMPLE子句和FULLSCAN子句,前者用来指定采样的行数百分比或采样的行数,后者指定扫描表中的所有数据来收集统计信息;
  • 使用UPDATE STATISTICS语句的NORECOMPUTE子句针对特定列或索引禁用统计信息自动生成功能;
  • CREATE STATISTICS语句对特定表或视图列创建统计信息;
  • UPDATE STATISTICS语句手动更新统计信息;
  • DBCC SHOW_STATISTICS语句查看表的统计信息;
  • DROP STATISTICS语句删除列的统计信息。

创建索引的一般性准则

  • 一个表若建有大量索引会影响更新语句的性能,因为在表中更改数据时,所有索引都须进行适当的调整;
  • 避免对经常更新的表建立过多的索引,并且索引列要尽可能少;
  • 使用多个索引可以提高更新少而数据量大查询性能,因为查询优化器有更多的索引可供选择,从而可以确定最快的访问方法;
  • 对小表进行索引可能不会产生优化效果。小表的索引可能从来不用,但仍必须在表中的数据更改时进行维护;
  • 为经常用于查询中的谓词和联接条件的所在列创建非聚集索引
  • 涵盖索引可以提高查询性能。例如,对某一表(其中对列a、列b和列c创建了组合索引)的列a和列b查询,则仅从该索引本身就可以检索到数据,因此,减少了总体磁盘I/O;
  • 对于聚集索引,保持较短的索引键长度;
  • 如果索引包含多个列,则应考虑列的顺序。WHERE子句中参与比较运算或者参与连接的列应该放在最前面,其他列从最不重复的列到最重复的列。

在视图上建立索引

在视图上建立索引知识要点

  • 每次为视图的查询动态生成结果集的开销很大,特别是涉及复杂处理(如聚合大量数据或联接许多行)的视图,若这类视图的查询频繁,则可通过对视图创建唯一聚集索引来提高性能;
  • 对视图创建唯一聚集索引后,结果集将存储在数据库中,就像带有聚集索引的表一样;
  • 对视图创建索引的另一个好处是:优化器可以在FROM子句中没指定某视图的查询中使用该视图的索引,由此带来的高效率也使其他查询获益;
  • 对基表的数据进行更改时,数据更改将反映在索引视图中存储的数据中;
  • 如果很少更新基础数据,则索引视图的效果最佳;
  • 维护索引视图的成本可能高于维护表索引的成本。若经常更新基础数据,则维护索引视图数据的成本可能超过使用索引视图所带来的性能收益;
  • 若基础数据以批处理的形式定期更新,在更新之间主要作为只读数据进行处理,可考虑在更新前删除所有索引视图,然后再重新生成。这样做可以提高更新的性能。

索引选项

数据库文件

SQL Server将数据库映射为一组操作系统文件;

数据和日志信息从不混合在相同的文件中,而且各文件仅在一个数据库中使用;

SQL Server数据库具有三种类型的文件:

  • 主数据文件:是数据库的起点,指向数据库中的其他文件。每个数据库都有一个主数据文件。扩展名一般是.mdf;
  • 次要数据文件:除主数据文件以外的所有其他数据文件都是次要数据文件。该文件可有可无。扩展名一般是.ndf;
  • 日志文件:包含用于恢复数据库的所有日志信息。每个数据库必须至少有一个日志文件。扩展名一般是.ldf。

在SQL Server数据库中所有文件的位置都记录在数据库的主文件和master 数据库中。

SQL Server文件有两个名称:

  • 逻辑文件名:是在所有T-SQL语句中引用物理文件时所使用的名称,在数据库中的逻辑文件名中必须唯一;
  • 物理文件名:是包括路径的物理文件名。

文件大小:

  • SQL Server文件可以从它们最初指定的大小开始自动增长。如果文件组中有多个文件,则它们在所有文件被填满之前不会自动增长。填满后,这些文件会循环增长;
  • 每个文件还可以指定一个最大大小。如果没有指定最大大小,文件可以一直增长到用完磁盘上的所有可用空间。

数据库文件组

文件组:是命名的文件集合,用于帮助数据布局和管理任务,例如备份和还原操作。

文件组的两种类型:

  • 主文件组:包含主数据文件和任何没有明确分配给其他文件组的文件。系统表的所有页均分配在主文件组中;
  • 用户定义文件组:是通过在CREATE DATABASE或ALTER DATABASE语句中使用 FILEGROUP关键字指定的任何文件组。

其他:

  • 日志文件不包括在文件组内。日志空间与数据空间分开管理;
  • 一个文件不可以是多个文件组的成员;
  • 每个数据库中均有一个文件组被指定为默认文件组。如果创建表或索引时未指定文件组,则将假定所有页都从默认文件组分配。

数据库文件和文件组示例

CREATE DATABASE MyDB
ON
PRIMARY ( NAME = 'MyDB_Primary',
                      FILENAME= 'd:\data\MyDB_Prm.mdf',
                      SIZE = 4MB, MAXSIZE = 10MB, FILEGROWTH = 1MB),
FILEGROUP MyDB_FG1
    ( NAME = 'MyDB_FG1_Dat1',
      FILENAME = 'e:\data\MyDB_FG1_1.ndf',
      SIZE = 1MB, MAXSIZE = 10MB, FILEGROWTH = 1MB),
    ( NAME = 'MyDB_FG1_Dat2',
      FILENAME = 'f:\data\MyDB_FG1_2.ndf',
      SIZE = 1MB, MAXSIZE = 10MB, FILEGROWTH = 1MB)
LOG ON ( NAME = 'MyDB_log',
                   FILENAME = 'g:\data\MyDB.ldf',
                   SIZE = 1MB, MAXSIZE = 10MB, FILEGROWTH = 1MB); 

使用数据库引擎优化顾问

该工具可针对数据库和表来查找查询性能最佳的物理数据库设计。使用方 法如下:

  • 将要分析的查询语句保存到文件,如MyScript.sql;
  • 启动数据库引擎优化顾问,即点击“在数据库引擎优化顾问中分析查询”按钮;
  • 选择“新建会话”按钮:可键入会话名,在“工作负荷”的“文件”中加载MyScript.sql文件,选择所需的数据库;
  • 在工具栏上,单击“开始分析”按钮。优化完成后,“建议”选项卡随即显示。
  • 若出现错误,则需要在“优化选项”的“高级选项”中定义建议所用的最大空间。
发布了593 篇原创文章 · 获赞 34 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_34573534/article/details/105139591