Questions tagged «statistics»

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


2
何时更新统计信息?
我继承了执行以下任务的维护计划: 清理旧数据 检查数据库完整性 执行数据库和事务日志备份 重组我们的索引 更新统计 删除旧的备份和维护计划文件 在23分钟的维护计划中,更新统计信息需要花费惊人的13分钟。在这13分钟内,对数据库的访问被阻止(或至少暂停了从该数据库到我们其他数据库的复制)。 我的问题是: 我们什么时候应该更新统计信息,为什么? 这似乎是我们每天应该减少的工作频率。我试图让我们摆脱“不必要”维护不必要的思维定势。

3
什么时候创建统计信息而不是创建索引更好?
我发现了很多有关什么 的信息STATISTICS:如何维护它们,如何从查询或索引手动或自动创建它们,等等。但是,我无法找到有关何时使用的任何指导或“最佳做法”信息创建它们:在什么情况下,手动创建的STATISTICS对象比从Index中受益更多。我已经看到了手动创建的筛选统计信息,可以帮助对分区表进行查询(因为为索引创建的统计信息涵盖整个表,而不是每个分区-太小了!),但是肯定还有其他情况可以从统计对象中受益不需要索引的详细信息,也不需要花费维护索引或增加阻塞/死锁机会的成本。 @JonathanFite在评论中提到索引和统计数据之间的区别: 索引将通过创建与表本身排序不同的查找来帮助SQL更快地找到数据。统计信息可帮助SQL确定满足查询所需的内存/工作量。 那是个很棒的信息,主要是因为它可以帮助我阐明我的问题: 如何知道这(或在任何其他技术信息什么 S和如何 S的相关的行为和性质STATISTICS)帮助确定何时选择CREATE STATISTICS在CREATE INDEX创建索引将创建相关的时候,尤其是STATISTICS对象?仅具有统计信息而不具有索引会更好地服务于哪种情况? 如有可能,提供一个工作场景示例,说明该STATISTICS对象比物体更合适,这对超级骗子很有帮助INDEX。 因为我是一个视觉学习者/思想家,所以我认为并排查看es STATISTICS和INDEXes 之间的差异可能会有所帮助,这是帮助确定何时STATISTICS是更好选择的一种可能方法。 Thingy PROs CONs ------- ---------- ------------------- INDEX * Can help sorts. * Takes up space. * Contains data (can * Needs to be maintained (extra I/O). "cover" a query). * More chances for blocking / dead-locks. …

1
sys.stats_columns是否正确?
假设我有一个Foo带有列的表ID1, ID2和一个over定义的复合主键ID2, ID1。(我目前正在使用System Center产品,该产品具有以这种方式定义的多个表,并且主键列以与表定义中出现的相反顺序列出。) CREATE TABLE dbo.Foo( ID1 int NOT NULL, ID2 int NOT NULL, CONSTRAINT [PK_Foo] PRIMARY KEY CLUSTERED (ID2, ID1) ); GO -- Add a row and update stats so that histogram isn't empty INSERT INTO Foo (ID1, ID2) VALUES (1,2); UPDATE STATISTICS dbo.Foo; 中的key_ordinal列以sys.index_columns在复合主键中声明的顺序显示索引列: SELECT t.name, i.name, …

1
统计信息物理存储在SQL Server中的什么位置?
查询优化器所使用的统计信息在哪里物理存储在SQL Server数据库文件和缓冲池中? 更具体地说,是否有一种方法可以找出使用DMV和/或DBCC的统计信息所使用的页面? 我同时拥有《 SQL Server 2008内部原理》和《 SQL Server内部原理与故障排除》一书,但都没有谈论统计的物理结构。如果没有,我将无法找到此信息。

3
样本大小的异常行为可用于统计信息更新
我一直在研究抽样阈值,并使用SQL Server(2012)的统计信息更新,并注意到一些奇怪的行为。基本上,在某些情况下,即使使用相同的数据集,采样的行数似乎也有所不同。 我运行此查询: --Drop table if exists IF (OBJECT_ID('dbo.Test')) IS NOT NULL DROP TABLE dbo.Test; --Create Table for Testing CREATE TABLE dbo.Test(Id INT IDENTITY(1,1) CONSTRAINT PK_Test PRIMARY KEY CLUSTERED, TextValue VARCHAR(20) NULL); --Insert enough data so we have more than 8Mb (the threshold at which sampling kicks in) INSERT INTO …

