SQL2005重新生成索引的的存储过程 sp_rebuild_index[原创]_mssql2005

公司运营着的网站,流量很大,网站是交互式的,经常在过了三四个月的时候索引生成的碎片就很多,由于很大一部分页面没有生成静态,这就导致网站在打开的速度上会变慢。

以前都是手工右击索引重新生成,但是索引太多,操作起来费时费力,索引在网上找了个存储过程,自己整理了一下,执行的时候只需要选择相应的数据库,运行exec sp_rebuild_index即可,如下。

USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE proc [dbo].[sp_rebuild_index]
(
  @Rebuild_Fragmentation_Percent smallint = 5  -- 当逻辑碎片百分比 > 5% 重新生成索引
)
as
begin
  /* 调用方法:
  1.针对当前实例所有数据库:  exec sys.sp_MSforeachdb 'use ?;exec sp_rebuild_index'
  2.针对当前数据库:      exec sp_rebuild_index
  */

  --对系统数据库不作重新组织索引和重新生成索引
  if (db_name() in ('master','model','msdb','tempdb')) return;  

  --如果逻辑碎片(索引中的无序页)的百分比 <= 5% ,就不作重新组织索引和重新生成索引
  if not exists(select 1 from sys.dm_db_index_physical_stats(db_id(),null,null,null,null) a where a.index_id>0 and a.avg_fragmentation_in_percent > @Rebuild_Fragmentation_Percent) return

  print replicate('-',60)+char(13)+char(10)+replicate(' ',14)+N'对数据库 '+quotename(db_name())+N' 进行索引优化'+replicate(' ',20)+char(13)+char(10)  

  declare @sql nvarchar(2000),@str nvarchar(2000)

  declare cur_x cursor for
    select 'alter index '+quotename(a.name)+' on '+quotename(object_schema_name(a.object_id))+'.'+quotename(object_name(a.object_id))+' rebuild;' as [sql]
        ,N'重新生成索引:' +quotename(object_schema_name(a.object_id))+'.'+quotename(object_name(a.object_id))+'.'+quotename(a.name) as [str]
      from sys.indexes a
        inner join sys.dm_db_index_physical_stats(db_id(),null,null,null,null) b on b.object_id=a.object_id
          and b.index_id=a.index_id
      where a.index_id>0
        and b.avg_fragmentation_in_percent > @Rebuild_Fragmentation_Percent
      order by object_name(a.object_id),a.index_id

  open cur_x
  fetch next from cur_x into @sql,@str  

  while (@@fetch_status = 0)
  begin
 print @sql
    exec(@sql)

    print @str
    fetch next from cur_x into @sql,@str  

  end
  close cur_x
  deallocate cur_x 

end

你可能在执行过程中会遇到如下错误

消息 195,级别 15,状态 10,过程 sp_rebuild_index,第 24 行
'object_schema_name' 不是可以识别的 内置函数名称。

不要担心,那是由于没有安装SQL Server SP4补丁造成的,安装一下补丁即可。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索存储过程
, 索引
sql2005
索引rebuild、oracle索引rebuild、rebuild 分区索引、oracle rebuild index、alter index rebuild,以便于您获取更多的相关知识。

时间: 2024-08-01 21:51:24

SQL2005重新生成索引的的存储过程 sp_rebuild_index[原创]_mssql2005的相关文章

SQL Server 重新组织生成索引

原文:SQL Server 重新组织生成索引 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引/统计信息 概述   无论何时对基础数据执行插入.更新或删除操作,SQL Server 数据库引擎都会自动维护索引.随着时间的推移,这些修改可能会导致索引中的信息分散在数据库中(含有碎片).当索引包含的页中的逻辑排序(基于键值)与数据文件中的物理排序不匹配时,就存在碎片.碎片非常多的索引可能会降低查询性能,导致应用程序响应缓慢,所以在日常的维护工作当中就需要对索引进行检查对那些

将表数据生成SQL脚本的存储过程

存储过程|脚本|数据 作者:zlt982001 将表数据生成SQL脚本的存储过程: CREATE PROCEDURE dbo.UspOutputData @tablename sysname AS declare @column varchar(1000) declare @columndata varchar(1000) declare @sql varchar(4000) declare @xtype tinyint declare @name sysname declare @object

数据库-系统语句生成百万记录的存储过程怎么写?

问题描述 系统语句生成百万记录的存储过程怎么写? 想让数据库里自动生成百万条数据记录用存储过得应该怎么写能够在浏览器里查出显示100万条记录所用的时间

将表里的数据批量生成INSERT语句的存储过程 增强版_MsSql

有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件来生成INSERT语句的,只有借助第三方工具(third party tools) 这种脚本网上也有很多,但是网上的脚本还是欠缺一些规范和功能,例如:我只想导出特定查询条件的数据,网上的脚本都是导出全表数据 如果表很大,对性能会有很大影响 这里有一个存储过程(适用于SQLServer2005 或以上版本) -- Author: <桦仔> -- Blog

SQL2005解密已经被加密的存储过程

原文:SQL2005解密已经被加密的存储过程 SQL2005解密已经被加密的存储过程 第一步:打开DAC连接功能 第二步:在MASTER数据库创建一个解密存储过程 1 USE master 2 GO 3 CREATE PROCEDURE [dbo].[sp__windbi$decrypt] 4 ( 5 @procedure SYSNAME = NULL , 6 @revfl INT = 1 7 ) 8 AS /**//* 9 王成辉翻译整理,转贴请注明出自微软BI开拓者www.windbi.co

分页存储过程(一)使用sql2005的新函数构造分页存储过程_mssql2005

其实在很多时候设计的度还是要把握的,不至于让自己陷入[非要把它设计成万能的分页存储过程]的怪圈中才是最重要的,因为我们还要留出时间还解决其他的很多问题,个人认为适度就可以了,留出一定的空间.也因为万能是不存在的,万物在一定的范畴之内都是合理的,出了范畴可能就没有合理的了.          分页存储过程大致有下列几种 1. 利用Not in 和select top   2. 利用id大于多少和select top 3. 利用sql中的游标 4.临时表  可以参看网上的以下链接    C#中常用的

sql生成(c#调用存储过程返回数据表)代码的存储过程

GO /****** 对象: StoredProcedure [dbo].[pro_GenerateServiceFunction] 脚本日期: 08/04/2012 11:26:43 ******/ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[pro_GenerateServiceFunction]') AND type in (N'P', N'PC')) DROP PROCEDURE [d

php除去字串中的重复词,生成索引字符串

/php除去字串中的重复词,生成索引字符串,字符串参数为已经分词处理的串   //--------------------------------------------------   function getindextext($okstr,$ilen=-1)   {     if($okstr=="") return "";     $ws = explode(" ",$okstr);     $okstr = "";

将表里的数据批量生成INSERT语句的存储过程 增强版

有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的库中 目前SQL Server里面是没有相关的工具根据查询条件来生成INSERT语句的,只有借助第三方工具(third party tools) 这种脚本网上也有很多,但是网上的脚本还是欠缺一些规范和功能,例如:我只想导出特定查询条件的数据,网上的脚本都是导出全表数据 如果表很大,对性能会有很大影响 这里有一个存储过程(适用于SQLServer2005 或以上版本) -- Author: <桦仔> -- Blog