《Microsoft Sql server 2008 Internals》读书笔记订阅地址:

http://www.cnblogs.com/downmoon/category/230397.html/rss

《Microsoft Sql server 2008 Internals》索引目录:

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

上篇主要列举了统计的概念和统计的设计、统计的浓度。本文将关注筛选统计和字符串统计、基线估计(cardinality estimation)。

■筛选统计

作为SQL Server 2008中新增的筛选索引的一部分,筛选统计功能被加入。这意味着(某个基于筛选谓词的表的行的子集的)统计对象被创建。可以通过sys.stats视图来查看无数据输出。筛选统计可以避免一个常见的问题:即由于数据列与列之间的相关性而变得倾斜(不准确)。比如,我们有一个表cars,一列Make,一列Model。如下记录:

Create table Cars
(
Car_ID int ,
Make nvarchar(20),
MODEL Nvarchar(20)
);
truncate table cars
 
insert into Cars
select 1,'Ford','F-150'
union all select 2,'Ford','Taurus'
union all select 3,'BMW','M3'

假定您想执行如下查询:

select * from cars where Make='Ford' and MODEL='F-150' 

查询处理器试图作选择时,它假定每一个AND子句的条件是相互独立的,实际上执行的结果是各条件的乘积,即(1/3)*(2/3)=2/9。然而真实的结果应该是1/3,因为F-150肯定是Ford。当数据量很大时,这个误差是惊人的。

筛选统计通过捕捉一个带条件的可能性从Model列进行筛选,筛选条件为Make列为Ford,这在大多数情况下会修正统计中的运算错误,特别是在where 子句包含一个相对较小的惟一值时非常有效。

除了假定独立性外,查询优化器还采用其他假定来简化估算进程。另外两个假定是统一性假定和包含性假定。没有这些假定,许多常见的查询将会变得性能寒碜。

■字符串统计

SQL Server 2005采取了一项新内容来改善针对字符串的基线估计,叫做字符串统计或Trie Trees,SQL Server直方图的上限是200步(或200个惟一值),来存放整个表的分发信息。特别在查询中使用like时,两百个惟一值不足以提供(针对字符串的)精准的基线估计,而在表外存储大量的字符串会占用大量的空间。Trie Tree此时可以用来在列中高效地存储一些样例字符串。

Trie Trees没有公开,但它通常的结构类似于如下:
如果一个列包含如下值:
ABC

AAA

ABCDEF

ADAD

BBB
对应的tier Tree如下:

SQL Server实际上在列中存储了一个字符串的样例。这提供了一种存储远超过200的惟一子字符串的频度信息的能力。

■基线估计细节

在优化期间,查询里的每一个运算符被计算以评估该操作影响的行数,这有助于查询优化器基于不同的查询计划作出正确的权衡。这个过程是自下而上的。基表基线和统计被用于输入到其上的树节点。我们看一个例子:

Create table Table2010_3(col1 int,col2 int,col3 int);
go
set nocount on
BEGIN TransAction;
Declare @i int
set @i=0
while @i<10000
BEGIN
    Insert into Table2010_3(col1,col2,col3) values(@i,@i,@i%50);
    set @i=@i+1
END
Commit Transaction
go
Create statistics s2010_3 on Table2010_3(col3);
go
select col1,col2 from Table2010_3 where col3<10

其逻辑查询树如下:

对于该查询,Filter操作请求在每一个参与谓词的列(本例中是col3)上进行统计,该请求被传承到Table2010_3,适当的统计对象被创建或更新的地方。统计对象此时被传递到筛选器,以决定操作的选择性。选择性被用于从样例延展评估。

一旦一个操作的可选择性被计算,它与当前查询的当前行数相乘。

看下图:

因为0-49中有10个是小于10的,即10/50=0.2

10000*0.2=2000行。

我们来验证一下,

本例中,存储在直方图中的浓度信息为0.02

又如下列查询:

select COUNT(*) from Table2010_3 group by col3

评估的行数为(1/0.02)*(10000/10000)=50

当一个多列统计对象被创建时,它按照统计对象的顺序为这些被计算的列集计算浓度信息。我们再看下例:

Create table Table2010_4(col1 int,col2 int,col3 int);
go
set nocount on
BEGIN TransAction;
Declare @i int
set @i=0
while @i<10000
BEGIN
    Insert into Table2010_4(col1,col2,col3) values(@i%5,@i%10,@i%50);
    set @i=@i+1