2
LIKE运算符的基数估计(局部变量)
我给人的印象是,LIKE在对未知场景进行所有优化时都使用运算符时,旧的和​​新的CE都使用9%的估计值(假设相关统计数据可用并且查询优化器不必求助于选择性猜测)。 当对信用数据库执行以下查询时,在不同的CE下我得到了不同的估计。在新的CE下,我收到了900行的估计值,而在旧的CE下,我收到了241.416的估计值,我不知道如何得出此估计值。有人能说清楚吗? -- New CE (Estimate = 900) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName; -- Forcing Legacy CE (Estimate = 241.416) DECLARE @LastName VARCHAR(15) = 'BA%' SELECT * FROM [Credit].[dbo].[member] WHERE [lastname] LIKE @LastName OPTION ( QUERYTRACEON 9481, QUERYTRACEON 9292, QUERYTRACEON 9204, QUERYTRACEON …

3
警告执行计划中缺少统计信息
我有一种我无法理解的情况。我的SQL Server执行计划告诉我,表上缺少统计信息,但是已经创建了统计信息: 但是,如果我们看一下表格,将会看到有一个自动创建的统计信息: 有人可以帮助您了解情况如何吗? 当前数据库上的Auto_Update和Auto_Create统计信息已打开。 我正在使用SQL Server 2014。

1
增量更新后统计信息消失
我们有一个使用增量统计信息的大型分区SQL Server数据库。所有索引均按分区对齐。当我们尝试通过分区在线重建分区时,在重建索引之后,所有统计信息都会消失。 下面是一个脚本,用于通过AdventureWorks2014数据库在SQL Server 2014中复制问题。 --Example against AdventureWorks2014 Database CREATE PARTITION FUNCTION TransactionRangePF1 (DATETIME) AS RANGE RIGHT FOR VALUES ( '20130501', '20130601', '20130701', '20130801', '20130901', '20131001', '20131101', '20131201', '20140101', '20140201', '20140301' ); GO CREATE PARTITION SCHEME TransactionsPS1 AS PARTITION TransactionRangePF1 TO ( [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], [PRIMARY], …



1
如何防止在列上创建统计信息?
我有一个表,该表的列不希望创建或更新统计信息。如果我强制查询优化器在主键上使用统计密度而不是在该列上使用统计直方图,则可以得到更好的联接基数估计。自动更新和自动创建统计信息处于数据库级别,我无法更改。 如果要建议防止统计信息创建的替代方法,请记住该表用于成千上万个不同查询所引用的视图中。我无法控制所运行的查询。 我最初的策略是使用NOCOMPUTE和SAMPLE 0 ROWS选项在该列上创建统计信息。我的印象是,SQL Server不会在已经具有统计对象的列上自动创建统计信息,但这在我们的dev和QA服务器上已经发生。 为创建了新的统计信息COL_GROUP。我的NORECOMPUTE统计信息没有更新。我不知道为什么创建统计信息,而且我无法通过运行查询来触发该统计信息。 有没有一种方法可以防止SQL Server在一个列上自动创建统计信息?我的表只有两列,因此防止在单个表上创建自动状态的解决方案也可以解决我的问题。 跟踪标记4139和2371会打开,以防产生影响。 如果您想使用表结构,请在下面添加它和示例数据: CREATE TABLE X_NO_COLUMN_STATS( [COL_USER] [varchar](256) NOT NULL, [COL_GROUP] [int] NOT NULL, CONSTRAINT [PK_X_NO_COLUMN_STATS] PRIMARY KEY CLUSTERED ( [COL_USER] ASC, [COL_GROUP] ASC )WITH (DATA_COMPRESSION = PAGE) ); -- prevent stats from being updated on COL_GROUP CREATE STATISTICS [X_NO_COLUMN_STATS__COL_GROUP] ON X_NO_COLUMN_STATS …


1
SQL Server 2016错误查询计划每周锁定数据库一次
在过去的5周中,大约每天的同一时间(清晨,可能取决于人们开始使用时的用户活动),每周一次,SQL Server 2016(AWS RDS,已镜像)开始超时查询。 所有表上的UPDATE STATISTICS始终会立即对其进行修复。 第一次之后,我让它每晚(而不是每周)更新所有表上的所有统计信息,但是仍然发生(更新统计信息运行后大约8小时,但并非每天运行)。 上一次,我启用了查询存储,以查看是否可以找到具体的查询/查询计划。我想我可以将其缩小到一个: 找到该查询后,我添加了一个推荐索引,该索引在此不常用的查询中丢失了(但它确实涉及很多常用表)。 错误的查询计划正在执行索引扫描(在只有1万行的表上)。不过,其他返回的查询计划(以毫秒为单位)也用于进行相同的扫描。创建新索引后,最新查询计划仅查找。但是,即使没有该索引,也有99%的时间在几毫秒内返回了索引,但是每周要花40秒以上的时间。 超时的坏消息:http : //brentozar.com/pastetheplan/?id=rymaWt56e 以前不会超时的计划:http : //brentozar.com/pastetheplan/?id=HyN7ftcpe 具有新索引的最新计划:http : //brentozar.com/pastetheplan/?id=ryLuGKcag 从2012年迁移到SQL Server 2016之后,这种情况开始发生。 DBCC CHECKDB不返回任何错误。 新索引会解决问题,使其不再选择错误的计划吗? 我应该“强制”现在行之有效的计划吗? 如何确保其他查询/计划不会发生这种情况? 这是更大问题的征兆吗? 我刚刚添加的索引: CREATE NONCLUSTERED INDEX idx_AppointmetnAttendee_AttendeeType ON [dbo].[AppointmentAttendee] ([UserID],[AttendeeType]) CREATE NONCLUSTERED INDEX [idx_appointment_start] ON [dbo].[Appointment] ( [ProjectID] ASC, [Start] ASC ) INCLUDE ( …

1
SQL Server如何知道谓词之间的关联?
在诊断基数估计不佳(尽管索引简单,统计信息最新等)并因此查询计划不佳的SQL Server 2008 R2查询时,我发现了一个可能相关的知识库文章: FIX:运行查询时性能不佳包含SQL Server 2008或SQL Server 2008 R2或SQL Server 2012中的关联AND谓词 我可以猜测知识库文章“关联”的含义,例如谓词2和谓词1主要针对相同的行。 但是我不知道SQL Server如何知道这些相关性。一个表是否需要一个包含来自两个谓词的列的多列索引?SQL是否使用统计信息来检查一列中的值是否与另一列相关?还是使用其他方法? 我问这个有两个原因: 确定使用此修补程序可以改善我的表和查询 知道我应该在索引编制,统计数据等方面做些什么来影响#1

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.