AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 791878
Accepted
parsecpython
parsecpython
Asked: 2016-07-26 11:57:18 +0800 CST2016-07-26 11:57:18 +0800 CST 2016-07-26 11:57:18 +0800 CST

如何使用 MSSQL,重建所有表上的所有索引?微软 SQL 服务器 2008

  • 772

我有一个 mssql 数据库,我们称之为:mssqlDB01。我的任务是对所有表执行碎片整理。这个数据库有几百个表,每个表的每个表都有 1 到 15 个索引。


谷歌让我发现了一种对每个表的所有索引进行碎片整理的做法,但我不知道如何在所有表上执行此操作。

ALTER INDEX ALL ON TABLENAME REBUILD;

我要找的是

ALTER INDEX ALL ON * REBUILD; 

但它抱怨

Msg 102, Level 15, State 1, Line 2
Incorrect syntax near '*'.`

下面让我找到我的数据库中的所有表

SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'

我可以以某种方式将其推送到命令中吗?

ALTER INDEX ALL ON (SELECT * FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'; ) REBUILD;
sql-server fragmentation
  • 5 5 个回答
  • 48279 Views

5 个回答

  • Voted
  1. Best Answer
    Katherine Villyard
    2016-07-26T12:50:42+08:002016-07-26T12:50:42+08:00

    您可能可以编写一个使用动态 SQL 的脚本来执行此操作,但是当您可以使用其他人的时为什么要这样做呢? Ola Hallengren最出名且免费,但Minion Ware 也有一个免费的重新索引脚本。

    如果你坚持自己写,这样的事情可能会奏效:

    Use mssqlDB01
    
    Declare @TBname nvarchar(255),
            @schema nvarchar(255),
            @SQL nvarchar(max) 
    
    
    select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
    select @schema = SCHEMA_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and TABLE_NAME = @TBname
    
    while @TBname is not null
    BEGIN
        set @SQL='ALTER INDEX ALL ON [' + @schema + '].[' + @TBname + '] REBUILD;'
        --print @SQL
        EXEC SP_EXECUTESQL @SQL
        select @TBname = min(TABLE_NAME) from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
        select @schema = SCHEMA_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' and TABLE_NAME = @TBname      
    END
    
    • 14
  2. Firdaus
    2019-01-22T03:27:43+08:002019-01-22T03:27:43+08:00
    1. 按 Ctrl + T
    2. 运行此查询:

      SELECT 'ALTER INDEX ALL ON ' + table_name + '  REBUILD;' 
          FROM Information_Schema.tables where  table_type ='BASE TABLE'
      
    3. 复制输出并将其粘贴到 SQL 窗口中,然后单击运行。

    • 7
  3. Aron
    2020-01-17T07:10:12+08:002020-01-17T07:10:12+08:00

    以@Firdaus 为基础,简单而简单的答案:

    如果您的数据库有模式,请尝试在 SSMS 中运行以下命令:

    SELECT 'ALTER INDEX ALL ON ' + TABLE_SCHEMA + '.' + table_name + '  REBUILD;' 
        FROM Information_Schema.tables where  table_type ='BASE TABLE'
    
    • 2
  4. Carlos Vásquez Polanco
    2020-07-26T14:24:33+08:002020-07-26T14:24:33+08:00

    通常,DBA 会创建一个自动化函数或拥有重建索引的工具。

    这是一个功能版本,用于重建架构中所有表的所有索引:

    DECLARE @tableSchema varchar(max), 
            @tableName varchar(max),
            @tsql nvarchar(max);
    
    DECLARE cur CURSOR FOR SELECT TABLE_SCHEMA, TABLE_NAME FROM Information_Schema.tables where  table_type ='BASE TABLE'
    
    OPEN cur 
    
    FETCH NEXT FROM cur into @tableSchema, @tableName
    
    WHILE @@FETCH_STATUS = 0 
    BEGIN
        SET @tsql ='ALTER INDEX ALL ON [' + @tableSchema + '].[' + @tableName + '] REBUILD;'
        PRINT(@tsql)
        EXEC SP_EXECUTESQL @tsql;
    FETCH NEXT FROM cur into @tableSchema, @tableName
    END
    
    CLOSE cur
    DEALLOCATE cur
    
    • 1
  5. Vedran
    2018-02-14T07:05:57+08:002018-02-14T07:05:57+08:00

    这将重建索引并保留压缩设置(如果有):

    DECLARE
        @schemaName sysname,
        @tableName sysname,
        @compressionType VARCHAR(50),
        @sql NVARCHAR(1000)
    
    DECLARE table_cursor CURSOR FAST_FORWARD
    FOR
    SELECT
        SCHEMA_NAME(t.schema_id) AS SchemaName,
        t.name AS TableName,
        p.data_compression_desc AS CompressionType
    FROM
        sys.partitions AS p
        INNER JOIN sys.tables AS t ON t.object_id = p.object_id
    WHERE
        p.index_id IN (0, 1)
    
    OPEN table_cursor
    
    FETCH NEXT FROM table_cursor
    INTO @schemaName, @tableName, @compressionType
    
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sql = 'ALTER INDEX ALL ON [' + @schemaName + '].[' + @tableName + '] REBUILD'
            + CASE WHEN @compressionType <> 'NONE' 
                THEN ' PARTITION = ALL WITH(DATA_COMPRESSION = ' + @compressionType + ')'
                ELSE ''
              END
    
        PRINT @sql
        EXEC sys.sp_executesql @SQL
    
        FETCH NEXT FROM table_cursor   
        INTO @schemaName, @tableName, @compressionType
    END
    
    CLOSE table_cursor;  
    DEALLOCATE table_cursor;  
    
    • 0

相关问题

  • sql server 连接字符串上的网络数据包大小以提高吞吐量

  • 基于 Microsoft 的服务器(IIS、MSSQL 等)上的病毒扫描应排除哪些内容?

  • SQL 洗衣清单

  • OPENROWSET、二进制文件、varchars 和 varbinaries

  • 聚集索引与非聚集索引?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve