首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >截断表和更新统计信息

截断表和更新统计信息
EN

Stack Overflow用户
提问于 2009-11-14 00:15:01
回答 3查看 13.6K关注 0票数 5

在调用Truncate table之后,我们是否需要更新表统计信息,或者它会自动更新?

问:在截断表之后,我们需要调用"UPDATE STATISTICS“吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-14 00:28:42

在再次需要统计信息之前,不会自动更新统计信息。也就是说,截断不会这样做。所以说“不”。

最初的答案是“是”,因为它不会自动作为截断的一部分。这取决于您如何理解问题:-)

请记住,统计数据会在查询需要时自动更新(例如,更改行数)。来自“索引统计(http://msdn.microsoft.com/en-us/library/ms190397(SQL.90%29.aspx))”(以BOL为单位

只要查询执行计划中使用的统计信息未通过当前统计信息的测试,就会启动统计信息更新

使用STATS_DATE进行验证的一种方法。

代码语言:javascript
复制
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id)
FROM
   sys.indexes 
WHERE
   object_id = OBJECT_ID('MyTruncatedTable')

编辑:我想确保:-)

您将看到统计信息仅由SELECT语句更新,而不是INSERT、DELETE或TRUNCATE

代码语言:javascript
复制
IF OBJECT_ID('dbo.foo') IS NOT NULL DROP TABLE dbo.foo
CREATE TABLE dbo.foo (
    bar int NOT NULL IDENTITY (1, 1) PRIMARY KEY,
    thing int NOT NULL
)
CREATE INDEX IX_thing ON dbo.foo (thing)

INSERT dbo.foo (thing) SELECT c1.object_id FROM sys.columns c1, sys.columns c2
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS AfterLoad
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESC
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS AfterFirstQuery
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

DELETE TOP (50000) dbo.foo
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS AfterDelete
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESC
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS After2ndQuery
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

TRUNCATE TABLE dbo.foo
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS AfterTruncate
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')

SELECT DISTINCT thing FROM dbo.foo ORDER BY thing DESC
SELECT
   name AS index_name, 
   STATS_DATE(object_id, index_id) AS After3rdQuery
FROM sys.indexes WHERE object_id = OBJECT_ID('dbo.foo')
票数 7
EN

Stack Overflow用户

发布于 2009-11-14 00:20:57

这取决于您的管理员如何配置统计信息。通常的方法是每周一次的维护工作。然后,您可以等待作业运行,或者手动更新统计信息。

还可以选择automatically update statistics

当自动更新统计信息选项AUTO_UPDATE_STATISTICS为on时,查询优化器将确定统计信息可能过期的时间,然后在查询使用统计信息时对其进行更新。

这可能会在截断后重新计算。

您可以打开自动更新,如下所示:

代码语言:javascript
复制
ALTER DATABASE AdventureWorks
    SET AUTO_UPDATE_STATISTICS ON;

和手动执行update statistics

代码语言:javascript
复制
UPDATE STATISTICS Sales.SalesOrderDetail

要验证统计数据的当前年龄,请运行以下命令:

代码语言:javascript
复制
SELECT 
    object_name = Object_Name(ind.object_id),
    IndexName = ind.name,
    StatisticsDate = STATS_DATE(ind.object_id, ind.index_id)
FROM SYS.INDEXES ind
order by STATS_DATE(ind.object_id, ind.index_id) desc
票数 7
EN

Stack Overflow用户

发布于 2009-11-14 00:24:50

因为您有,没有数据,所以在插入数据之前没有意义,然后您需要更新统计数据。

别忘了,你可以自动更新统计数据,也可以运行和更新统计数据,每天/每周等等。

如果仍然有一个主要的问题,只需截断,然后更新表上的统计数据。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1730232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档