使用全面扫描更新统计数据

在 SQL 2008 r2 上对一个拥有5000万行的大表(非分区)运行带有全面扫描的 UPDATE Statistics,会发生以下行为吗?我想确认一下。

a) 在整个运行过程中是否会锁定任何内容?不确定,但我认为不会锁定任何内容,然而一位高级数据库管理员告诉我它会锁定模式修改(嗯...)

b) 是否会导致阻塞?我认为不会

c) 是否会导致大量的IO操作?因为每个页面都将被读入内存并污染数据页缓存。所以通常应该在非工作时间进行此操作。

1个回答

a) 几乎任何事情都需要模式稳定锁。在更新统计信息时,您不希望其他内容更改表的结构。根据this,更新统计信息需要模式稳定和修改锁。 b) 如果有什么东西试图更改表的结构,它将被阻止。我记得,更新统计信息会进行脏读,所以它不应该阻塞那些仅仅是读取或写入的连接。 c) 如果使用FULLSCAN,它将读取整个表,因为这就是您告诉它要做的。我不明白为什么这会被视为“引起大量I/O”。通常,“抽样”默认值已经足够好用了,但我曾经看到它在具有非均匀分布数据的情况下引发问题。通常,重新索引整个表更容易(特别是如果可以在线完成),因为重新索引是可并行化的,而更新统计信息则不是。(据我所知,微软在SQL 2008中没有修复这个问题。)