《Microsoft Sql server 2008 Internals》读书笔记--第八章The Query Optimizer(4)

本文详细介绍了SQL Server 2008中统计的概念、设计、统计的浓度,以及如何手动更新统计以提高查询优化效率。
《Microsoft Sql server 2008 Internals》索引目录:

《Microsoft Sql server 2008 Internals》读书笔记--目录索引

上篇介绍了架构优化,下来我们一起了解几个非常重要的概念:统计(Statistics)、基线评估(Cardinality estimation)和成本(costing)

查询优化器评估每个操作的成本,决定采用哪个计划。这个成本基于被用于评估每个操作影响的行数量而得出的统计信息。默认,统计信息在优化进程中生成,以帮助生成基线(或标量)评估。查询优化器决定每个表的哪些列被统计。
一旦某几列被标识为需要统计,查询优化器试图找到一个已经存在的该列统计对象。找不到时,则会用系统样例数据创建一个新的统计对象。如果已经存在一个对象,则判断其是否足够编译当前的查询。如果该对象已经过期,一个新的样例被用于重建这个统计对象。这个过程对每一个需要统计的列持久生效。
自动创建和自动更新这两个默认选项是默认启用的。你可以通过以下语句来禁用:
Alter database... Set Auto_Create_Statistics {ON|OFF} Alter database... Set Auto_Update_Statistics {ON|OFF}
也可以使用定义符的提示来控制单个统计对象的自动更新行为:
Create Index...With(statistics_Norecompute=ON) Create Statistics...With(Norecompute)

这些设置通常会被启用,创建或更新一个统计时有可能会被禁用:
■数 据库有一个维护窗口,DBA决定显式更新统计而不是默认的自动更新。此时DBA认为如果统计被更改,查询优化器会选择一个差的计划。
■数据库的表 非常大,自动更新统计的时间会非常长。
■数据表有非常多的惟一值,用于生成统计的样例速度不足以捕捉生成一个很好计划所需的统计。DBA通常会采 用一个维护窗口来手动更新统计经获取一个更高的样例速率。
■数据库应用程序有一个非常短的查询超时定义。特别在一个事务中,一个查询超时会引起整 个事务Abort而回滚。
■统计设计
统计被存储于系 统元数据中。它们主要由一系列直方图(Histogram)组成。请注意:统计和直方图不是一个概念。统计对象的其他元素包括一些头信息(包括样例行的数 量等)、Tries Trees(用于string 列的分发)和浓度信息等。
统计能被SQL Server 2008中的大多数年数据类型(,而不是全部)创建。作为通用的规则,数据类型支持比较符如>,=等等。而老的BLOB数据类型如 text/ntext则不支持统计,还有一些用户创建的非字节序列比较的自定义数据类型也不支持。
此外,SQL Server支持计算列的统计,这允许查询优化器作基于表达式的标量统计,如几何类型。

下面我们看一个例子:

Create table geog(col1 int identity,col2 Geography) Insert into geog (col2) values(null) Insert into geog(col2) values(Geography::Parse('LineString(0 0,0 10,10 10,10 0,0 0)')) alter table geog add col3 as col2.STStartPoint().ToString() persisted Create Statistics s2 ON geog(col3) DBCC SHOW_Statistics('geog','s2')

在 元数据中查询以上统计:

SELECT o.Name as tablename,s.name as statname from sys.stats s inner join sys.objects o on s.object_id=o.object_id

如 下图所示:
邀月工作室

邀月工作室

一旦查询优化器决定需要创建一个新的统计对象或更新一个已存在的过时的统计对象, 系统将创建一个内部查询发生成一个新的统计对象。

注意:StatMan是一个特殊的内部汇总函数。它生成一个存储在操作中被创建的直方图/ 浓度信息/trie trees的BLOB。完成后,统计BLOB被存储在数据库元数据中,被用于查询。

生成统计的优化样例数据 库页面包含来自每一个样例页的所有行。对小的表,所有的页都是样例(意味着所有的行都被用于创建直方图)。如果是大的表,越来越小的页面的百分比作为样 例。为了保持直方图在合理的大小,这个总数被限制在200步。如果建立直方图时每行的惟一值超过200,查询优化器运用逻辑基于算法削减步骤而尽量保持分 发信息。因为直方图对于捕捉非标准的系统分发的数据非常管用,这意味着它尽量保持捕捉最频繁用到的信息。

■浓度/频度信息

除了直方图,查询优化器还跟踪列集的惟 一值的数量。列中复制值的平均数量,也就是浓度(Density),浓度刚好是频度(Frequency)的倒数。浓度存储在直方图中。

看 一个例子:

Create table MultiDensity(col1 int,col2 int) go Declare @i int set @i=0 while @i<100 BEGIN Insert into MultiDensity(col1,col2) values(@i,@i+1); Insert into MultiDensity(col1,col2) values(@i,@i+2); Insert into MultiDensity(col1,col2) values(@i,@i+3); set @i=@i+1 END go Create statistics s1 on MultiDensity(col1,col2); go --select * from MultiDensity DBCC Show_Statistics('multiDensity','s1');

邀月工作室

上图中显示:

列col1的浓度信息是 0.01,1/0.01=100,即列的惟一值的个数是100,(col1,col2)的浓度信息大约是0.00333。

我们通过 Group by 来检查一下标量估算:

SET Statistics Profile on Select count(*) as CNT from multiDensity group by col1
邀月工作室

查询优化器实际上(在为一个操作计算输出标量的时候)不得不执行 一个附加的步骤。因为统计通常创建在调用它们的查询编译之前,而且通常是一些样例数据。存储在统计对象的值通常不匹配行的准确数量。因此查询优化器使用两 个值来计算在操作中被修饰的行的分量。

事实上最为不理想的是估计的基准查询与实际查询差距过大。别担心,统计分析器会帮你辨认什么 是"坏的"信息。你可能需要的只是手动更新一下统计以捕捉更新的数据,或创建一个新的更大样例的统计。

本篇主要列举了统计的概念和统计的设 计、统计的浓度。下篇将关注筛选统计和字符串统计、基线评估。

邀月注:本文版权由邀月 和优快云共同所有,转载请注明出处。
助人等于自助! 3w@live.cn


标准中文版的pdf和实例数据脚本,分享给大家 《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化、查询算法及复杂度,以及在使用子查询、表表达式、排名函数、数据聚合和透视转换、TOP和APPLY、数据修改、分区表、特殊数据结构等实际应用时会遇到的各种高级查询问题和解决方案。 作为一本讲述T-SQL高级查询的专业图书,《Microsoft SQL Server 2008技术内幕:T-SQL查询》旨在结合实践中的各种常见问题,教读者如何用SQL作为语言工具来思考问题,揭示基于集合查询的强大威力。《Microsoft SQL Server 2008技术内幕:T-SQL查询》内容丰富、文字简洁明快,列举的实例具有一定的难度,而且实用性很强,可以把它们作为解决实际问题的标准模式。阅读《Microsoft SQL Server 2008技术内幕:T-SQL查询》,可以充分地理解T-SQL语言和良好的编程实践,学会如何编写更加有效而强大的查询语句。 目录 -------------------------------------------------------------------------------- 序言 I 致谢III 前言 V 第1章 逻辑查询处理1 1.1 逻辑查询处理的各个阶段2 1.1.1 逻辑查询处理阶段简介2 1.2 客户/订单场景下的查询示例4 1.3 逻辑查询处理阶段详解5 1.3.1 步骤1:FROM阶段5 1.3.2 步骤2:WHERE阶段9 1.3.3 步骤3:GROUP BY阶段10 1.3.4 步骤4:HAVING阶段11 1.3.5 步骤5:SELECT阶段12 1.3.6 步骤6:排序用的ORDER BY阶段13 1.4 逻辑查询处理的深入内容16 1.4.1 表运算符16 1.4.2 OVER子句23 1.4.3 集合运算符25 1.5 总结26 第2章 集合论和谓词逻辑27 2.1 自然语言表述到数学表示的转换27 2.1.1 严格定义(well-Definedness)28 2.1.2 相等、恒等和同一性30 2.1.3 数学命名约定30 2.1.4 数字31 2.1.5 上下文32 2.1.6 函数、参数和变量33 2.1.7 指令和算法34 2.2 集合论34 2.2.1 集合的标记方法35 2.2.2 集合的严格定义36 2.2.3 论域36 2.2.4 真实性38 2.2.5 罗素悖论(Russell s Paradox)40 2.2.6 有序对、元组和笛卡尔积41 2.2.7 空集42 2.2.8 集合的特征函数43 2.2.9 集合的基数(Cardinality)43 2.2.10 顺序44 2.2.11 集合运算符47 2.2.12 集合论的推广50 2.3 谓词逻辑50 2.3.1 编程语言中的逻辑功能50 2.3.2 命题和谓词51 2.3.3 排中律53 2.3.4 与、或、非运算53 2.3.5 逻辑等价55 2.3.6 逻辑蕴含55 2.3.7 量化(Quantification)56 2.3.8 替代和推广58 2.4 关系59 2.4.1 自反性、对称性和传递性59 2.5 一个实际的应用60 2.6 总结63 第3章 关系模型65 3.1 关系模型简介65 3.1.1 关系、元组和类型65 3.1.2 关系模型:快速摘要70 3.2 关系代数和关系计算70 3.2.1 基本运算符71 3.2.2 关系代数71 3.2.3 Codd提出的8个原始关系运算符72 3.2.4 关系演算79 T-SQL支持80 3.3 数据完整性81 3.3.1 声明式约束82 3.3.2 实施完整性的其他方法84 3.4 数据库正规化和其他设计主题86 3.4.1 解决函数依赖的范式87 3.4.2 更高级的范式92 3.4.3 反规范化(Denormalization)95 3.4.4 一般化和特殊化96 3.5 总结98 第4查询优化99 4.1 本章用到的样本数据99 4.2 优化方法论102 4.2.1 分析实例级别的等待104 4.2.2 关联等待和队列111 4.2.3 确定行动方案112 4.2.4 细化到数据库/文件级别113 4.2.5 细化到进程级别115 4.2.6
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值