У меня есть таблица в SQL Server 2012 Express с большим количеством неиспользуемого пространства.
Мне нужно освободить место в базе данных.
| ИМЯ | Ряды | ЗАБРОНИРОВАНО | ДАННЫЕ | INDEX_SIZE | UNUSED | | ------------- | -------- | -------------- | ----------- --- | ------------ | -------------- | | MyTableName | 158890 | 8928296 КБ | 5760944 КБ | 2248 КБ | 3165104 КБ |
Как мне получить SQL для выпуска 3165104KB?
Я уже попробовал:
Alter table MyTableName Rebuild
DBCC CLEANTABLE (MyDbName,"MyTableName ", 0)
ALTER INDEX ALL ON MyTableName REORGANIZE ;
ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF)
Вот таблица:
CREATE TABLE [dbo].[MyTableName](
[ImageID] [int] IDENTITY(1,1) NOT NULL,
[DateScan] [datetime] NULL,
[ScanImage] [image] NULL,
CONSTRAINT [PK_Image] PRIMARY KEY CLUSTERED
(
[ImageID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Единственное, что мы сделали, это заменили ScanImage
в каждой строке намного меньшим изображением (это то, сколько там неиспользуемого пространства).
источник
Пытаться
ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF)
Это воссоздает кластеризованный индекс, поэтому вам потребуется дополнительное пространство в вашей базе данных для завершения операции. Если у вас нет свободного места из-за того, что ваш диск заполнен, вы можете добавить новый файл данных в базу данных (на другой диск) и переместить таблицу в нее.
Также возможно, что кластерный индекс определяется с FILLFACTOR менее 100%. Если установить коэффициент заполнения, например, 66%, 1/3 каждой страницы данных останется пустой для будущего использования. Если это проблема, вы можете изменить коэффициент заполнения, используя
ALTER INDEX PK_Image ON MyTableName REBUILD WITH (ONLINE = OFF, FILLFACTOR=100)
Если вы недавно удалили поле переменной длины из таблицы, вы также можете попробовать
DBCC CLEANTABLE( Databasename, "MyTableName")
В Книге онлайн (BOL) есть отличная статья о перестройке индексов на http://technet.microsoft.com/en-us/library/ms188388%28v=sql.100%29.aspx
источник
Убедитесь, что режим восстановления БД установлен
SIMPLE
.изменить столбец как
VARBINARY(MAX)
.Затем попробуйте скопировать данные в совершенно новую таблицу.
Проверьте новый размер таблицы, используя
sp_spaceused "tablename"
. Если вас устраивает неиспользуемое пространство таблицы, то проверьте неиспользуемое пространство базы данных, используя ту же команду, не указывая имя таблицы. Это пространство все еще находится в файлах базы данных и не передается в ОС.Вы можете удалить исходную таблицу и переименовать новую таблицу, или сделать то же самое снова, и использовать исходное имя таблицы, если вы не доверяете операции переименования (я не доверяю полностью).
Если это работает, то последний шаг прост: вы знаете, как сжать файлы и освободить неиспользуемое пространство.
Если есть какие-либо внешние ключи, запишите их определения, удалите их, выполните задачи, о которых я упоминал выше, и создайте заново внешние ключи позже. Конечно, это займет время, и эту операцию следует выполнять в нерабочее время. Вся эта задача может быть выполнена с помощью сценария, чтобы он мог работать в одночасье.
источник
Я бы просто создал новую базу данных и скопировал в нее данные. Вы должны быть в состоянии использовать мастер импорта / экспорта. (Очевидно, что резервное копирование и восстановление сохранят проблему.) Проверьте результаты импорта данных. Если все выглядит хорошо, переименуйте исходную базу данных, а затем переименуйте новую базу данных в имя, которое вы хотите использовать. (Я всегда немного жду, прежде чем бросить оригинал, просто чтобы перепроверить онлайн.)
Для чего это стоит, мы также восстановили пространство больших двоичных объектов из баз данных, если они не слишком велики, с помощью следующих шагов. (Однако, так как вы используете SQL Server Express, у вас может не хватить места для этого).
DBCC SHRINKFILE(file, EMPTYFILE)
. Так как вы сжимаете MDF, он в конечном итоге потерпит неудачу, поскольку системные метаданные не могут быть перемещены. Однако распределение пустых BLOB-объектов не перемещается.DBCC SHRINKFILE(newfile,EMPTYFILE)
. Это переместит данные назад, минус избыточное пространство.Это устраняет вздутие сгустка. Я должен упомянуть, что мы использовали эту технику прежде всего для создания в основном пустой базы данных для тестирования сценариев обновления.
источник
Реорганизуйте кластеризованный индекс - у него есть данные в узлах, так что ... он, вероятно, фрагментирован.
источник