FAQ汇萃
>> SQL之家
>> 数据库查询处理器的特性
由 amtd 发布于: 2001-02-16 09:17
数据库查询处理器的特性
1、用户需求
数据库技术的发展,呈现出了两个显著的发展趋势。一方面,数据库任务的管理和操作愈来愈自动化、智能化,许多以前需要手工完成的操作和配置等数据库管理工作现在都可以使用图形界面工具和向导来完成,大大减轻了用户在数据库管理中的工作量,使用户有更多的时间和精力把自己的工作做的更好。另一方面,对于那些难以实现或者没有必要实现自动化的操作,例如某些复杂的数据库检索等工作,则尽可能地集中在同样的图形化界面中来完成。这样,在同一个窗口中,用户可以完成更多的不同类型的操作,并且从该窗口中可以得到更多的有价值的信息,可以显著地减轻用户在不同窗口界面之间的转换和查询相关信息的工作量。
最新的关系型数据库管理系统SQL Server 7.0充分体现了这种发展趋势。与以前的版本相比,SQL Server的新版本有了许多改进,例如自动的服务器配置、新的数据库存储引擎、增加了许多向导等。另外一方面,在查询处理器中,体现出了集中管理和操作的趋势。在处理器中,不单可以完成普通的Transact-SQL语句的操作,还可以完成图形化的执行规划的优化工作。在该处理器中,使用了新的查询规划算法,可以大大提高查询语句的执行速度,提高了系统的性能。
2、特性概述
查询处理器是一种可以完成许多工作的多用途的工具。在查询处理器中,可以交互式地输入和执行各种Transact-SQL语句,并且在一个窗口中可以同时查看Transact-SQL语句和其结果集;可以在查询处理器中同时执行多个Transact-SQL语句,也可以执行脚本文件中的部分语句;提供了一种图形化分析查询语句执行规划的方法,可以报告由查询处理器选择的数据检索方法,并且可以根据查询规划调整查询查询语句的执行,提出执行可以提高性能的优化的索引建议。
具体地说,查询处理器有以下的特点和优点:
彩色代码编辑器
可以交互式地执行各种Transact-SQL语句
多查询窗口,每一个查询窗口都有自己的连接
可以定制选择结果集的查看方式
支持上下文敏感的帮助系统
可以选择执行脚本文件中的全部内容或者部分内容
图形化地显示执行规划,可以分析执行规划并且提出建议
支持根据执行规划优化的可以提高性能的索引
支持新的查询规划算法,改进了的成本模型和规划选择模型,加快查询进程的速度
支持新的散列连接连接和和合并连接算法,可以使用多索引操作
支持单个查询语句在多个处理器上的并行执行
支持使用OLE DB的分布式的和多机种环境的查询
3、交互式操作
在数据库管理系统中,虽然数据库技术有了很大的发展,提供了许多工具和向导,但是仍然有许多管理和操作不能依靠图形界面来完成,还必须使用交互式命令来执行。1970年E. F. Code发表了题为“大型共享数据库的数据关系模型”以来,确立了结构化查询语言(SQL)在关系数据库中的重要地位。目前,许多关系型数据库供应商都在自己的数据库中采用了SQL语言。当前,最新的SQL语言是ANSI SQL-92。
Transact-SQL语句是微软在SQL Server数据库中的ANSI SQL-92的实现。在SQL Server数据库中,Transact-SQL语句由四个部分组成。第一部分是数据控制语言(DCL)语句,用来进行安全性管理,可以确定哪些用户可以查看或者修改数据,这些语句包括GRANT、DENY、REVOKE等语句。第二部分是数据定义语言(DDL)语句,用来执行数据库的任务,创建数据库以及数据库中的各种对象,这些语句包括CREATE、ALTER、DROP等语句。第三部分是数据操纵语言(DML)语句,用来在数据库中操纵各种对象,检索和修改数据,这些语句包括SELECT、INSERT、UPDATE、DELETE等。第四部分不是ANSI SQL-92的内容,而是Transact-SQL语句的附加的语言元素,这些语言元素包括变量、运算符、函数、流程控制语言和注释。
这些Transact-SQL语句都可以在查询处理器中交互式执行。在这个查询处理器中,使用了彩色代码元素编辑器。这样,在该处理器中写查询语句时,SQL Server系统自动将该查询语句中的关键字等SQL语言元素使用不同的颜色标示出来,可以醒目地检查这些语句的语法是否正确。另外,这种着重显示的颜色,用户也可以根据自己的需要进行定制。
对于查询语句的结果集,可以选择不同的显示方式。既可以使用象以前版本中的那种表格形式显示结果集,也可以选择使用网格形式来显示结果集。如果使用网格形式来显示结果集,那么用户完全可以象使用表一样操纵这些结果集中的内容。这些查询语句和结果集可以根据需要,存储在脚本文件中。
查询处理器提供了多个查询窗口。这些同时打开的查询窗口,都是分别表示一个线程,即分别对应一个用户连接。因此,在这些查询窗口中,窗口都是互相独立的,窗口中的内容都是独立执行的。另外,当打开多个查询窗口时,由于每一个查询窗口对应一个用户连接,并且每一个用户连接都要占用一定数量的系统资源,因此,打开的查询窗口愈多,占用的系统资源也愈多。
可以在查询处理器中执行脚本文件中的内容。脚本文件是存放许多Transact-SQL语句的操作系统文件。在查询处理器中,既可以执行该脚本文件中的全部Transact-SQL语句内容,也可以根据需要选择一部分Transact-SQL语句来执行。
在这个查询处理器中,支持新的查询规划算法,改进了的成本模型和规划选择模型,可以大大加快对庞大数据库查询进程的速度。还支持新的散列连接连接和和合并连接算法,可以使用多索引操作,也可以提高查询性能。
4、执行规划
执行规划的概念
可以使用查询处理器来为将要执行的查询语句构造一个执行规划。执行规划就是一系列的产生查询语句所要求结果的步骤。现在举一个例子说明什么是执行规划。例如:
Select * From customer Order By custid
在上面这个查询语句中,表示从表customer中检索出全部的内容,并且根据列custid进行排序。一般情况下,该查询语句可能会产生下面的执行规划步骤:
第一步,扫描表customer主键的聚簇索引;
第二步,根据列custid,对在第一步中得到的查询结果进行排序;
第三步,把在第二步中得到的结果返回给应用程序。
查询处理器使用存储在数据库表中的有关统计信息来确定选用的产生最终结果的最有效的方法,这种方法该查询语句的执行规划。
如何访问数据库中的数据
为了能更好地理解查询语句的执行规划,看一看查询语句是如何访问数据库中的数据的。一般地,系统访问数据库中的数据,可以使用两种方法。第一种方法是表扫描,就是指系统将指针放置在该表的表头数据所在的数据页上,然后按照数据页的排列顺序,一页一页地从前向后扫描该表数据所占有的全部数据页,直至扫描完表中的全部记录。在扫描时,如果找到符合查询条件的记录,那么就将这条记录挑选出来。最后,将全部挑选出来符合查询语句条件的记录显示出来。第二种方法是使用索引查找。索引是一种树状结构,其中存储了关键字和指向包含关键字所在记录的数据页的指针。当使用索引查找时,系统沿着索引的树状结构,根据索引中关键字和指针,找到符合查询条件的的记录。最后,将全部查找到的符合查询语句条件的记录显示出来。
在SQL Server中,当访问数据库中的数据时,由SQL Server确定该表中是否有索引存在。如果没有索引,那么SQL Server使用表扫描的方法访问数据库中的数据。那么,查询处理器根据分布的统计信息生成该查询语句的优化执行规划,以提高访问数据的效率为目标,确定是使用表扫描还是使用索引。
统计信息
系统为每一个索引创建一个分布页,统计信息就是指存储在分布页上的某一个表中的一个或者多个索引的关键值的分布信息。当执行查询语句时,为了提高查询速度和性能,系统可以使用这些分布信息来确定使用表的哪一个索引。查询处理器就是依赖于这些分布的统计信息,来生成查询语句的执行规划。执行规划的优化程度依赖于这些分布统计信息的准确步骤的高低程度。如果这些分布的统计信息与索引的物理信息非常一致,那么查询处理器可以生成优化程度很高的执行规划。相反,如果这些统计信息与索引的实际存储的信息相差比较大,那么查询处理器生成的执行规划的优化程度则比较低。
一般地,分布的统计信息与索引的实际存储的信息是比较一致的。但是,当对某一个表有大量的数据操作时,特别是在被索引的列上有大量的数据被增加、修改或者删除,那么索引的实际存储信息就发生了比较大的变化。这时,索引中关键字的分布统计信息就与实际情况有大的差别。因此,为了提高关键字的分布统计信息的准确程度,当表中的数据有比较大的操作变化时,应该针对表中的全部索引或者一个索引执行UPDATE STATISTICS语句,这样系统重新计算关键字的分布统计信息,提高执行规划的优化程度和访问数据的效率。
图形化的执行规划
查询处理器从统计信息中提取索引关键字的分布信息,除了用户可以手工执行UPDATE STATISTICS之外,查询处理器还可以自动收集统计这些分布信息。这样,就能够充分保证查询处理器使用最新的统计信息,保证执行规划具有很高的优化程度,减少了维护的需要。
在以前的SQL Server中,使用SHOWPLAN方法允许用户查看某一个特定语句的处理器所创建的执行规划。用户可以根据这些信息来确定如何提高该查询语句的性能,例如修改查询语句的结构、增加另外的数据库索引。在SQL Server 7.0中,查询处理器可以提供某一个语句的执行规划的图形化表示。在查询处理器中,每一个图标表示执行规划中的一个步骤。可以在图标之间移动光标,光标在哪一个图标上,就会显示该执行规划步骤的详细内容。通过不用实际执行查询语句就图形化地显示查询语句的执行规划,可以实际地体会到不同的查询语句的结构对执行规划的影响。为了提高查询语句的性能,可以使用表优化隐藏、查询语句优化隐藏和连接优化隐藏。
当然,使用查询处理器生成的执行规划,也有一些限制。例如,使用执行规划只能提高单个查询语句的性能,但是可能对整个系统的性能产生正面的或者付面的影响,因此,要想提高整个系统的查询性能,应该使用如索引调整向导这样的工具。
5、优化索引
可以利用查询处理器中的执行规划信息,来确定如何优化查询语句的结构和在查询语句中是否创建索引。索引是加速检索表中记录的一种关键字组成的树状结构。索引可以加快对表中数据的检索速度和排序速度。索引有两种类型,一种是聚簇索引,另一种是非聚簇索引。在一个表中,最多只能有一个聚簇索引。在聚簇索引中,表中数据的物理顺序和索引的顺序相同,都是有序的,这种结构可以大大提高数据检索的速度。在非聚簇索引中,表中数据的物理顺序与数据的插入顺序相同,是紊乱的,而与索引的顺序是不相同的。
当在有数据的表中创建索引时,可以使用FILLFACTOR选项指定每一个叶级索引节点的填充的百分比。缺省值是0,该数值等价于100。在创建索引的时候,内部索引节点总是留有了一定的空间,这个空间足够容纳一个或者两个表中的记录。在没有数据的表中,当创建索引的时候,不要使用该选项,因为这时该选项是没有实际意义的。另外,该选项的数值在创建时指定以后,不能动态地得到维护,因此,只应该在有数据的表中创建索引时才使用。PAD_INDEX选项将FILLFACTOR选项的数值同样也用于内部的索引节点,使内部的索引节点的填充度与叶级索引的节点中的填充度相同。DROP_EXISTING选项指定表中已有的聚簇索引应该删除重建,然后重建全部已经存在的非聚簇索引,使用该选项可以加快索引的创建速度。
在以前的SQL Server版本中,在一个查询语句中,一个表上最多使用一个索引。而在SQL Server 7.0中,索引操作得到了增强。SQL Server现在使用索引插入和索引联合算法来实现在一个查询语句中的可以使用多个索引。共享的行标识符用于连接同一个表上的两个索引。
如果某个表中有一个聚簇索引,因此有一个聚簇键,那么该表上的全部非聚簇索引的叶节点使用该聚簇键作为行定位器,而不是使用物理记录标识符。如果表中没有聚簇索引,那么非聚簇索引继续使用物理记录标识符指向数据页。在上面的两种情况中,行定位器是非常稳定的。当聚簇索引的叶节点分开时,由于行定位器是有效的,所以非聚簇索引不需要被修改。如果表中没有聚簇索引,那么页的分开就不会发生。
而在以前的版本中,非聚簇索引使用物理记录标识符如页号和行号,作为行的定位器。例如,如果聚簇索引(数据页)发生分解时,许多记录行被移动到了一个新的数据页,因此有了多个新的物理记录标识符。那么,所有的非聚簇索引都必须使用这些新的物理记录标识符进行修改,这样就需要耗费大量的时间和资源。
6、分布式查询
查询处理器可以使用OLE DB与SQL Server的数据存储组件进行通讯。OLE DB为SQL Server 7.0查询处理器提供了分布式的和多机种环境的查询能力。查询处理器既支持在多个SQL Server 7.0服务器之间的分布式查询,也支持SQL Server 7.0服务器与OLE DB提供器之间的分布式查询。分布式查询可以访问存储在相同的或者不同的计算机上的多个数据源中的数据,这时,需要使用OLE DB。这些数据源是运行SQL Server的多个服务器、多机种数据库、文件系统和网络源。
OLE DB是由微软开发的最新的数据访问编程界面,OLE DB作为SQL Server 7.0的一个组成部分提供给了用户。微软将OLE DB作为ODBC的继承者。就象ODBC一样,OLE DB也提供了访问关系型数据库的方法,但是OLE DB扩展了ODBC的功能,它比原先的ODBC具有更加强大的功能。OLE DB是作为所有数据类型的标准界面来设计的,因此,它除了可以访问关系型数据库之外,还可以访问其他许多数据源,包括Execl表格、ISBM文件、电子邮件、DB2数据等。
7、优化隐藏
概述
一般地,对查询语句,查询处理器创建了可以提高性能的执行规划。然而,如果对某一个特定的查询语句例如检索、插入、删除、修改,查询处理器没有创建最好的执行规划,那么用户可以在查询语句中增加优化隐藏来影响查询处理器创建出最优的执行规划。优化隐藏就是指在执行查询语句、使用多表连接检索或者指定查询语句操作的对象表时,明确地指出应该使用的查询方法、连接算法或者对表的操作方式。当使用优化隐藏时,一定要认真考虑优化隐藏对性能的影响。在SQL Server 7.0中,提供了三种类型的优化隐藏,即查询优化隐藏、连接优化隐藏和表优化隐藏。
查询优化隐藏
查询优化隐藏控制整个语句的执行规划。可以通过在SQL语句的最后增加一个OPTION子句,来实现查询优化隐藏。另外,还可以同时指定多个查询优化隐藏,这些选项之间由逗号分割开来。使用Hash Group或者Order Group选项,可以为分组子句或者分组计算子句产生合计数值,但是这两个选项不能同时使用。在联合Union运算符中,可以使用合并、散列和连接选项,这时既可以使用一个选项,也可以同时使用多个选项。当同时使用多个选项时,系统将在这几个选项中选用成本最低的方法进行操作。当把返回查询结果的时间作为关键因素时,应当使用选项Fast n,这样可以最小化返回查询语句所得到的前n条记录的时间。如果需要固定在连接运算符中表的先后顺序,那么可以使用选项Force Order,该选项可以确保在连接运算符中指定的准确的表的顺序。单个查询语句可以使用多个处理器并行执行,选项MaxDop n就是为并行执行查询语句,明确指定可以使用处理器的最大值。
连接优化隐藏
连接优化隐藏指定某一个连接运算应该如何最优地实现。连接就是把两个或者多个表中的记录连接起来,通常是连接两个表中的记录。在连接中,使用两个表中的某些列组成连接的条件表达式。为了使用连接优化隐藏,可以在连接运算符之前使用四个关键字中的其中一个关键字,这四个关键字分别是Loop、Hash、Merge和Remote。使用不同的关键字,就是使用不同的连接算法。当使用关键字Loop时,连接算法就是在第一个表中,顺序地阅读表中的每一行。对于第一个表中的一行,顺序地与第二个表中的每一行进行比较,如果满足连接条件,那么就得到在匹配的行。就这样进行下去,直至得到满足条件的全部匹配的行。当使用关键字Hash时,使用的连接算法是这样的,对于第一个表中的每一行,计算在连接中使用的该列的散列值,然后把该散列值存储在散列表中,对于第二个表中的每一行,计算一个在连接中使用的该列的散列值,然后在散列表中寻找匹配的行。通过在散列表中寻找匹配的记录,就可以得到满足连接条件的记录。如果使用关键字Merge,那么可以根据连接列的顺序,使用匹配和合并算法,处理两个表中的每一行,得到满足连接条件的全部记录。关键字Remote很少使用,只有当连接中的两个表存储在不同的系统中时,才可以使用。该关键字指定在连接运算符右端的表所在的系统,开始连接进程。
当指定连接优化隐藏时,查询处理器强制多个连接运算符的顺序和在每个连接中指定的表的顺序。当没有指定连接优化隐藏时,查询处理器根据连接的表结构和连接条件选择最有效的方法。另外,如果没有指定连接优化隐藏,那么查询处理器可以重新安排表的顺序,如果有多个连接运算符,那么查询处理器也可以重新安排连接运算的顺序,这样可以保证系统使用最有效的连接方法。
表优化隐藏
表优化隐藏指定在查询语句中使用的单个基表的访问特征。通过在表名后面增加一个With子句,可以指定表的优化隐藏。在检索、插入、修改和删除等查询语句中都可以使用表优化隐藏。对于多个优化隐藏,可以使用逗号或者空格分割开。
优化隐藏FastFirstRow最小化该查询语句返回表中第一条记录的时间。该选项与查优化隐藏的Fast 1完全等价。索引优化隐藏Index(IndexName)和Index(IndexID)指定在访问该表时应该使用的索引名称或者索引代号。0表示使用表扫描,1表示使用聚簇索引(如果有聚簇索引)。对于那些非聚簇索引,可以通过使用该索引的名称,强制在查询语句中使用。
行级锁类型优化隐藏UpdLock使用修改行级锁取代共享行级锁。锁度优化隐藏。这些锁类型只能一次使用一个。选项NoLock和ReadUncommitted,表示查询语句不能获得共享锁,忽略排它锁,也就是说,即使在操作对象上有排它锁,也可以继续访问该对象。这两个关键字是等价的,并且只能用在SELECT语句中。选项PagLock使用共享数据页锁代替共享表锁。RowLock使用共享行锁代替共享页锁或者共享表锁。TabLock获取共享表锁,该锁一直保存到该语句的结束。如果指定了Holdlock或者Serializable选项,那么锁一直保存到该事务的结束。TabLockX获取排它表锁。
事务独立等级优化隐藏。这些锁类型只能一次使用一个。Holdlock或者Serializable占有共享锁,直到事务的结束,而不是在查询语句不需要这些页锁或者表锁时,就释放它们。这两个关键字等价。ReadCommitted占有共享锁,直到该语句的结束,但是允许其他进程修改读过的数据,因此这种读是不可重复的。RepeatableRead占有锁,防止其他进程修改在查询语句中使用的数据。
锁级表优化隐藏有两种作用:提高并发性和提高在并行访问同一个表的冲突保护。NoLock、RowLock和PagLock优化隐藏允许多个并发进程。注意,当使用NoLock时,因为它允许阅读那些已经修改但是还没有提交的数据,如果改变这些数据的事务被取消了,那么该查询语句得到的数据与数据库中的内容是不一样的。RowLock和PagLock可以提高系统级的性能,当并行查询访问同一个表中的不同数据时,他们不会放置大量的锁。然而,在另外一些情况下,使用这些选项,由于附加的锁开销,会降低系统的性能。
选项TabLock和 TabLockX明确指定使用表锁,防止并发访问的冲突。事务独立等级允许在单个语句中使用的锁协议,而不管当前的事务独立等级是什么。ReadUncommitted、ReadCommitted、RepeatableRead和Serializable从最低的保护性和最高的并发性到最高的保护性和最低的并发性。
8、结论
根据客户的反映和需求,SQL Server 7.0在易用性、可伸缩性、可靠性以及数据仓库等方面进行了显著的改进和提高。
在易用性方面。客户寻求的是商业问题的解决方案。而大多数所谓的数据库解决方案却带来了多层次的费用支出和复杂性。微软的目标是使SQL Server成为在构建、管理以及部署商业应用程序方面最易于使用的数据库。因此,我们为开发人员提供简单快捷的编程模型,免除对标准操作的数据库管理工作,而且还为复杂操作提供了先进的工具。
在伸缩性和可靠性方面。客户对于数据库管理系统的投资表现在为数据库编写的应用程序,以及为部署和管理应用程序而进行的培训。这些投资必须得到保护,即随着业务的增长,数据库也必须能够随之发展,以便处理更多的数据、事务和用户。同时,客户还希望在对数据库应用程序进行精简以用于便携式计算机和分支机构时,也能够保护过去的投资。为了满足这些需求,微软提供了一种单一的数据库引擎,可以用于从运行Windows 95或者Windows98操作系统的便携式计算机到运行Windows NT Server企业版的太字节(terabyte)对称多处理器集群的各种场合。所有这些系统都具有关键商业系统所需的安全性和可靠性。
在数据仓库方面。事务处理系统一直是企业数据库基础结构的关键组件。为了更加清楚地了解其数据,各公司也投入了大量的资金。微软的目标是降低数据仓库的成本和复杂性,同时让更多的用户能够拥有这项技术。微软已经为建立数据仓库所需的全部过程设定了一条完善的途径。其目标是通过结合一系列的技术、服务和供应商联盟,来使构建和设计高性能价格比的数据仓库解决方案变得更加简单。
__________________
|