zoukankan      html  css  js  c++  java
  • 对比:重建索引与更新统计

    最近经常被问到的一个问题是关于在数据库维护过程,重建索引与更新统计的执行先后次序。通常,需要考虑以下几点,这里注意的是有两种统计:索引统计、列统计。

    1)默认情况下,UPDATE STATISTICS 将会更新索引统计和列统计,如果语句中仅使用了COLUMNS选项,则只更新列统计,若仅使用了INDEX选项,则只更新索引统计

    2)默认情况下,UPDATE STATISTICS语句仅采样表的一部分数据,使用UPDATE STATISTICS WITH FULLSCAN则会扫描全表

    3)重建索引(如使用ALTER INDEX … REBUILD语句)仅更新索引统计,其效果相当于第2情况(WITH FULLSCAN),重建索引不会更新任何列统计

    4)重组索引(如使用ALTER INDEX … REORGANIZE语句)不更新任何统计

    综上所述,最简单的情况是:重建索引并更新统计;正如上面提到的,如果重建索引,则索引统计也会通过扫描整个表的行被一同更新,那么只需再运行UPDATE STATISTICS WITH FULLSCAN, COLUMNS语句来更新列统计。

    既然第一步仅更新了索引统计,第二步仅更新了列统计,二者执行的先后顺序并不重要。

    其他较为复杂的情况是:基于碎片级的重建索引,当然,最坏的情况:如果首先重建了索引(仅扫描整张表的方式更新了索引统计,紧接着使用UPDATE STATISTICS语句(无任何参数),则会又执行了一遍索引统计。

    下面通过AdventureWorks示例数据库为例来介绍这些命令的工作方式。

    首先运行以下脚本,创建临时表dbo.SalesOrderDetail

    SELECT * INTO dbo.SalesOrderDetail FROM sales.SalesOrderDetail

    下面使用sys.stats 系统视图来查询新表的统计情况。

    SELECT name, auto_created, stats_date(object_id, stats_id) AS update_date FROM sys.stats WHEREobject_id = object_id('dbo.SalesOrderDetail')

     对比:重建索引与更新统计

    由于是一张新表,并无任何查询,所以没有统计结果,下面执行以下的查询来产生一些统计:

    select * from dbo.SalesOrderDetail where SalesOrderID = 43670 and OrderQty =1

     对比:重建索引与更新统计

    再运行先前的查询系统视图的语句,我们会发现系统为SalesOrderID和OrderQty两列创建了以_WA_Sys命名的两个列统计。

     对比:重建索引与更新统计

    下面再运行创建索引的语句:

    create index ix_product_id on dbo.SalesOrderDetail ( ProductID)

    再运行系统视图的查询:

     对比:重建索引与更新统计

    通过上图中的"auto_created"可以知道哪些统计是由系统创建的,下面运行如下语句只更新列统计,可以通过update_date列来检查。

    update statistics SalesOrderDetail with fullscan, columns

     对比:重建索引与更新统计

    接着运行更新索引统计的语句:

    update statistics SalesOrderDetail with fullscan, index

     对比:重建索引与更新统计

    下面两条语句的执行效果是一样的(更新索引统计和更统计)

    update statistics SalesOrderDetail with fullscan 
    update statistics SalesOrderDetail with fullscan, all
    对比:重建索引与更新统计

     

    下面再运行索引重建的方式来进行比较:

    alter index ix_product_id on dbo.SalesOrderDetail rebuild

     对比:重建索引与更新统计

    最后我们来运行“重组索引”检查是否更新了统计:

    ALTER INDEX ix_product_id ON dbo.SalesOrderDetail REORGANIZE

     对比:重建索引与更新统计

    由此发现,执行索引重组并未更新任何统计。

  • 相关阅读:
    POJ 2778 DNA Sequence(AC自动机+矩阵)
    Challenge & Growth —— 从这里开始
    京东云
    [Done] Codeforces Round #562 (Div. 2) 题解
    HDU 3486 Interviewe
    Codeforces Round #529 (Div. 3) 题解
    Wannafly 挑战赛 19 参考题解
    第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 题解
    2018年长沙理工大学第十三届程序设计竞赛 题解
    POJ 3017 Cut the Sequence
  • 原文地址:https://www.cnblogs.com/tohen/p/7511648.html
Copyright © 2011-2022 走看看