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 占用时长
查询sql执行情况
复制代码
复制代码
复制代码
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;
使用游标重新组织指定库中的索引,消除索引碎片 
复制代码

Sql Server无用索引查询

posted @   兴趣就是天赋  阅读(123)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示