在调用Truncate table之后,我们是否需要更新表统计信息,或者它会自动更新?
问:在截断表之后,我们需要调用"UPDATE STATISTICS“吗?
发布于 2009-11-14 00:28:42
在再次需要统计信息之前,不会自动更新统计信息。也就是说,截断不会这样做。所以说“不”。
最初的答案是“是”,因为它不会自动作为截断的一部分。这取决于您如何理解问题:-)
请记住,统计数据会在查询需要时自动更新(例如,更改行数)。来自“索引统计(http://msdn.microsoft.com/en-us/library/ms190397(SQL.90%29.aspx))”(以BOL为单位
只要查询执行计划中使用的统计信息未通过当前统计信息的测试,就会启动统计信息更新
使用STATS_DATE进行验证的一种方法。
SELECT
name AS index_name,
STATS_DATE(object_id, index_id)
FROM
sys.indexes
WHERE
object_id = OBJECT_ID('MyTruncatedTable')编辑:我想确保:-)
您将看到统计信息仅由SELECT语句更新,而不是INSERT、DELETE或TRUNCATE
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')发布于 2009-11-14 00:20:57
这取决于您的管理员如何配置统计信息。通常的方法是每周一次的维护工作。然后,您可以等待作业运行,或者手动更新统计信息。
还可以选择automatically update statistics
当自动更新统计信息选项AUTO_UPDATE_STATISTICS为on时,查询优化器将确定统计信息可能过期的时间,然后在查询使用统计信息时对其进行更新。
这可能会在截断后重新计算。
您可以打开自动更新,如下所示:
ALTER DATABASE AdventureWorks
SET AUTO_UPDATE_STATISTICS ON;和手动执行update statistics:
UPDATE STATISTICS Sales.SalesOrderDetail要验证统计数据的当前年龄,请运行以下命令:
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发布于 2009-11-14 00:24:50
因为您有,没有数据,所以在插入数据之前没有意义,然后您需要更新统计数据。
别忘了,你可以自动更新统计数据,也可以运行和更新统计数据,每天/每周等等。
如果仍然有一个主要的问题,只需截断,然后更新表上的统计数据。
https://stackoverflow.com/questions/1730232
复制相似问题