sql - 截断表和更新统计信息

标签 sql sql-server sql-server-2005 performance

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

问:截断表后是否需要调用“UPDATE STATISTICS”?

最佳答案

在再次需要统计数据之前,统计数据不会自动更新。也就是说,TRUNCATE 不会执行此操作。 所以“不”。

最初的答案是"is",因为它不是自 Action 为 TRUNCATE 的一部分。这取决于您如何阅读问题:-)

请记住,统计信息会在查询需要时自动更新(例如行更改数)。来自 BOL 中的“Index Statistics

A statistics update is initiated whenever the statistics used in a query execution plan fail a test for current statistics

使用 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')

关于sql - 截断表和更新统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1730232/

相关文章:

sql - 使用有序值更新表

sql-server - 如何在 SQL 中删除此字符串中的额外占位符?

sql - 在 SQL Server 中将一个表连接到两个一对多关系表

sql - SQL SERVER 2008 R2 如何在单列中逐行显示多个值?

sql-server - 从 SQL Server 中的 DateTime 列中选择分组中仅获取日期

mysql - 将 3 个查询优化为一个查询的最佳方法

mysql - 对于按另一列分组的给定条件,如何获取两列的计数?

mysql - 没有子查询的查询?数据库

sql - 插入具有不同排序规则的数据时如何转换排序规则?

sql-server - 如何对 SQL Server 数据库进行版本控制?