Microsoft SQL Server 2000 中查询优化器使用的统计(2)

2016-02-19 19:43 0 1 收藏

清醒时做事,糊涂时读书,大怒时睡觉,无聊时关注图老师为大家准备的精彩内容。下面为大家推荐Microsoft SQL Server 2000 中查询优化器使用的统计(2),无聊中的都看过来。

【 tulaoshi.com - 编程语言 】

  请注意,当 sp_helpindex 输出只显示城市统计 (City) 的一个列时,show_statistics 的输出也会显示 City,Customer_id 列组合的所有密度值。这是因为表中 Customer_id 列上有一个群集的索引,并且每个辅助索引也包含群集的关键字列。通常,这一事实对于用户而言是透明的,但查询优化器会了解群集的列,并且如果执行查询只要求这些列的值在辅助索引的顶部,它会避免辅助获取。统计也包含群集的关键字列。

  使用 SQL Server 2000 创建统计

  SQL Server 2000 中有两种基本语句会生成上述统计信息:CREATE INDEX 首先会生成声明的索引,然后,作为副产品,它会为组成索引的列组合创建一个统计集;CREATE STATISTICS 只为给定列或列的组合生成统计。

  另外,还有多种方法可以创建统计或索引,但归根结底,每种方法都会发出上述两个命令之一。

  使用 sp_createstats 为当前数据库中所有用户表的全部合格列(不包括图像和文本数据)创建统计。如果某个列已经有了直方图,则不会为其创建新的直方图。

  使用 dbcc dbreindex 为指定数据库中的表重新生成一个或多个索引。

  在查询分析器中,键入一个查询,选择“显示执行计划”(Show Execution Plan),然后执行查询。在显示的任意图标上单击右键,并选择“管理索引” (Manage Index)或“创建/更新统计信息”(Create/Update Statistics)。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  使用 Create Index 向导(在其他文章中说明)。

  下面是对 pubs..authors 表执行 CREATE STATISTICS 命令的一个示例:

  CREATE STATISTICS s1 ON authors (state, au_lname) WITH SAMPLE 50 PERCENT通常,按默认抽样方式生成的统计最为理想。但有时,使用更大的样本大小来生成统计(理想状况下可以使用 fullscan)有助于查询优化,例如给定列中的值分布不均匀时(某些值频繁出现,而其他值较少出现)。使用较大的样本大小来生成统计,必须以创建统计时所需时间的延长为代价。

  上面的命令创建一个两列统计。在本例中,因为表太小,所以会忽略 SAMPLE 50 PERCENT 并执行完全扫描。抽样主要用于避免过多扫描数据,并且只影响具有 1024 或更多页面 (8 MB) 的表和索引。

  在 SQL Server 2000 中,创建索引的同时会为所有索引创建统计。SQL Server 在编译查询时自动创建单列统计。这些统计是为优化器必须估算密度或分发的列而创建的。这一规则有两种例外情况:首先,当直接对表执行操作所需的代价小于创建统计所需的代价时,不能为该表创建统计;其次,当服务器过于繁忙(有大量正在进行的重要操作)时,也不能创建统计。

  为避免长时间维护未使用过的统计,SQL Server 2000 会记录那些自动创建的统计(仅包括那些不是创建索引的副产品的统计信息)的使用时间。几次自动更新之后,列统计会被放弃而不是被更新。如果将来需要,可以重新创建这些统计。更新统计与创建统计在代价方面并没有实质性的差别。记录使用时间的操作也不会影响用户创建的统计。

  通过执行 sp_dboption dbname, 'auto create statistics', 'OFF' 可以在数据库级禁用自动创建统计的功能。

  默认情况下,统计是在执行 CREATE STATISTICS 命令或自动创建统计时,通过对数据集进行抽样而创建的。CREATE INDEX 总是会扫描整个数据集,因此最初创建的索引统计并不进行抽样。CREATE STATISTICS 命令允许您通过在 WITH 子句中指定 FULLSCAN 或要扫描的数据百分比来设置样本大小。后者被认为是一个近似值。在 UPDATE STATISTICS 命令上指定 WITH RESAMPLE 时也可以继承上一个样本大小。当既存在索引(通过 fullscan 统计方式创建),其他列(通过 sample 统计方式创建)上又有统计时,该方法尤其有用。随后在 UPDATE STATISTICS 上使用 RESAMPLE 选项,将保持索引的 fullscan 统计和其他列的 sample 统计。

  dbcc show_statistics 命令在 Rows Sampled 标题下显示样本大小。自动创建或更新的统计总是用默认的抽样方式生成。默认的抽样方式是按表大小的对数函数进行抽样,这种抽样方式的样本大小增长缓慢。

  SQL Server 查询分析器也会监视自动创建统计的操作。AutoStats 事件位于 Object 跟踪事件组中。定义该跟踪时,也会选择 Integer Data、Success 和 Object ID 列。一旦捕获 AutoStats 事件,Integer Data 列将包含为给定表更新的统计数,Object ID 成为该表的 ID,而 TextData 列(默认情况下包含在跟踪定义中)则包括列的名称以及 Updated: 或 Created: 两个前缀之一。Success 列包含潜在的 Failure 指示信息。在某些情况下,您可能会发现 AutoStats 事件不带有任何创建或更新的统计。当 auto update statistics 处于关闭状态时,会生成这类事件;或者,当表实际已经变更,而因为引用该变更表的查询被优化而导致当时表中不存在任何索引或统计时,也会生成这类事件。

  DROP STATISTICS 命令用于放弃统计,但不能放弃创建索引时附带生成的统计。只有将索引放弃后,才能删除其附带生成的统计。

  在 SQL Server 2000 中维护统计

  在表中执行了一系列 INSERT、DELETE 和/或 UPDATE 查询后,统计可能不反映给定列或索引中数据分布的真实情况。如果某个表在上次创建或更新统计之后进行了大量的更新活动,那么当 SQL Server 查询优化器需要该表中某个特定列的统计时,SQL Server 会(使用 auto update statistics)通过对列中的值进行抽样来自动更新统计。统计的自动更新由查询优化操作触发,并且只涉及查询中所引用列的一个子集。SYSINDEXES 值中的 rowmodctr 列显示了自上次创建或更新统计之后对表执行的更改次数。对于每个索引和统计集,SYSINDEXES 中都会有一个对应的行(如果表中没有群集的索引,则会有一个与堆相对应的行),SQL Server 2000 将分别维护每个索引和统计的更改次数(但在 SQL Server 7.0 中并非这样)。在表中执行 INSERT、UPDATE 和 DELETE 查询时,只会为 ID 为 0 或 1 的索引(一般,每个表中只有一个)递增 rowmodctr 值。对于其他的统计和索引,它只显示一个必须加到索引 0 或 1 的 rowmodctr 上的相对值,通过将这两个值相加来得到该索引中已变更的行的真实数目。

  这一逻辑使得在 INSERT、UPDATE 和 DELETE 查询过程中,对每个表只需要维护一行中的 rowmodctr;同时,又能够分别跟踪每个索引中已变更的行。因此,当 auto update statistics 处于打开状态时,只更新与给定查询所必需的索引和列对应的行。

  查询示例

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/bianchengyuyan/)

  在表 t1 中插入 506 行,然后创建非群集的索引 i1 和 i2。进行了这些操作之后,SYSINDEXES 表中会出现有趣的条目:

  Name           Indid          rowcnt          rowmodctr
  t1             0            506            506
  i1             2            506            -506
  i2             3            506            -506

  插入了另外 213 行后,计数为:

  Name           Indid          rowcnt          rowmodctr
  t1             0            719            719
  i1             2            506            -506
  i2             3            506            -506

  使用 UPDATE STATISTICS t1 (i1) 刷新了索引 i1 的统计之后:

  Name            Indid            rowcnt            rowmodctr
  t1              0              719              0
  i1              2              506              0
  i2              3              506              213

  可以在不同的级别上将上面所说的 auto update statistics 特性关闭。

  在数据库级别使用 sp_dboption dbname, 'auto create statistics', 'OFF'。也可以使用该 sp 来显示特定数据库的当前设置。

  对表、索引或统计使用 UPDATE STATISTICS 命令的 NORECOMPUTE 选项。

  对表或统计使用 CREATE STATISTICS 命令的 NORECOMPUTE 选项。

  用 sp_autostats 来显示和更改表、索引或统计的设置。

  也可以使用 sp_dboption、UPDATE STATISTICS 或 sp_autostats 重新启用自动更新统计,其方法与上述操作相似。

  SQL Server 2000 在每个数据库、每个索引和表的级别上分别保存自动更新统计的设置。尽管您可以使用一条 CREATE STATISTICS 命令来打开一个表中的所有统计,但必须通过更改给定表中所有统计和索引的设置来完成该操作。表 6 显示了不同的数据库、表和索引设置的组合效果。

  表 6:不同的数据库、表和索引设置的组合效果

  数据库设置      表/索引设置     Statistics Auto Update 对该对象是否有效
   ON           ON           ON
   ON           OFF           OFF
   OFF           ON           OFF
   OFF           OFF           OFF


  自动更新统计一般通过对索引或表抽样来执行。您可以通过手动运行 CREATE 和 UPDATE 统计来改变样本大小。在这样创建统计时,统计更新会被相同的 SQL 分析器事件替代。

  统计和索引的视图

  通常,索引的视图上不需要统计,这是因为:只有在将基础表和索引的所有统计都附加到查询操作之后,才会考虑替换查询操作中的索引视图。但是,有一点例外:如果使用 NOEXPAND 提示在 FROM 子句中直接引用视图,就会使用统计。如果在不包含索引的视图上使用 NOEXPAND 提示,则会生成错误并无法执行操作。

  因为索引视图上的统计的用途非常有限,所以不使用 sp_createstats 在索引的视图上创建索引,也不使用 sp_updatestats 对其进行更新。auto update 和 auto create statistics 可以用于索引的视图。但正如前面所说,仅当在查询中通过 NOEXPAND 提示使用索引的视图,并且 AUTO UPDATE 或 CREATE STATISTICS 选项处于打开状态时,优化器才需要这些统计,这些统计也才会被真正创建。您也可以在索引的视图列上手动执行 CREATE STATISTICS,或在索引的视图上使用 UPDATE STATISTICS 来更新列或索引统计。

  总结

  对于查询优化器,数据库中的数据统计是重要的输入。默认情况下,SQL Server 自动创建和维护统计,而不需要用户的参与。大多数 SQL Server 用户不必更改默认值,就可以获得最佳性能。SQL Server 提供了多个接口,用于更改默认的统计创建和维护的规则,但只有在默认规则不能达到最佳性能的特殊环境下,您才需要使用这些接口。

