发布于 2016-01-05 02:04:19 | 423 次阅读 | 评论: 0 | 来源: PHPERZ
这里有新鲜出炉的SQL Server教程,程序狗速度看过来!
SQL Server 数据库
SQL Server 即 Microsoft SQL Server 。
SQL是英文Structured Query Language的缩写,意思为结构化查询语言。SQL语言的主要功能就是同各种数据库建立联系,进行沟通。按照ANSI(美国国家标准协会)的规定,SQL被作为关系型数据库管理系统的标准语言。
整个数据库的索引很多,索引碎片多了,不可能一个个的去重建,都是重复性的工作,所以索性写了个存储过程,按范围需要重建索引。
1 -- =============================================
2 -- Author: <Limy>
3 -- Create date: <2015-12-31>
4 -- Description: <批量重建索引>
5 -- EXEC pr_BatchRebuildIndex 'dbo','DatabaseLog','PK_DatabaseLog_DatabaseLogID',0
6 -- =============================================
7 alter proc pr_BatchRebuildIndex
8 --@DataBase nvarchar(50)=null,--数据库名称,必输项
9 @Scheme nvarchar(50)=null,--架构名称
10 @TableName nvarchar(50)=null, --要重建索引的表名称,为空表示所有表
11 @IndexName nvarchar(200)=null ,--要重建的索引名称
12 @FragmentPercent decimal(10,5)=0 --碎片率为多少以上的药重建
13 AS
14 BEGIN
15
16 DECLARE @Sql nvarchar(2000);
17 DECLARE @RebuildSql nvarchar(2000);
18 DECLARE @ERROR nvarchar(500);
19 DECLARE @Tables table(TableName nvarchar(100), Indexid int,IndexName nvarchar(200), FragmentPercent decimal(10,5));
20
21 ----判断数据库是否存在
22 --IF DB_ID(@DataBase) is null
23 --BEGIN
24 -- RAISERROR('数据库不存在,请输入正确的数据库名称!',16,1);
25 -- RETURN -1;
26 --END
27
28
29 --判断架构是否存在
30 IF isnull(@Scheme,'')<>'' and SCHEMA_ID(@Scheme) is null
31 BEGIN
32 RAISERROR('架构不存在,请输入正确的架构名称!',16,1);
33 RETURN -1;
34 END
35
36
37 --表存不存在
38 IF isnull(@TableName,'')<>''
39 BEGIN
40 --有架构
41 IF isnull(@Scheme,'')<>'' and SCHEMA_ID(@Scheme) is null
42 BEGIN
43 IF OBJECT_ID(@Scheme+'.'+@TableName) is null
44 BEGIN
45 SET @ERROR='表不存在,请输入正确的表名称!'
46 RAISERROR(@ERROR,16,2);
47 RETURN -1;
48 END
49 END
50 --没有架构
51 IF not exists(select 1 from sys.tables as A where A.name=@TableName )
52 BEGIN
53 SET @ERROR='表不存在,请输入正确的表名称!'
54 RAISERROR(@ERROR,16,5);
55 RETURN -1;
56 END
57 END
58
59 --索引存不存在
60 IF isnull(@IndexName,'')<>''
61 BEGIN
62 IF not exists(select 1 from sys.SysObjects where name=@IndexName and (xtype=N'UQ' OR xtype=N'PK') )
63 BEGIN
64 RAISERROR('索引不存在,请输入正确的索引名称!',16,3);
65 RETURN -1;
66 END
67 END
68
69 --如果表名为空表示所有表,如果索引为空表示所有索引
70 --默认查询所有表,所有索引,所有百分比
71
72 SET @Sql='SELECT D.name+''.''+object_name(a.object_id) [TableName] ,a.index_id ,B.name [IndexName] ,avg_fragmentation_in_percent
73 FROM sys.dm_db_index_physical_stats ( DB_ID() , NULL , NULL, NULL, NULL ) AS A
74 JOIN sys.indexes AS B ON a.object_id = b.object_id AND a.index_id = b.index_id
75 inner JOIN sys.tables AS C ON a.object_id=C.object_id
76 inner JOIN sys.schemas AS D ON C.schema_id=D.schema_id
77 WHERE a.index_id > 0 '
78
79 IF isnull(@Scheme,'') <>''
80 BEGIN
81 SET @Sql +=' and D.name= '''+@Scheme+''' ';
82 END
83 IF isnull(@TableName,'')<>''
84 BEGIN
85 SET @Sql +=' and object_name(a.object_id)= '''+@TableName+''' ';
86 END
87 IF isnull(@IndexName,'')<>''
88 BEGIN
89 SET @Sql +=' and B.name= '''+@IndexName+''' ';
90 END
91
92 IF isnull(@FragmentPercent,0)>0
93 BEGIN
94 SET @Sql +=' and avg_fragmentation_in_percent>= '+convert(nvarchar(10),@FragmentPercent)+' ';
95 END
96
97 INSERT INTO @Tables
98 EXEC (@Sql)
99 select '重建前',* from @Tables
100
101 DECLARE cur cursor for
102 select TableName, IndexName from @Tables
103 OPEN cur
104 DECLARE @tbName NVARCHAR(100),@IXName NVARCHAR(200)
105 FETCH NEXT FROM cur INTO @tbName,@IXName
106 WHILE(@@fetch_status=0)
107 BEGIN
108 SET @RebuildSql='alter index ['+@IXName+'] on '+@tbName+' rebuild' --要加上[],否则索引里有空格会报错
109 EXEC (@RebuildSql)
110 FETCH NEXT FROM cur INTO @tbName,@IXName
111 END
112 CLOSE cur
113 DEALLOCATE cur
114
115 --重建后查询
116 delete @Tables
117 INSERT INTO @Tables
118 EXEC (@Sql)
119 select '重建后',* from @Tables
120
121 Print N'执行完毕!';
122 return 0;
123 END
本人才疏学浅,如有不合理之处,欢迎拍砖。