Sql Server索引脚本

DECLARE @tablename sysname; DECLARE @strsql NCHAR(500); DECLARE tableNameCursor CURSOR FOR SELECT b.name FROM sysobjects b WHERE xtype = 'U' AND b.name NOT IN ( SELECT OBJECT_NAME(a.parent_obj) FROM sysobjects a WHERE xtype = 'PK' ); OPEN tableNameCursor; FETCH NEXT FROM tableNameCursor INTO @tablename; WHILE @@FETCH_STATUS = 0 BEGIN PRINT @tablename; SET @strsql = 'alter table ' + @tablename + ' add primary key (id) '; PRINT @strsql; EXEC (@strsql); FETCH NEXT FROM tableNameCursor INTO @tablename; END; CLOSE tableNameCursor; DEALLOCATE tableNameCursor;

SELECT TOP 20 qs.creation_time, last_execution_time, total_physical_reads, total_logical_reads, total_logical_writes, DB_NAME(dbid) dbname, execution_count, --, total_worker_time last_worker_time, --,substring(convert(char(23),DATEADD(ms,total_worker_time/1000,0),121),12,23) total_worker_time --, total_elapsed_time last_elapsed_time, SUBSTRING(CONVERT(CHAR(23), DATEADD(ms, total_elapsed_time / 1000, 0), 121), 12, 23) total_elapsed_time, --, total_elapsed_time / execution_count avg_elapsed_time SUBSTRING(CONVERT(CHAR(23), DATEADD(ms, (total_elapsed_time / execution_count) / 1000, 0), 121), 12, 23) avg_elapsed_time, SUBSTRING( st.text, (qs.statement_start_offset / 2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset ) / 2 ) + 1 ) AS statement_text FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st --ORDER BY execution_count desc 计划执行总次数 ORDER BY total_elapsed_time; --计划执行总时长 --order by last_worker_time desc;--最近一次执行cpu 占用时长

SELECT [statement] 表名称, 'CREATE INDEX [IX_' + SO.name + '_' + REPLACE( REPLACE(REPLACE(REPLACE(ISNULL(equality_columns, included_columns), '[', ''), ']', ''), ',', '_'), ' ', '' ) + '] ON ' + SO.name + '(' + ISNULL(equality_columns, '') + CASE WHEN equality_columns IS NOT NULL AND inequality_columns IS NOT NULL THEN ',' ELSE '' END + ISNULL(inequality_columns, '') + ')' + ISNULL(' INCLUDE (' + included_columns + ')', '') + ' WITH(FILLFACTOR = 90, PAD_INDEX = ON)' AS 索引创建脚本, avg_user_impact 收益百分比, avg_total_user_cost 减少成本, avg_total_user_cost * avg_user_impact * (user_scans + user_seeks) AS 综合收益 FROM sys.dm_db_missing_index_groups AS G INNER JOIN sys.dm_db_missing_index_group_stats AS GS ON G.index_group_handle = GS.group_handle INNER JOIN sys.dm_db_missing_index_details AS D ON G.index_handle = D.index_handle INNER JOIN sysobjects AS SO ON SO.id = D.object_id ORDER BY 综合收益 DESC;

SELECT o.name AS table_name, i.name AS index_name, i.type_desc AS index_type, c.name AS index_column_name, i.index_id, ic.index_column_id FROM sys.objects o INNER JOIN sys.indexes i ON o.object_id = i.object_id INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id INNER JOIN sys.columns c ON o.object_id = c.object_id AND ic.column_id = c.column_id WHERE o.name = 'PJPY_CollegeNumOrMoneyLimit' ORDER BY i.index_id, ic.index_column_id;

SELECT t.name 表名称, s.record_count 数据量, i.name 索引名称, s.avg_fragmentation_in_percent 碎片百分比, CASE WHEN s.avg_fragmentation_in_percent > 30 THEN 'alter index ' + i.name + ' on dbo.' + t.name + ' rebuild' WHEN s.avg_fragmentation_in_percent > 5 THEN 'alter index ' + i.name + ' on dbo.' + t.name + ' reorganize' ELSE '无需整理' END 碎片整理脚本 FROM sys.tables t JOIN sys.indexes i ON i.object_id = t.object_id AND i.name IS NOT NULL INNER JOIN sys.dm_db_index_physical_stats(DB_ID(), object_id('tablename'), NULL, NULL, 'sampled') s ON s.object_id = i.object_id AND s.index_id = i.index_id AND s.alloc_unit_type_desc = 'IN_ROW_DATA' WHERE s.avg_fragmentation_in_percent>5 ORDER BY 碎片百分比 DESC;

1 SET NOCOUNT ON; 2 --R_T层游标取出当前数据库所有表 3 DECLARE R_T CURSOR FOR SELECT name FROM sys.tables; 4 DECLARE @T VARCHAR(50); 5 OPEN R_T; 6 FETCH NEXT FROM R_T 7 INTO @T; 8 WHILE @@fetch_status = 0 9 BEGIN 10 --R_index游标判断指定表索引碎片情况并优化 11 DECLARE R_Index CURSOR FOR 12 SELECT t.name, 13 i.name, 14 s.avg_fragmentation_in_percent 15 FROM sys.tables t 16 JOIN sys.indexes i 17 ON i.object_id = t.object_id 18 JOIN sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(@T), NULL, NULL, 'limited') s 19 ON s.object_id = i.object_id 20 AND s.index_id = i.index_id; 21 DECLARE @TName VARCHAR(50), 22 @IName VARCHAR(50), 23 @avg INT, 24 @str VARCHAR(500); 25 OPEN R_Index; 26 FETCH NEXT FROM R_Index 27 INTO @TName, 28 @IName, 29 @avg; 30 WHILE @@fetch_status = 0 31 BEGIN 32 IF @avg >= 30 --如果碎片大于30,重建索引 33 BEGIN 34 SET @str = 'alter index ' + RTRIM(@IName) + ' on dbo.' + QUOTENAME(RTRIM(@TName)) + ' rebuild'; 35 END; 36 ELSE --如果碎片小于30,重新组织索引 37 BEGIN 38 SET @str = 'alter index ' + RTRIM(@IName) + ' on dbo.' + QUOTENAME(RTRIM(@TName)) + ' reorganize'; 39 END; 40 PRINT @str; 41 EXEC (@str); --执行 42 FETCH NEXT FROM R_Index 43 INTO @TName, 44 @IName, 45 @avg; 46 END; 47 --结束r_index游标 48 CLOSE R_Index; 49 DEALLOCATE R_Index; 50 FETCH NEXT FROM R_T 51 INTO @T; 52 END; 53 --结束R_T游标 54 CLOSE R_T; 55 DEALLOCATE R_T; 56 SET NOCOUNT OFF;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构