Questions tagged «statistics»

用于查询优化的统计信息是包含有关表或索引视图的一个或多个列中值分布的统计信息的对象。

1
为什么SQL Server不做复合列统计直方图?
SQL Server有一个叫做“多列统计”的东西,但这不是人们想的那样。 让我们看下面的示例表: CREATE TABLE BadStatistics ( IsArchived BIT NOT NULL, Id INT NOT NULL IDENTITY PRIMARY KEY, Mystery VARCHAR(200) NOT NULL ); CREATE NONCLUSTERED INDEX BadIndex ON BadStatistics (IsArchived, Mystery); 这样,将在我们拥有的两个索引上创建两个统计信息: BadIndex的统计信息: +--------------+----------------+-------------------------+ | All density | Average Length | Columns | +--------------+----------------+-------------------------+ | 0.5 | 1 | IsArchived …

3
为什么将自动更新统计信息设置为False?
作为更广泛的收购项目的一部分,我刚刚继承了大约20个SQL Server实例。我正在评估性能,我不喜欢实施维护计划的方式。 我看到每天进行一揽子索引重建(我可以处理这一问题),并且每天都在手动更新统计信息。 大约一半的数据库已设置为“自动更新统计信息= False”,原因除了我被告知要减少“性能问题”外,其他原因还不清楚。 我一直认为并努力将其设置为True的最佳实践,并认为如果此设置为True,则不需要手动更新。我错了吗? 谁能解释一下将此设置为False会有什么好处,但是每天进行一次手动更新呢? 我应该提到,某些数据库具有很高的事务性(每天有数以百万计的插入,删除,更新),而其他数据库的事务处理率很低,而有些则全部是只读的。尽管没有任何韵律或原因,但关于“自动更新”设置为“否”的信息。好像是彩票。

2
SQL Server示例统计信息更新在升序键列上错过最高的RANGE_HI_KEY
我正在尝试了解统计信息采样的工作原理,以及以下是否是采样统计信息更新的预期行为。 我们有一个按日期划分的大型表,其中有数十亿行。分区日期是先前的业务日期,因此是升序键。我们仅将前一天的数据加载到该表中。 数据加载会在一夜之间进行,因此在4月8日(星期五),我们加载了7月7日的数据。 每次运行后,我们都会更新统计信息,尽管需要抽样,而不是FULLSCAN。 也许我很天真,但我希望SQL Server能够确定范围内的最高键和最低键,以确保获得准确的范围样本。根据这篇文章: 对于第一个存储桶,下边界是生成直方图的列的最小值。 但是,它没有提及最后一个存储桶/最大值。 由于采样的统计信息是在8日上午更新的,因此该样本未达到表格(第7位)中的最高值。 由于我们对前一天的数据进行了很多查询,因此导致基数估计不准确,并且许多查询超时。 SQL Server是否应该不标识该键的最大值并将其用作最大值RANGE_HI_KEY?还是这仅仅是不使用更新的限制之一FULLSCAN? 版本SQL Server 2012 SP2-CU7。由于OPENQUERYSP3 中行为的变化,即四舍五入到SQL Server和Oracle之间的链接服务器查询中的数字,我们当前无法升级。


1
更新统计信息时抽样工作如何?
我有几个大桌子。我想通过每周维护计划来确保其统计信息是最新的。 但是,这样做会花费太多时间。 如果我指定 WITH SAMPLE 50 PERCENT 然后SQL Server进行采样: 页面的前50% 每隔一页 或其他策略? BOL对此尚不清楚。


1
统计资料全天随机消失/清空
我有一个SQL Server 2017(CU9)数据库,该数据库存在一些与性能相关的问题,我认为这与索引统计信息有关。在进行故障排除时,我发现统计信息尚未更新(这意味着DBCC SHOW_STATISTICS将返回所有NULL值)。 我在受影响的表上执行了UPDATE STATISTICS,并验证SHOW_STATISTICS昨天在4:00 PM返回了实际值。今天早上8:00 AM,统计信息再次为空(返回NULL值)。 客户端确实有安排在每天凌晨4:00运行的维护作业,该维护作业将为数据库重新索引,然后针对整个数据库执行sp_updatestats。我已经验证了使用探查器跟踪在4:00 AM更新统计信息。 我不知道为什么统计信息将为空,维护工作是否在4:00 AM运行?在此版本的SQL Server上是否存在我不知道的错误? 提前感谢你的帮助。 更多信息: 自动更新统计信息已启用。 “异步自动更新统计信息”已禁用。 自动创建增量统计信息已禁用。 重新编制索引脚本(混淆): USE DBNAME; DECLARE @CERTENG_Lock INT DECLARE @WebSite_Control_ProcessRunning_Lock INT DECLARE @WebSite_Control_Disabled_Lock INT DECLARE @LogMessage VARCHAR(1024) SELECT @CERTENG_Lock = Lock FROM application.CERTENG_Lock SELECT @WebSite_Control_Disabled_Lock = MAX(CAST(Disabled AS INT)), @WebSite_Control_ProcessRunning_Lock = MAX(CAST(ProcessRunning AS INT)) …


1
建议使用STATISTICS_NORECOMPUTE
我最近参与了维护一组具有一些有趣的索引问题的数据库。使我最恼火的因素之一是开发,测试,模型和生产机器之间的指标差异。由于差异使调整查询变得相当困难,因此将它们同步起来是我的第一个项目。 在比较测试和模型环境时,我注意到模型环境中的大多数索引都STATISTICS_NORECOMPUTE设置为,ON而测试中的索引没有设置。在所有环境中,每天都有一项工作来更新所有数据库的统计信息。 我从来没有处理过STATISTICS_NORECOMPUTE,所以这是我的问题。处理此设置时是否有最佳做法?如果我要在一天结束时进行统计信息更新,最好打开STATISTICS_NORECOMPUTE所有环境中的所有索引吗?还是有充分的理由不这样做? 编辑:我发现了金佰利特里普的关于这一主题的博客之一在这里,似乎表明STATISTICS_NORECOMPUTE应谨慎充其量只能使用。但是我仍然担心在全球范围内将其关闭。有没有人尝试过,他们经历了什么?

1
快速通用的百分位数计算方法
我想在PostgreSQL中找到未排序列的n> 1个百分位数。例如20、40、60、80和100%。 一个显而易见的解决方案是对列进行计数和排序,然后进行查看,但我希望有一个更好的解决方案。有任何想法吗? PS我已经找到了一个很好的MySQL 解决方案,但无法将其转换为psql

1
中位数,众数,百分位数和OLAP
我是新手,试图绕过OLAP,但我有几个问题。 问题1: OLAP多维数据集可以存储中位数,众数,百分位数吗? 问题2:用户编写的MDX查询能否返回行级数据的摘要?(例如:%交易> $ 100美元)。还是多维数据集设计者必须将此添加到多维数据集? 问题3:现在有没有OLAP产品提供访问行级数据的机制?哪一个? 我们的IT部门正在寻找有关特定MS Analsis Services ROLAP多维数据集所遇到的问题的反馈。我们无权访问其背后的关系数据库,并且需要执行多维数据集中当前不可用的计算。 让我看看我是否拥有这项权利。 多维数据集可以提供计数,均值,比例,标准差的统计信息。 如果没有通过多维数据集设计器提供的度量来满足特定的统计信息,我们可以编写MDX查询来获取它吗?还是他们需要更改多维数据集以便从行级数据进行预先计算? 多维数据集无法提供诸如中位数,众数或百分位数之类的统计信息,因为这些统计信息无法正确聚集。 他说,我正在阅读利兰·威尔金森(Leland Wilkinson)的《图形语法》及其有关数据挖掘和OLAP的章节。 这些[多维数据集运算]可以很好地处理统计数据,例如计数,均值,比例和标准偏差。可以通过对和,平方和和其他项进行运算来计算子类上的简单聚合,这些和在线性函数中组合以产生基本的汇总统计信息。 它们不适用于中位数,众数和百分位数之类的统计信息,因为这些统计信息的总和不是其总和的统计信息。例如,中位数不是聚合的中位数。 他继续补充: 但是,最近出现了一个更复杂的ROLAP模型。通过多种技术,可以使统计算法通过关系模型实时访问原始数据。这种方法比诸如数据多维数据集之类的结构提供的刚性聚合更有希望。 在此体系结构最优雅的形式中,应用程序可以请求远程连接以提供有关其数据处理方法的信息,并根据返回的信息采取适当的措施。以这种形式,组件体系结构可以实现分布式计算的真正希望:独立于站点,操作系统或语言的设计和执行。 那是在2005年左右写的。有人知道采用这种方法的产品可以进行行级数据访问吗?
9 ssas  statistics  olap 

