SQL2008R2的 遍历所有表更新统计信息 和 索引重建

----------------------------------------------

【2.以下是更新统计信息】

 DECLARE UpdateStatisticsTables CURSOR READ_ONLY FOR
      SELECT sst.name,
             Schema_name(sst.schema_id)
      FROM   sys.tables sst
      WHERE  sst.TYPE = ‘U‘
    DECLARE @name   VARCHAR(80),
            @schema VARCHAR(40)

    OPEN UpdateStatisticsTables

    FETCH NEXT FROM UpdateStatisticsTables INTO @name, @schema

    WHILE ( @@FETCH_STATUS <> -1 )
      BEGIN
          IF ( @@FETCH_STATUS <> -2 )
            BEGIN
                    DECLARE @sql NVARCHAR(1024)
            SET @sql=‘UPDATE STATISTICS ‘ + Quotename(@schema)
                               +
                               ‘.‘ + Quotename(@name)
                      EXEC Sp_executesql @sql
            END

          FETCH NEXT FROM UpdateStatisticsTables INTO @name, @schema
      END

    CLOSE UpdateStatisticsTables

    DEALLOCATE UpdateStatisticsTables

    GO
    
UPDATE STATISTICS tblCompany  -- 表名
USE tblCompany; -- 数据库名
EXEC sp_updatestats -- 更新所有表统计信息

-------------------------------------------------

【1.以下是索引重建】

摘自: http://www.cnblogs.com/shijun/archive/2012/04/21/2461737.html

项目升级数据库由SQL2000升级到2008R2,今天对数据库表进行碎片扫描,发现有些表碎片较大,于是决定重建索引,联机帮助是最好的老师,将相关脚本摘录备后查。

参考sys.dm_db_index_physical_stats

SELECT
    OBJECT_NAME(object_id) as objectname,
    object_id AS objectid,
    index_id AS indexid,
    partition_number AS partitionnum,
    avg_fragmentation_in_percent AS fra
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, ‘LIMITED‘)
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;

使用脚本中的 sys.dm_db_index_physical_stats 重新生成或重新组织索引 (来源于联机帮助

SET NOCOUNT ON;
DECLARE @objectid int;
DECLARE @indexid int;
DECLARE @partitioncount bigint;
DECLARE @schemaname nvarchar(130);
DECLARE @objectname nvarchar(130);
DECLARE @indexname nvarchar(130);
DECLARE @partitionnum bigint;
DECLARE @partitions bigint;
DECLARE @frag float;
DECLARE @command nvarchar(4000);
-- Conditionally select tables and indexes from the sys.dm_db_index_physical_stats function
-- and convert object and index IDs to names.
SELECT
    object_id AS objectid,
    index_id AS indexid,
    partition_number AS partitionnum,
    avg_fragmentation_in_percent AS frag
INTO #work_to_do
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL , NULL, ‘LIMITED‘)
WHERE avg_fragmentation_in_percent > 10.0 AND index_id > 0;

-- Declare the cursor for the list of partitions to be processed.
DECLARE partitions CURSOR FOR SELECT * FROM #work_to_do;

-- Open the cursor.
OPEN partitions;

-- Loop through the partitions.
WHILE (1=1)
    BEGIN;
        FETCH NEXT
           FROM partitions
           INTO @objectid, @indexid, @partitionnum, @frag;
        IF @@FETCH_STATUS < 0 BREAK;
        SELECT @objectname = QUOTENAME(o.name), @schemaname = QUOTENAME(s.name)
        FROM sys.objects AS o
        JOIN sys.schemas as s ON s.schema_id = o.schema_id
        WHERE o.object_id = @objectid;
        SELECT @indexname = QUOTENAME(name)
        FROM sys.indexes
        WHERE  object_id = @objectid AND index_id = @indexid;
        SELECT @partitioncount = count (*)
        FROM sys.partitions
        WHERE object_id = @objectid AND index_id = @indexid;

-- 30 is an arbitrary decision point at which to switch between reorganizing and rebuilding.
        IF @frag < 30.0
            SET @command = N‘ALTER INDEX ‘ + @indexname + N‘ ON ‘ + @schemaname + N‘.‘ + @objectname + N‘ REORGANIZE‘;
        IF @frag >= 30.0
            SET @command = N‘ALTER INDEX ‘ + @indexname + N‘ ON ‘ + @schemaname + N‘.‘ + @objectname + N‘ REBUILD‘;
        IF @partitioncount > 1
            SET @command = @command + N‘ PARTITION=‘ + CAST(@partitionnum AS nvarchar(10));
        EXEC (@command);
        PRINT N‘Executed: ‘ + @command;
    END;

-- Close and deallocate the cursor.
CLOSE partitions;
DEALLOCATE partitions;

-- Drop the temporary table.
DROP TABLE #work_to_do;
GO

SQL2008R2的 遍历所有表更新统计信息 和 索引重建,布布扣,bubuko.com

时间: 2024-12-26 12:04:33

SQL2008R2的 遍历所有表更新统计信息 和 索引重建的相关文章

为准确生成执行计划更新统计信息-analyze与dbms_stats

