SQL Server 2008.我们有一个1 TB的数据库表(有一个带有图像数据的blob字段),在date
和account number
上有一个索引。
我们每天插入大约30k行。在搜索创建索引(或重建索引)之前存在的日期时,索引将在查询计划中正确使用。但是,搜索新行(自构建索引以来添加的行),它仅使用PK Clustered索引。
我是新手,但我不应该每天重建索引吗?过去几天似乎没有更新统计信息(因为我重建了索引),但它们设置为自动更新。
CREATE NONCLUSTERED INDEX [IDX_ProcessDate_Account] ON [dbo].[tablename]
(
[Date] DESC,
[Account] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
答案 0 :(得分:1)
不,你不应该每天重建。
SQL可能会触发更新统计信息,但在此期间继续使用旧统计信息,因为更新需要一段时间。特别是在VLDB上。因此,自动更新可能正在实现它的工作,但由于缺乏资源或花费时间来获取更好的信息,优化器还无法利用它。
运行此选项以查看上次触发自动更新的时间
DBCC show_statistics ('<yer table>', '<yer index>') WITH STAT_HEADER
如果您的表仅批量获取更新。 (你一天提到30k行;那些是一次性的吗?)。 Microsoft建议不要在单个批处理中插入大量行的情况中使用自动更新,而是在之后插入很少甚至没有行来代替运行Update Stats with full scan。 (注意:这仍需要一段时间才能完成)