【问题标题】:How to ALTER INDEX for every Table in my DataBase如何为我的数据库中的每个表更改索引
【发布时间】:2012-01-09 17:27:22
【问题描述】:

我使用的是 SQL Server 2008 R2,我需要为数据库中的每个表重建索引

使用这个脚本,我收到一个错误

USE myDb
GO

EXEC sp_MSForEachTable 'ALTER INDEX ALL ON ? REBUILD'

错误:

ALTER INDEX 失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。验证 SET 选项是 正确用于计算列上的索引视图和/或索引 和/或过滤索引和/或查询通知和/或 XML 数据 类型方法和/或空间索引操作。

知道如何解决吗?谢谢

【问题讨论】:

标签: sql sql-server-2008 sql-server-2008-r2


【解决方案1】:

SQL Fool (Michelle Ufford) 有一个很棒的脚本可以为您执行此操作 - 所有这些都已完成并经过许多用户的良好测试。

这是一项很棒的工作 - 它允许您定义碎片级别

  • 什么都不做
  • 重组索引
  • 重建索引

不要重新发明轮子 - just go see and use the script!

【讨论】:

  • 感谢 Marc 提供的资源
  • @marc_s 您介意提供实际答案吗?我无法访问链接的网站,不幸的是,这个答案几乎毫无价值
  • @Breeze:抱歉,脚本超过 1000 行 - 太长,无法在此处发布。你可以尝试通过这个直接下载地址抓取它:sqlfool.com/wp-content/uploads/2011/06/…
  • 感谢您的链接。尽管它是一个旧脚本,但它似乎仍然非常适合我的目的!
【解决方案2】:

我决定用一个简单的方法来回答我的问题。代码来自:http://blog.sqlauthority.com/2009/01/30/sql-server-2008-2005-rebuild-every-index-of-all-tables-of-database-rebuild-index-with-fillfactor/

   -- Rebuild eve Index for every Table in the Database.
    -- Resource: http://blog.sqlauthority.com/2009/01/30/sql-server-2008-2005-rebuild-every-index-of-all-tables-of-database-rebuild-index-with-fillfactor/
    USE [YourDbName]
    GO

    -- Show Fragmentation sample on YourTable Index.
    select avg_fragmentation_in_percent, avg_fragment_size_in_pages, fragment_count, avg_page_space_used_in_percent
    from sys.dm_db_index_physical_stats (DB_ID(), object_id('[dbo].[YourTableName]'), NULL, NULL, 'DETAILED')

    -- Cursor going over each table and rebuilding every index of database.
    DECLARE @TableName VARCHAR(255)
    DECLARE @sql NVARCHAR(500)
    DECLARE @fillfactor INT
    SET @fillfactor = 80
    DECLARE TableCursor CURSOR FOR
    SELECT OBJECT_SCHEMA_NAME([object_id])+'.'+name AS TableName
    FROM sys.tables
    OPEN TableCursor
    FETCH NEXT FROM TableCursor INTO @TableName
    WHILE @@FETCH_STATUS = 0
    BEGIN
    SET @sql = 'ALTER INDEX ALL ON ' + @TableName + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')'
    EXEC (@sql)
    FETCH NEXT FROM TableCursor INTO @TableName
    END
    CLOSE TableCursor
    DEALLOCATE TableCursor
    GO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多