END
Commit Transaction
go

如果前两个列是随机数,则浓度信息可能类似下图:

这解释了每个col1,col2,col3的组合实际上是惟一的。通过检查进入基线估计进程的各种各样的输入(Input),判断计划在编译期间有无使用合理的信息成为可能。

本文主要介绍了筛选统计和字符串统计、基线估计,下文将关注Limitation和Costing

《Microsoft Sql server 2008 Internals》读书笔记--第八章The Query Optimizer(5)相关推荐

  1. 《Microsoft Sql server 2008 Internals》读书笔记--第九章Plan Caching and Recompilation(10)

    <Microsoft Sql server 2008 Internals>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397 ...

  2. 《Microsoft Sql server 2008 Internals》读书笔记--第五章Table(4)

    <Microsoft Sql server 2008 Internals>索引目录: <Microsoft Sql server 2008 Internal>读书笔记--目录索 ...

  3. 《Microsoft Sql server 2008 Internals》读书笔记--第十一章DBCC Internals(11)

    <Microsoft Sql server 2008 Internals>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397 ...

  4. 《Microsoft Sql server 2008 Internals》读书笔记--第五章Table(6)

      <Microsoft Sql server 2008 Internals>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/2303 ...

  5. 《Microsoft Sql server 2008 Internals》读书笔记--第六章Indexes:Internals and Management(3)

    <Microsoft Sql server 2008 Internals>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397 ...

  6. 《Microsoft Sql server 2008 Internal》读书笔记--第八章The Query Optimizer(1)

    <Microsoft Sql server 2008 Interna>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397.h ...

  7. 《Microsoft Sql server 2008 Internal》读书笔记--第七章Special Storage(3)

    <Microsoft Sql server 2008 Interna>读书笔记订阅地址: http://www.cnblogs.com/downmoon/category/230397.h ...

  8. [MS]Microsoft SQL Server 2008 R2 开发版/企业版/标准版

    Microsoft® SQL Server® 2008 R2 是一个功能强大且可靠的数据管理系统,它功能丰富,能保护数据,并且可改善嵌入式应用程序.轻型网站和应用程序以及本地数据存储区的性能. 数据中 ...

  9. 数据库备份还原顺序关系(环境:Microsoft SQL Server 2008 R2)

    让新手们了解一下备份顺序 --1.塔建环境(生成测试数据和备份文件) /* 测试环境: Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64) ...

最新文章

  1. linux 压缩 解压缩 详解
  2. pyqt5实战之真爱游戏(2048改版)
  3. mongodb spring 超时时间_spring data mongodb 配置遇到的几个问题
  4. linux 解压所有以zip结尾的文件_在 Linux 上压缩文件:zip 命令的各种变体及用法...
  5. 深度学习核心技术精讲100篇(三十六)-EdgeRec:边缘计算在淘宝推荐系统中的大规模应用
  6. 笔记-中项案例题-2018年下-采购管理
  7. C++ 是 编程界 的 背锅侠
  8. yii 加载php文件,Yii2框架加载css和js文件的方法分析
  9. 记录spark-yarn模式下提交自己写的java程序
  10. linux下GPRS模块的应用程序
  11. sql server 更改端口之后的登入方式
  12. java循环语句_循环你都学会了,那if不是so easy了嘛
  13. 如何在其他类中使用application.properties的属性
  14. 安卓9安装xpose
  15. iOS 性能优化那些繁杂琐碎的事儿
  16. Python初学者必刷的五个项目,你做过几个?
  17. ios 图表_在ios应用中实现蜘蛛网图表
  18. 高德地图---Poi搜索遇到的坑
  19. Inferior 1 (process 663) exited with code 0177
  20. psycopg2.errors.DatatypeMismatch: 错误: 无法实现外键约束 “sale_an_product_tax_id_fkey“

热门文章

  1. 数据库--循环语句:loop exit when/ end loop
  2. 阿里云助力合作伙伴帮助政府、企业体验云计算大数据魅力!
  3. Java学习-----单例模式
  4. 哪些书你看之前以为很枯燥,结果一看却欲罢不能的?
  5. 使用GLSL实现雾化的效果
  6. 计算机视觉:让冰冷的机器看懂多彩的世界
  7. 未来区块链技术将赋能多个领域促进全球经济发展
  8. IDEA自动编译less文件输出css
  9. nginx 配置简介
  10. C#测试程序运行时间