1. 程式人生 > >SQLServer 索引重建儲存過程

SQLServer 索引重建儲存過程

SQLServer建議索引碎片在5%--30%之間用重新組織索引(REORGANIZE),超過30%的重新生成索引(REBUILD)

生成索引可以線上也可以離線(ONLINE = OFF):離線索引不能訪問。

USE [zws]

GO


/****** Object:  StoredProcedure [dbo].[p_index_rebuild]    Script Date: 2018/1/9 11:05:22 ******/
SET ANSI_NULLS ON
GO


SET QUOTED_IDENTIFIER ON
GO






CREATE  PROCEDURE [dbo].[p_index_rebuild]
AS


BEGIN
        -- 動態建立日誌表
IF NOT EXISTS (SELECT 1 FROM SYS.objects A WHERE A.object_id=OBJECT_ID('DBO.SYS_REINDEX_LOG'))
BEGIN
CREATE TABLE DBO.SYS_REINDEX_LOG(start_time datetime,
 end_time   datetime,
 DBName     VARCHAR(100),
 SchemaName VARCHAR(100),
 table_name    VARCHAR(100),
 index_name    VARCHAR(100),
 index_type    VARCHAR(100),
 Duration      INT,         -- 執行時間(秒)
 Sql_Text      VARCHAR(500),
 is_success    int
 )
END


-- 動態建立重建索引列表
IF NOT EXISTS (SELECT 1 FROM SYS.objects A WHERE A.object_id=OBJECT_ID('DBO.REINDEX_LIST'))
BEGIN
CREATE TABLE DBO.REINDEX_LIST   (DBName     VARCHAR(100),
 SchemaName VARCHAR(100),
 table_name    VARCHAR(100),
 index_name    VARCHAR(100),
 index_type    VARCHAR(100),
 page_count    int,
 fragment_per  numeric(18, 6),
 rn            int
 )
END


    --判斷資料庫版本
--根據索引型別排序,聚集索引放在前面
DECLARE @sqlversion INT,@sql NVARCHAR(2000);
IF (@@VERSION LIKE '%Enterprise%' OR @@VERSION LIKE '%Evaluation%' OR @@VERSION LIKE '%Developer%') SET @sqlversion=1;
IF SUBSTRING(@@VERSION,22,4) < '2008' SET @sqlversion=-1;
IF @sqlversion=-1
set @sql='insert into DBO.REINDEX_LIST (DBName,
SchemaName,
table_name,
index_name,
index_type,
page_count,
fragment_per,
rn
)
SELECT '''' DBName,
'''' SchemaName,
o.name table_name,
i.name as index_name,
i.type_desc index_type,
0 as page_count,
0 AS fragment_per,
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) rn
FROM sys.indexes i INNER JOIN sys.objects o ON o.object_id=i.object_id 
WHERE o.type=''U'' AND i.type IN (1,2)
ORDER BY charindex(i.type_desc,'',CLUSTERED,NONCLUSTERED,'')';
ELSE
SET  @sql='insert into DBO.REINDEX_LIST (DBName,
SchemaName,
table_name,
index_name,
index_type,
page_count,
fragment_per,
rn
)
SELECT DB_NAME(A.database_id) DBName,d.name SchemaName,b.name table_name,c.name as index_name,a.index_type_desc index_type,a.page_count,a.avg_fragmentation_in_percent fragment_per,
ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) rn
FROM sys.dm_db_index_physical_stats(DB_ID(),NULL,NULL,NULL,''LIMITED'')  as a  
INNER JOIN sys.objects AS b ON a.object_id =b.object_id   and b.type=''U''
INNER JOIN sys.indexes AS c ON a.object_id=c.object_id and a.index_id=c.index_id 
INNER JOIN sys.schemas AS d ON b.SCHEMA_ID=d.schema_id 
WHERE a.index_id>0 
AND a.page_count>8
and b.type=''U''
and a.avg_fragmentation_in_percent>10
ORDER BY charindex(a.index_type_desc,'',CLUSTERED INDEX,NONCLUSTERED INDEX,'' )';


--截斷表
truncate table  DBO.REINDEX_LIST;
exec(@sql);


declare @n int;
     declare @i int=1;