1
为什么我的Azure SQL(SQL Server)数据库一次又一次出现数据IO超载?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使它成为数据库管理员Stack Exchange 的主题。 6个月前关闭。 我正在S2版(50个DTU)下运行Azure SQL数据库。服务器的正常使用通常挂在10%左右的DTU上。但是,此服务器通常会进入一种状态,它将在数小时内将数据库的DTU使用率发送到85-90%。然后突然恢复到正常的10%使用率。 在此过载状态下,从应用程序对服务器进行的查询似乎仍在快速运行。 我可以从S2 =>任何东西(例如,S3)=> S2扩展服务器,似乎可以清除它挂起的任何状态。但是几个小时后,它将再次重复相同的重载状态周期。我注意到的另一个奇怪的事情是,如果我在S3计划(100 DTU)24/7上运行此服务器,则没有观察到此行为。当我将数据库缩减为S2计划(50 DTU)时,似乎只会发生这种情况。在S3计划中,我总是以5-10%的DTU使用率。显然未得到充分利用。 我已经检查了Azure SQL查询报告以查找流氓查询,但是我并没有发现任何异常,它显示了我所期望的使用资源的查询。 正如我们在这里看到的那样,用法全部来自数据IO。如果我更改此处的性能报告以按MAX显示热门的数据IO查询,我们将看到以下内容: 查看这些长期运行的需求似乎指向统计信息更新。从我的应用程序运行的内容实际上并不是什么。例如,查询16302显示: SELECT StatMan([SC0], [SC1], [SC2], [SB0000]) FROM (SELECT TOP 100 PERCENT [SC0], [SC1], [SC2], step_direction([SC0]) over (order by NULL) AS [SB0000] FROM (SELECT [UserId] AS [SC0], [OrganizationId] AS [SC1], [Id] AS [SC2] FROM …

2
升序关键问题-品牌为“ Stationary”的前导列-SQL Server
我一直在研究数据库中运行缓慢的查询,并得出结论,这是一个经典的升序关键问题。由于几乎总是不断地插入新行,并且每隔30分钟就会运行一条用于从数据库中提取最新数据的SQL代码,因此每30分钟更新一次统计信息的第一种选择听起来像是在浪费资源。 因此,我研究了跟踪标志2389,它在原则上应该有帮助,但是这要求Leading列被标记为Ascending,并且当我使用Trace Flag 2388检查(PK)索引统计信息时,我发现该领先列实际上是品牌为固定-与同时更新其他表上的多个PK索引相同。 关于文具品牌的结果似乎没有太多指导,但是我确实发现KB2952101表示如果少于90%的插入物大于旧的最大值,它将被归类为文具。我们所有的插入内容都是新提交的内容,前导列是bigint IDENTITY列,因此100%的插入内容应大于先前的最大值。 所以我的问题是,当列显然是升序的时候,为什么要将该列打上固定的名称? 较早尝试解决某些日常运行的SQL(确实运行良好)的问题,导致设置了一项工作来每晚更新此表的统计信息。该更新不执行FULLSCAN,所以采样扫描有时可能会丢失新行,因此它并不总是以升序显示吗? 我唯一想到的可能会影响此的原因是,我们有一个后台运行的存档作业,删除了一定期限内的行。这会对品牌产生影响吗? 该服务器是SQL Server 2012 SP1。 更新:另一天,另一项统计信息更新-相同的固定品牌。自从之前的统计信息更新以来,已经有28049个新插入内容。每行都有插入时间的时间戳,因此如果我从timestamp <'20161102'的表中选择max(id),则会得到23313455类似地,如果我对今天的统计信息进行更新,则会得到23341504。 它们之间的区别是28049个新插入物,因此,如您所见,所有新插入物都被赋予了新的升序键(如预期的那样),这表明前导柱应被标记为升序而不是固定的。 在同一时期,我们的归档作业删除了213,629行(我们正在慢慢清除旧数据)。行数减少是否有可能为固定品牌做出贡献?我之前对此进行了测试,但看起来没有任何区别。 更新2:另一天,另一项统计信息更新,该列现在标记为升序!根据有关影响删除的理论,我检查了插入与删除相比更新的百分比,昨天有13%是插入,而前两天插入约占12%。我认为这没有任何决定性的意义。 有趣的是,相关表平均插入该主表中的每一行都会插入4行,并同时更新其统计信息,其IDENTITY PK列是否仍为Stationary !? 更新3:在周末,我们会获得更多插入。今天早上,领导小组回到了固定式。在上次统计信息更新中,我们有46840次插入,而只有34776次删除。 再次,有趣的是,我上面提到的相关表现在将其前导列标记为Ascending。没有文档可以解释这一点吗? 更新4:大约一周前,归档作业已经清除了积压的订单,因此我们一直在删除大约三分之二的要插入的行。这些统计数据在相关表中显示出混合的结果,其中一个显示固定,而两个显示上升,尽管它们均按相似的比例进行更新。

5
SQL Select花费太多时间执行
这是从临时表中进行的简单选择,左键将现有表保留在其主键上,其中两个子选择使用前1个引用联接表。 在代码中: SELECT TempTable.Col1, TempTable.Col2, TempTable.Col3, JoinedTable.Col1, JoinedTable.Col2, ( SELECT TOP 1 ThirdTable.Col1 -- Which is ThirdTable's Primary Key FROM ThirdTable WHERE ThirdTable.SomeColumn = JoinedTable.SomeColumn ) as ThirdTableColumn1, ( SELECT TOP 1 ThirdTable.Col1 -- Which is also ThirdTable's Primary Key FROM ThirdTable WHERE ThirdTable.SomeOtherColumn = JoinedTable.SomeColumn ) as ThirdTableColumn2, FROM …

1
为什么在此列上自动创建的统计信息为空?
信息 我的问题与堆有关的中等大表(〜40GB数据空间)有关 (不幸的是,应用程序所有者不允许我将聚集索引添加到表中) 在“标识”列(ID)上创建了自动创建的统计信息,但为空。 自动创建统计信息和自动更新统计信息处于启用状态 表格中发生了修改 还有其他(自动创建的)统计信息正在更新 由索引创建的同一列上还有另一个统计信息(重复) 内部版本:12.0.5546 重复统计信息正在更新: 实际问题 据我了解,即使在完全相同的列(重复项)上有两个统计信息,也可以使用所有统计信息并跟踪修改,所以为什么这个统计信息仍然为空? 统计信息 数据库统计信息 桌子尺寸 创建统计信息的列信息 [ID] [int] IDENTITY(1,1) NOT NULL 身份栏 select * from sys.stats where name like '%_WA_Sys_0000000A_6B7099F3%'; 自动建立 获取其他统计信息 select * From sys.dm_db_stats_properties (1802541555, 3) 与我的空状态相比: 来自“生成脚本”的统计信息和直方图: /****** Object: Statistic [_WA_Sys_0000000A_6B7099F3] Script Date: 2/1/2019 10:18:19 AM ******/ …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.