来源:https://www.tulaoshi.com/n/20160219/1621647.html

延伸阅读
要在电子商务中取得成功,您需要一个强健的、具有完全 Web 支持的数据库解决方案,以便能够满足今天飞速变化的 Internet 电子商务环境的需要。SQL Server 2000 为快速实现下一代可伸缩的电子商务解决方案提供了所有必需的工具和功能。SQL Server 是在 Web 上存储数据最流行的数据库,原因如下:它提供了对存储和生成可扩展标记语言 (XML) ...
SQL Server 数据平台 SQL Server 是一个全面的、集成的、端到端的数据解决方案,它为企业中的用户提供了一个安全、可靠和高效的平台用于企业数据管理和商业智能应用。SQL Server 2005 为IT专家和信息工作者带来了强大的、熟悉的工具,同时减少了在从移动设备到企业数据系统的多平台上创建、部署、管理及使用企业数据和分析应用程序的...
标签: SQLServer
  问:我需要将Microsoft Word文档导入至SQL Server并索引这些文档,以便在关系查询中使用这些文档。怎样导入和索引文档呢? 答:SQL Server允许您以多种方式导入Word文档。让我们看看几种最常用的方法。请注意,在将文档导入至SQL Server之前,您需要创建一个image数据类型列,用于存放数据。然后,您可以使用textcopy.exe命令行工具将...
摘要:本文介绍了在客户机上处理 Microsoft SQL Server 查询的方式,各种客户机与 SQL Server 的交互方式,以及 SQL Server 在处理客户机程序的请求时需要完成的工作。 简介 Microsoft(R) SQL Server(TM) 内部机制和结构是一个非常大的主题,因此本文仅限于程序开发人员感兴趣的问题,集中研究其他源中没有彻底讨论的问题。在讨论 SQL ...
一、深入浅出理解索引结构 实际上,您可以把索引理解为一种特殊的目录。微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引、簇集索引)和非聚集索引(nonclustered index,也称非聚类索引、非簇集索引)。下面,我们举例来说明一下聚集索引和非聚集索引的区别: 其实,我们的汉语字典的正文本身就是一个...

经验教程

127

收藏

98
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部