declare @tart_time datetime;
declare @end_time  datetime;
declare @DBName    VARCHAR(100);
declare @SchemaName VARCHAR(100);
declare @table_name VARCHAR(100);
     declare @index_name VARCHAR(100);
     declare @index_type VARCHAR(100);
declare @sqlindex NVARCHAR(1000);


select @n=count(*) from DBO.REINDEX_LIST;
while  isnull(@n,0)>0 and @i<
[email protected]

      begin
       SQLBEGIN:
                BEGIN
                 select @DBName=DBName,@SchemaName=SchemaName,@table_name=table_name,@index_name=index_name,@index_type=index_type from DBO.REINDEX_LIST where [email protected];
                END
      
   BEGIN TRY
       if @sqlversion=-1
  begin
      SET @sqlindex=N' DBCC DBREINDEX('+ @table_name +',['
[email protected]
_name+'])';
  end
if @sqlversion=1
  begin
      SET @sqlindex=N' ALTER INDEX ['[email protected]_name+'] ON '+ @SchemaName +'.'+ @table_name +' REBUILD' 
  end


  set @tart_time=getdate();
  exec(@sqlindex);
  set @end_time=getdate();
     insert into DBO.SYS_REINDEX_LOG(start_time,
 end_time,
 DBName,
 SchemaName,
 table_name,
 index_name,
 index_type,
 Duration,         -- 執行時間(秒)
 Sql_Text,
 is_success
         )
values(@tart_time,@end_time,@DBName,@SchemaName,@table_name,@index_name,@index_type,DATEDIFF(ss,@tart_time,@end_time),@sqlindex,1);
SET @
[email protected]
+1;
                END TRY


       BEGIN CATCH
         SET @[email protected]+1
                      insert into DBO.SYS_REINDEX_LOG(start_time,
 end_time,
 DBName,
 SchemaName,
 table_name,
 index_name,
 index_type,
 Duration,         -- 執行時間(秒)
 Sql_Text,
 is_success
         )
values(@tart_time,@end_time,@DBName,@SchemaName,@table_name,@index_name,@index_type,DATEDIFF(ss,@tart_time,@end_time),@sqlindex,0);
         GOTO SQLBEGIN
       END CATCH


      end;






END;








GO




相關推薦

SQLServer 索引重建儲存過程

SQLServer建議索引碎片在5%--30%之間用重新組織索引(REORGANIZE),超過30%的重新生成索引(REBUILD)生成索引可以線上也可以離線(ONLINE = OFF):離線索引不能訪問。USE [zws]GO/****** Object:  StoredP

重建所有表的索引儲存過程

create or replace procedure p_rebuild_all_index    (tablespace_name in varchar2,--這裡是表空間名,如果不改變表空間,可以傳入null    only_unusable in boolean) 

SQLServer之修改儲存過程

修改儲存過程注意事項 只能修改先前在 SQL Server 中通過執行 CREATE PROCEDURE 語句建立的過程。 Transact-SQL 儲存過程修改為 CLR 儲存過程,反之亦然。 ALTER PROCEDURE 不會更改許可權,也不影響相

檢視、索引儲存過程簡述與優缺點

1.檢視 (1).什麼是檢視? 檢視(View)作為一種資料庫物件,為使用者提供了一個可以檢索資料表中的資料方式。使用者通過檢視來瀏覽資料表中感興趣的部分或全部資料,而資料的物理儲存位置仍然在表中。 檢視是一個虛擬表,並不代表任何物理資料,只是用來檢視資料的視窗而已。檢視並不是以一組資料的形式儲存在

Sqlserver 遊標&儲存過程&臨時表混合使用例項

通過巢狀,根據表中記錄的表名與列名到指定位置取值。 --宣告儲存過程 ProPIMS if (exists (select * from sys.objects where name = 'ProPIMS')) drop proc ProPIMS go create procedure

SQLServer之建立儲存過程

建立儲存過程注意事項 在 SQL Server、 Azure SQL Database、Azure SQL 資料倉庫和並行資料庫中建立 Transact-SQL 或公共語言執行時 (CLR) 儲存過程,儲存過程與其他程式語言中的過程類似。 可以在當前資料庫中建立永久過程,

sqlServer分頁儲存過程的呼叫

現象: sqlServer的分頁一直相對比較複雜。這裡使用儲存過程實現分頁邏輯 解決辦法 1:action獲取查詢的條件,初始化每頁顯示的大小,page代表當前檢視第幾頁,預設設定為第一頁。rows表示每頁顯示的大小。sort代表查詢按什麼欄位排序 如果要

sqlserver 練習題目(儲存過程:迴圈erp資料表,生成另一個表資料)

– ##表結構 ### use test_db; CREATE TABLE [dbo].[GYGDFT]( [任務單號] varchar NOT NULL, [任務序號] [int] NULL, [品號] varchar NULL, [生產數量

SQLServer之刪除儲存過程

刪除儲存過程注意事項 在刪除任何儲存過程之前,請檢查依賴物件,並且相應地修改這些物件。 如果沒有更新這些物件,則刪除儲存過程可能會導致依賴物件和指令碼失敗。 若要顯示現有過程的列表,請查詢 sys.objects 目錄檢視。 若要顯示過程定義,請查詢 sys.sql_mo

mssql sqlserver 自動備份儲存過程的方法分享

create trigger [tr_procChange] on all server for CREATE_PROCEDURE,ALTER_PROCEDURE as --獲取事件資料 DECLARE @data XML SET @data = EVENTDATA() decl

sqlserver轉mysql儲存過程的經驗

最近專案需要將sqlserver儲存過程轉為mysql的,遇到了很多問題,最後終於做完成了.但是一開始速度不盡人意.後經過反覆測試找到了一下提升儲存過程效率的建議. 1.使用記憶體臨時表顯著提高查詢

Sqlserver中查詢儲存過程是否包含某些文字

select sysobjects.name, sysobjects.id,syscomments.text from sysobjects,syscomments where sysobjects.id=syscomments.id and  syscomments.tex

檢視、索引儲存過程優缺點

1.檢視 (1).什麼是檢視? 檢視(View)作為一種資料庫物件,為使用者提供了一個可以檢索資料表中資料的方式。使用者通過檢視來瀏覽資料表中感興趣的部分或全部資料,而資料的物理儲存位置仍然在表中。 檢視是一個虛擬表,並不代表任何物理資料,只是用來檢視資料

Sqlserver定時執行儲存過程

在啟動時恢復了最後一個數據庫後,即開始執行儲存過程。若要跳過這些儲存過程的執行,請將啟動引數指定為跟蹤標記 4022。假如以最低配置啟動 SQL Server(使用 -f 標記),則啟動儲存過程也不會執行。有關更多資訊,請參見跟蹤標記。 

淺談 sqlserver 和 mysql儲存過程、函式的區別

其實我不太喜歡搞資料庫,平常也就是用用select、insert。這次公司要把資料庫從sqlserver遷到mysql,我也試著改了幾個儲存過程,在此總結。首先吐槽一句,sqlserver和 mysql差別還真大! 區別一:儲存過程入參 USE [LearningRep

SqlServer遊標、儲存過程及資料塊執行

資料塊遊標事例如下: begin declare @item_code varchar(32)--定義變數 declare @item_name varchar(32) declare @invest_money_sum float --定義遊標 declare

記一次Oracle分割槽表全域性索引重建過程

1、查詢資料庫各個表空間利用率:   SELECT Upper(F.TABLESPACE_NAME) "表空間名", D.TOT_GROOTTE_MB "表空間大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空間(M)",

2020重新出發,MySql基礎,MySql檢視&索引&儲存過程&觸發器

@[toc] # 檢視是什麼 **檢視在資料庫中的作用類似於窗戶,使用者可以通過這個視窗看到只對自己有用的資料。既保障了資料的安全性,又大大提高了查詢效率**。 **MySQL 檢視(View)是一種虛擬存在的表,同真實表一樣,檢視也由列和行構成,但檢視並不實際存在於資料庫中**。行和列的資料來自於定義檢

SQLserver的事務,索引,檢視,函式,儲存過程

一.事務      在sqlserver中當出現多條語句時,當其中有一條不合理,不會停止下來,      因此,我們會用事務去解決這個問題,當有一個錯誤時,不允許往下繼續進行,     只有當全部正確時,才給予通過。     事務開啟:begin transaction

sqlserver查詢資料庫所有儲存過程、觸發器、索引資訊

1. 查詢所有儲存過程 select Pr_Name as [儲存過程], [引數]=stuff((select ','+[Parameter] from ( select Pr.Name as Pr