【2.如下是更新統計信息】html
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 -- 更新全部表統計信息
-------------------------------------------------sql
【1.如下是索引重建】 數據庫
摘自: http://www.cnblogs.com/shijun/archive/2012/04/21/2461737.htmloop
項目升級數據庫由SQL2000升級到2008R2,今天對數據庫表進行碎片掃描,發現有些表碎片較大,因而決定重建索引,聯機幫助是最好的老師,將相關腳本摘錄備後查。ui
參考sys.dm_db_index_physical_statsspa
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 從新生成或從新組織索引 (來源於聯機幫助)code
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