Microsoft SQL Server 2000 中查询优化器使用的…
2008-04-02 10:46:56来源:互联网 阅读 ()
请注意,当 sp_helpindex 输出只显示城市统计 (City) 的一个列时,show_statistics 的输出也会显示 City,Customer_id 列组合的任何密度值。这是因为表中 Customer_id 列上有一个群集的索引,并且每个辅助索引也包含群集的关键字列。通常,这一事实对于用户而言是透明的,但查询优化器会了解群集的列,并且假如执行查询只需要这些列的值在辅助索引的顶部,他会避免辅助获取。统计也包含群集的关键字列。fuckAio2i7L
使用 SQL Server 2000 创建统计
SQL Server 2000 中有两种基本语句会生成上述统计信息:CREATE INDEX 首先会生成声明的索引,然后,作为副产品,他会为组成索引的列组合创建一个统计集;CREATE STATISTICS 只为给定列或列的组合生成统计。 fuckAio2i7L
另外,更有多种方法能够创建统计或索引,但归根结底,每种方法都会发出上述两个命令之一。 fuckAio2i7L
- 使用 sp_createstats 为当前数据库中任何用户表的全部合格列(不包括图像和文本数据)创建统计。假如某个列已有了直方图,则不会为其创建新的直方图。
- 使用 dbcc dbreindex 为指定数据库中的表重新生成一个或多个索引。
- 在查询分析器中,键入一个查询,选择“显示执行计划”(Show Execution Plan),然后执行查询。在显示的任意图标上单击右键,并选择“管理索引” (Manage Index)或“创建/更新统计信息”(Create/Update Statistics)。
- 使用 Create Index 向导(在其他文章中说明)。
下面是对 pubs..authors 表执行 CREATE STATISTICS 命令的一个示例:fuckAio2i7L
CREATE STATISTICS s1 ON authors (state, au_lname) WITH SAMPLE 50 PERCENT
通常,按默认抽样方式生成的统计最为理想。但有时,使用更大的样本大小来生成统计(理想状况下能够使用 fullscan)有助于查询优化,例如给定列中的值分布不均匀时(某些值频繁出现,而其他值较少出现)。使用较大的样本大小来生成统计,必须以创建统计时所需时间的延长为代价。fuckAio2i7L
上面的命令创建一个两列统计。在本例中,因为表太小,所以会忽略 SAMPLE 50 PERCENT 并执行完全扫描。抽样主要用于避免过多扫描数据,并且只影响具备 1024 或更多页面 (8 MB) 的表和索引。fuckAio2i7L
在 SQL Server 2000 中,创建索引的同时会为任何索引创建统计。SQL Server 在编译查询时自动创建单列统计。这些统计是为优化器必须估算密度或分发的列而创建的。这一规则有两种例外情况:首先,当直接对表执行操作所需的代价小于创建统计所需的代价时,不能为该表创建统计;其次,当服务器过于繁忙(有大量正在进行的重要操作)时,也不能创建统计。fuckAio2i7L
为避免长时间维护未使用过的统计,SQL Server 2000 会记录那些自动创建的统计(仅包括那些不是创建索引的副产品的统计信息)的使用时间。几次自动更新之后,列统计会被放弃而不是被更新。假如将来需要,能够重新创建这些统计。更新统计和创建统计在代价方面并没有实质性的差别。记录使用时间的操作也不会影响用户创建的统计。fuckAio2i7L
通过执行 sp_dboption dbname, 'auto create statistics', 'OFF' 能够在数据库级禁用自动创建统计的功能。fuckAio2i7L
默认情况下,统计是在执行 CREATE STATISTICS 命令或自动创建统计时,通过对数据集进行抽样而创建的。CREATE INDEX 总是会扫描整个数据集,因此最初创建的索引统计并不进行抽样。CREATE STATISTICS 命令允许您通过在 WITH 子句中指定 FULLSCAN 或要扫描的数据百分比来配置样本大小。后者被认为是个近似值。在 UPDATE STATISTICS 命令上指定 WITH RESAMPLE 时也能够继承上一个样本大小。当既存在索引(通过 fullscan 统计方式创建),其他列(通过 sample 统计方式创建)上又有统计时,该方法尤其有用。随后在 UPDATE STATISTICS 上使用 RESAMPLE 选项,将保持索引的 fullscan 统计和其他列的 sample 统计。fuckAio2i7L
dbcc show_statistics 命令在 Rows Sampled 标题下显示样本大小。自动创建或更新的统计总是用默认的抽样方式生成。默认的抽样方式是按表大小的对数函数进行抽样,这种抽样方式的样本大小增长缓慢。fuckAio2i7L
SQL Server 查询分析器也会监控自动创建统计的操作。AutoStats 事件位于 Object 跟踪事件组中。定义该跟踪时,也会选择 Integer Data、Success 和 Object ID 列。一旦捕获 AutoStats 事件,Integer Data 列将包含为给定表更新的统计数,Object ID 成为该表的 ID,而 TextData 列(默认情况下包含在跟踪定义中)则包括列的名称连同 Updated: 或 Created: 两个前缀之一。Success 列包含潜在的 Failure 指示信息。在某些情况下,您可能会发现 AutoStats 事件不带有任何创建或更新的统计。当 auto update statistics 处于关闭状态时,会生成这类事件;或,当表实际已变更,而因为引用该变更表的查询被优化而导致当时表中不存在任何索引或统计时,也会生成这类事件。fuckAio2i7L
DROP STATISTICS 命令用于放弃统计,但不能放弃创建索引时附带生成的统计。只有将索引放弃后,才能删除其附带生成的统计。fuckAio2i7L
在 SQL Server 2000 中维护统计
在表中执行了一系列 INSERT、DELETE 和/或 UPDATE 查询后,统计可能不反映给定列或索引中数据分布的真实情况。假如某个表在上次创建或更新统计之后进行了大量的更新活动,那么当 SQL Server 查询优化器需要该表中某个特定列的统计时,SQL Server 会(使用
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash