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<
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 +',['
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 @
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