谁创建和管理统计信息?在性能调优中,统计信息的作用。

谁创建和管理统计信息?在性能调优中,统计信息的作用。

大家好,又见面了,我是全栈君。

有2类统计信息,索引统计信息和列统计信息。索引统计信息是索引创建的一部分(建立索引会自动创建索引统计信息)。在where条件列被引用或查询的group by子句里包含列,列统计信息都会由SQL Server自动创建。

有数据库属性设置里,可以设置数据库是否自动创建统计信息并自动更新统计信息(数据库属性->选项->自动)。

谁创建和管理统计信息?在性能调优中,统计信息的作用。

自动创建统计信息默认是启用的,它帮助查询优化器在需要更好的进行查询预估时,创建列统计信息。为了更好的性能,建议保留启用。

自动更新统计信息默认也是启用的,它帮助查询优化器在统计信息过期的时候自动更新。当数据有明显变化时,统计信息就需要更新。这里有个阀限(threshold limit)来标记统计信息是否过期。

自动异步更新统计信息默认是不启用的。当自动异步更新统计信息被启用的时候,会有2种方式进行自动更新。异步模式(默认模式),如果统计信息已经过期,查询优化器会等到计划生成完成才更新统计信息。同步模式,查询优化器会初始化统计信息,不会等到计划的生成完成。通过改变更新统计信息为同步模式可以使性能上一些工作量始终受益。SQL Server在自动创建/更新统计信息的时候,不会进行完全扫描。它只会在可接受的时间内采样数据来计算统计信息。

理解统计信息(1/6):密度里,我们看到,当引用的列在group by或where条件里时,统计信息会自动创建。我们来看看当自动创建统计信息关掉的时候,SQL Server如何进行预估。我们运行下面的语句并看看输出结果。 

复制代码
1 ALTER DATABASE StatisticsDB SET AUTO_CREATE_STATISTICS OFF
2 GO
3 DROP TABLE SalesOrderDetail_NoStats
4 SELECT * INTO SalesOrderDetail_NoStats FROM AdventureWorks2008r2.Sales.SalesOrderDetail
5 GO
6 SELECT ProductID,COUNT(*) FROM dbo.SalesOrderDetail_NoStats GROUP BY ProductID
7 GO
8 EXEC SP_HELPSTATS 'SalesOrderDetail_NoStats', 'ALL'
复制代码

 第1句,我们关掉了StatisticsDB数据库的自动更新统计信息。第2句,我们创建了salesOrderDetail表的副本。现在我们对ProductId进行group 扮演操作,点击工具栏的谁创建和管理统计信息?在性能调优中,统计信息的作用。显示包含实际的执行计划。

谁创建和管理统计信息?在性能调优中,统计信息的作用。

 在执行计划里,我们在表扫描运算符里看到一个黄色的惊叹号。具体来说,它是警告我们没有可用的统计信息。在聚集运算符里,我们看到优化器的估计行数是348.306。没有统计信息,优化器要如何估计行数呢? 这里的值是拿记录总数开方而来。这个表有121317条记录,如果你对它开方,即谁创建和管理统计信息?在性能调优中,统计信息的作用。,我们就得到348.306。如果你对这个表group by的其他任何列,预估行数还是一样的。 请注意,自动创建统计信息只控制列统计信息的自动创建。它不控制索引创建时,统计信息的自动创建。

我们来看下统计信息如何影响查询性能。来看下面2个查询,记得在最后的查询语句执行前点击工具栏的谁创建和管理统计信息?在性能调优中,统计信息的作用。显示包含实际的执行计划。

复制代码
 1 USE StatisticsDB
 2 GO
 3 /* Part 1 WITH AUTO STATS UPDATE ON */
 4 
 5 ALTER DATABASE StatisticsDB SET AUTO_CREATE_STATISTICS ON
 6 ALTER DATABASE StatisticsDB SET AUTO_UPDATE_STATISTICS ON
 7 SET STATISTICS IO ON
 8 DROP TABLE SalesOrderDetail_NoStats 
 9 SELECT * INTO SalesOrderDetail_NoStats FROM SalesOrderDetail