如果我们想让CBO利用合理利用数据的统计信息,正确判断执行任何SQL查询时的最快途径,需要及时的使用analyze命令或者dbms_stats重新统计数据的统计信息. 例如索引跳跃式扫描(INDEX SKIP SCAN)例子中,如果不对表EMPLOYEE 及索引收集一下统计信息,就不是INDEX SKIP SCAN策略了. 分析统计信息 analyze table 一般可以指定分析: 表,所有字段,所有索引字段,所有索引. 若不指定则全部都分析. ---table统计信息 analyze tab

10G,11G恢复表的统计信息

10G,11G恢复表的统计信息 适用的Oracle Version 10.1.0.2 to 11.2.0.3   oracle 10G开始,当一个表生成新的统计信息的同时,该表的旧统计信息会保留,如果以后依赖该旧统计信息的查询出现性能问题,可以恢复旧的统计信息使该查询使用先前的统计信息来解决可能出现的性能问题oracle 10g,11g 中oracle 对象统计信息默认的保存时间是31天,统计信息在sysaux表空间有存储开销,应该注意sysaux不要被统计信息填满 sql> select DB

MySQL 5.6为什么关闭元数据统计信息自动更新&统计信息收集源代码探索

问题描述: MySQL 5.5.15 原sql如下: select constraint_schema,table_name,constraint_name,constraint_type from information_schema.table_constraints where table_schema not in ('information_schema', 'mysql', 'test','performance_schema'); 不只是上面提到的table_constraints

理解统计信息(4/6):自动更新统计信息的阀值——人为更新统计信息的重要性

在理解统计信息(3/6):谁创建和管理统计信息?在性能调优中,统计信息的作用里我们讨论了统计信息的自动创建和自动更新.我们真的需要人为维护统计信息来保持性能最优?答案是肯定的,这取决与你的工作量.SQL Server只在达到阀限值时进行统计信息的自动更新.当大量的Insert/Update/Delete操作发生时,内建的自动更新统计信息不能持续保证性能的最优. 经过一系列的Insert/Update/Delete后,统计信息可能不会是最新.如果SQL Server查询优化器在表里需要指定列的统计

第十二章——SQLServer统计信息(1)——创建和更新统计信息

原文:第十二章--SQLServer统计信息(1)--创建和更新统计信息 简介: 查询的统计信息: 目前为止,已经介绍了选择索引.维护索引.如果有合适的索引并实时更新统计信息,那么优化器会选择有用的索引供查询之用,因为SQLServer优化器是基于开销的优化.当在where和on上的列上的数据需要显示在结果集的时候,如果有实时的统计信息,优化器会选择最好的执行方式,因为优化器会从统计信息中获得这些数据的明细情况. 在创建索引的时候,SQLServer就会在索引列上创建统计信息.简单来说,统计信息

ORACLE索引失效,更新统计信息

有时候建立索引的时候不走索引,排除了字段数据问题和sql写法问题之外,应该是统计信息有问题,得重新收集. 一:解锁统计信息 为了稳定执行计划,一般统计信息都会被锁住的,在更新统计信息的时候得先解锁. ①按用户schema解锁: EXEC DBMS_STATS.UNLOCK_schema_STATS('user_name'); ②按表模式解锁:先查出被锁定的表 select table_name from user_tab_statistics where stattype_locked is n

SQL Server重建索引与重组索引会更新统计信息吗?

在SQL Server中重建索引(Rebuild Index)与重组索引(Reorganize Index)会触发统计信息更新吗? 那么我们先来测试.验证一下: 我们以AdventureWorks2014为测试环境,如下所示: Person.Person表的统计信息最后一次更新为2014-07-17 16:11:31,如下截图所示:   DECLARE @table_name NVARCHAR(32); SET @table_name='Person.Person' SELECT sch.nam

oracle表的统计信息完全正确,执行计划无故改变。原厂人员如是回复

就像在电话里提到的那样,Oracle内部的优化器是根据一系列的内部算法基于表上的统计信息来产生执行计划的.对于特别复杂的SQL语句,Oracle的优化器有一定几率不能得到最优的执行计划(因为机器代码实际上是比较死板的,虽然得到的执行计划按照内部的算法来看是比较快的,但是实际上这个执行计划可能在实际执行中比较慢).我们现在碰到的就是这种情况,虽然表的统计信息是准的,但恰恰优化器在基于这个统计信息使用内部算法得到的执行计划是不优化的一这是优化器的固有限制.这时候就需要DBA/Oracle Suppo

数据库参数调优--自动更新统计信息

数据库参数调优--自动更新统计信息 原文: https://blog.csdn.net/z10843087/article/details/78356975 背景 我们都知道SQL SERVER 借助统计信息来产生执行计划,而过时的统计信息会导致SQL SERVER选择错误的执行计划,导致严重的性能问题.  在数据库中选项可以自动的更新统计信息.如下图: 默认他是开启的,所以我们很少去关注他或者修改他. 异步更新和同步更新 其实除了同步更新统计信息外,还有一个异步更新统计信息的选项.他和同步更新