SQLServer统计信息问题和解决方案

SQL Server统计信息:问题和解决方案时间?2014-08-04 14:13:59??CSDN博客原文??/kevinsqlserver/article/details题?SQL Server?SQL在网上看到一篇介绍使用统计信息出现的问题已经解决方案,感觉写的非常全面。在自己看的过程中顺便做了翻译。由于本人英文水平有限,可能中间有一些错误。如果有哪里有问题欢迎大家批评指正。建议英文好的直接看原文:?SQL Server Statistics: Problems and Solutions正文:SQL Server统计信息协助查询优化器计算运行查询的最优方式. Holger描述了常见的统计信息出错的事情,并且如何改善通常你不需要太担心执行SQL查询的方式.他们被传送到查询优化器,首先检查是否有可用的执行计划.如果没有,就编译一个计划.为了做的有效率,他需要能够从各种替代策略的结果中评估中间行数. 数据库引擎保存了表中每个索引键值的分布统计信息,并且用这些统计信息确定哪些索引用于编译执行计划.然而如果这些统计信息存在问题,性能就受到影响.统计信息会出什么问题?如何修正?我们将通过最常见的问题解释它如何发生和如何处理。本章包含的内容:l?没有统计信息l?关闭自动更新统计信息选项l?表变量l?XML 和空间数据l?远程查询l?数据库只读l?统计信息存在,但是没有正确使用l?在SQL 脚本中使用本地变量l?判断中使用表达式l?统计信息不准l?样本不足l?统计信息力度太大l?过时统计信息l?没有自动为多列生成统计信息l?统计信息不支持相关列l?更新统计信息是有代价的l?内存分配问题l?内存需求估计过高l?Best practices?最佳实践There is no statistics object at all 没有统计信息如果没有统计信息,查询优化器只能猜行数而不能估计他们,相信我这不是你要的。有几种方法可以在估计和实际的执行计划中找到查询优化器是否丢失了统计信息。在这种情况下在计划中会看到警告。图形显示的执行计划会中有一个感叹号,并且在扩展的属性有警告如图1。你不会看到关于表变量的警告,所以小心表变量的表扫描和行估计。Picture 1: Missing statistics warning如果你想查看当前语句的执行计划,可以用DMV sys.dm_exec_cached_plans。SQL Server profiler提供了另外一种选项。如果你在Profiler中使用Event Errors/Warings/Missing Column Statists等事件,当优化器检测到丢失统计信息,你可以观察到日志。注意如果数据库或者表启用了AUTO CREATE STATISTICS选项,这个事件不会被触发。有几种情况,你会经历丢失统计信息:自动创建统计信息关闭问题:如果你关闭了 AUTO CREATE STATISTICS OFF选项,并且忽视了手工创建统计信息,优化器会遭受丢失统计信息之苦。解决方案:依赖自动创建统计信息,将AUTO CREATE STATISTICS选项设置为ON。表变量问题:对于表变量,从来不维护统计信息。记住:关于表变量没有统计信息。当从表变量查询,估计的行数实始终是1,除非断定的求值结果为false和表变量没有关系(比如where 1=0),在这种情况下,估计返回的行数为0.解决办法:如果临时表包含多行数据,不要指望表变量为临时表。作为一个经验法则,对于超过100行的临时表使用临时表(#为表名称的第一个字符)而不是表变量。XML和空间数据问题:SQL Server不维护XML和空间数据的统计信息,这是一个事实而不是问题。所以不要尝试找到这些列的统计信息,因为他们不存在。解决办法:如果使用的查询在搜索XML数据或者过滤空间列时遇到性能问题,XML或者空间索引可能会有帮助。但是这是另外一个故事超出了本文的范围。Remote queries 远程查询问题:假设你通过Linked Server从Oracle数据库查询一张表并跟本地表关联。SQL Server并不知道远程表返回的行数,这是可以完全理解的,因为这些数据存在Oralce数据库。如果你使用OPENROWSET或者OPENQUERY远程数据访问,也可能发生。但是你使用DMV的时候可能也遇到这个问题。一定数量的SQL Server DMV只不过是从内部表中查询数据的壳。你可能在2005中看到远程扫描操作或者2008中看到表值函数操作符。这些操作默认绑定基数估计(取决于服务器版本和操作符,他们是1,1000,10000)看一下下面的查询:select?*?from?sys?.?dm_tran_current_transaction这是B