10 CREATE INDEX ix_productid  ON SalesOrderDetail_NoStats (productid)
11 UPDATE dbo.SalesOrderDetail_NoStats SET ProductID=775 WHERE SalesOrderDetailID<>1
12 SELECT * FROM dbo.SalesOrderDetail_NoStats WHERE ProductID=776
13 SELECT * FROM dbo.SalesOrderDetail_NoStats WHERE ProductID=775
14 
15 /* Part 2  WITH AUTO STATS UPDATE Off */
16 
17 ALTER DATABASE StatisticsDB SET AUTO_CREATE_STATISTICS OFF
18 ALTER DATABASE StatisticsDB SET AUTO_UPDATE_STATISTICS OFF
19 SET STATISTICS IO ON
20 DROP TABLE SalesOrderDetail_NoStats 
21 SELECT * INTO SalesOrderDetail_NoStats FROM SalesOrderDetail
22 CREATE INDEX ix_productid  ON SalesOrderDetail_NoStats (productid)
23 UPDATE dbo.SalesOrderDetail_NoStats SET ProductID=775 WHERE SalesOrderDetailID<>1
24 --Disabling the auto update stats
25 ALTER DATABASE StatisticsDB SET AUTO_UPDATE_STATISTICS OFF
26 SELECT * FROM dbo.SalesOrderDetail_NoStats WHERE ProductID=776
27 SELECT * FROM dbo.SalesOrderDetail_NoStats WHERE ProductID=775
复制代码

上述2组语句我们都在productid列创建了索引(统计信息也会自动创建),然后我们更新productid为775,只留1条还是不同的productid值。更新后,表里只有2个不同的productid值775和776。第1组语句,我们进行了自动更新统计信息启用的SELECT查询。第2组语句我们进行了自动更新统计信息停用的SELECT查询。我们来看看2者执行计划和IO统计信息的不同。

谁创建和管理统计信息?在性能调优中,统计信息的作用。

我们来看看启用的执行计划。第1个where条件是productid=776的查询估计行数是1,000348,优化器进行的是索引查找。第2个where条件是productid=775的查询估计行数是121316,优化器选择的是表扫描,而不是非聚集索引查找和书签查找。对优化器来说表扫描更有效,相比使用索引查找和书签查找来获取表里的所有记录(只有一条记录productid是776)。完成这个操作只需要1495个逻辑读。

谁创建和管理统计信息?在性能调优中,统计信息的作用。

我们来看看停用的执行计划。第1个where条件是productid=776的查询估计行数是228,优化器进行的是索引查找。这个是基于索引创建是的统计信息来预估的,这个信息在update后已经过期了。第2个where条件是productid=775的查询估计行数是234,这就严重误导了查询优化器使用了非聚集扫描和书签查找来操作,而不是表扫描来获取表的所有记录(只有一条记录productid是776)。完成这个操作需要121710个逻辑读,相比启用情况下仅1495个逻辑读是非常非常高了。

从上面的例子,我们清楚的看到优化器需要更新的统计信息来选择最优执行计划,即使你有了必须的索引。在处理性能问题时,我们也需要关注下统计信息。把估计行数与实际行数的区别当作一个好指标,用来深入了解下统计信息,或统计信息的人为更新。

自动更新统计信息可以在以下3个级别进行关闭:

  • 数据库级别,使用修改数据库命令:ALTER DATABASE StatisticsDB SET AUTO_UPDATE_STATISTICS OFF
  • 索引级别,在创建或重建索引时使用STATISTICS_NORECOMPUTE 选项。这有点令人迷惑。这个选项默认是关闭的。就是说自动更新属性是启用的。
  • 统计信息级别,当创建或更新统计信息时使用NORECOMPUTE 选项。

使用sp_autostats 存储过程可以查看表的对应统计信息的自动更新统计信息设置情况。如果在数据级别设置自动更新统计信息为停用,那表级别也会停用。可以使用sp_autostats存储过程修改表级别的自动更新统计信息设置情况。



本文转自Woodytu博客园博客,原文链接:http://www.cnblogs.com/woodytu/p/4519477.html,如需转载请自行联系原作者

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107953.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • iocomp-Crack|New Version最新【2021】「建议收藏」

    iocomp-Crack|New Version最新【2021】「建议收藏」使用IocompComponents5.0以上能够助程序员开发出逼真的工控仪表和工控图表,让程序开发不再消耗时间和精力,有了这个控件不仅能节约开发时间,而且还降低了项目风险,最重要的是第三方控件写的程序更专业,工控图表图像更精细。他们用于生成具有专家级外观的仪器控件,并能紧密整合到Microsoft’s.NETFramework之中。您无需辛苦的在属性窗口中寻找该属性,其自定义的属性编辑器提供了简单快速的属性配置方法。Ultra控件包提供了70种专家级控件以及绘图控件包组件非常强大的

    2022年7月25日
    11
  • opencv remap matlab,如何使用OpenCV的remap函数?

    opencv remap matlab,如何使用OpenCV的remap函数?这只是对文件的一个简单的误解,我不怪你——我也花了几次摸索才明白。文档很清楚,但是这个函数可能没有按您预期的方式工作;事实上,它在与我最初预期相反的方向工作。remap()没有做的是获取源图像的坐标,变换点,然后插值。remap()所做的是,对于目的地图像中的每个像素,查找它来自源图像中的位置,然后分配一个插值值。它需要这样工作,因为为了插值,它需要查看每个像素处源图像周围的值。让我扩展一下(可能…

    2025年6月19日
    3
  • java判断闰年的方法_Java判断闰年的2种方法示例|chu「建议收藏」

    java判断闰年的方法_Java判断闰年的2种方法示例|chu「建议收藏」前言:给定一个年份,判断这一年是不是闰年。当以下情况之一满足时,这一年是闰年:1.年份是4的倍数而不是100的倍数;2.年份是400的倍数。其他的年份都不是闰年。方法一:publicclassBissextile{booleanbissextile(intyear){//创建boolean类型的方法if(year%4==0&&year%1…

    2022年7月17日
    10
  • 【Java】Java编译错误:需要class,interface或enum

    【Java】Java编译错误:需要class,interface或enum1.源代码classFangFaDemo{publicstaticvoidmain(String[]args){intx=1,y=2;System.out.println(sum(x,y));}}publicstaticintsum(inta,intb){returna+b;}…

    2022年6月8日
    65
  • mysql性能分析工具_中大型suv横向测评

    mysql性能分析工具_中大型suv横向测评因为工作的原因,我有机会仔细用过市面上几乎所有的MySQL管理工具,对各家的数据库管理软件的特性有了全面的了解。我大概用了20+款MySQL管理工具,从种挑出10款最棒的写了今天的测评。其中7款免费或有社区免费版,另外3种是付费版。当初,在研究这些工具时,我发现网上那些所谓的测评推荐文章里,几乎没人真用过自己文章中写的软件,都是云测评。当时就想自己把所有软件都用一遍,找机会写一篇深度横向测评文章,帮助选择困难症患者,选到最合适大家当下工作场景的工具,节省时间。本文所写软件.

    2022年8月22日
    6
  • information_schema.schemata_information theory

    information_schema.schemata_information theory1.INFORMATION_SCHEMA简介INFORMATION_SCHEMA提供对数据库元数据的访问,有关MySQL服务器信息,例如数据库或表的名称,列的数据类型或访问权限。INFORMATION_SCHEMA使用说明字符集注意事项INFORMATION_SCHEMA作为SHOW语句的替代INFORMATION_SCHEMA和特权性能注意事项1.1INFOR…

    2022年9月14日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号