2016-06-01 5 views
0

У меня есть база данных размером 120 ГБ. Одна из таблиц, использующих большой объем пространства, ежедневно создает тысячи записей. Одна из этих столбцов - nvarchar(max). В этой колонке обычно может содержаться 2000 символов данных, которые должны быть там в течение недели.Уменьшение пространстваUsedMB в базе данных SQL Server

Если я обновляю этот столбец, который будет пустой после недели для этих записей, он, похоже, не уменьшит размер базы данных. Например .:

UPDATE tblSample 
SET largefieldname = '' 
WHERE DateAdded < DATEADD(D, -7, GETDATE()) 

Так что, если я ввожу 100mb ценность данных в этом столбце, а затем пустой этот столбец после недели, используя вышеуказанное заявление, база данных по-прежнему остается 100mb в размере.

Как я могу получить базу данных для уменьшения размера после такой задачи? Я не хочу удалять всю строку, просто удалите ненужное использование диска этим конкретным столбцом.

ответ

2

Вам необходимо рассмотреть редизайн для временных данных. Поместите временные данные в свою таблицу и поместите в нее ключ в основной таблице. Когда вы закончите с данными, удалите значение ключа и обрезаете таблицу. Это не освободит неиспользуемое пространство, но облегчит его обслуживание. Единственный способ вернуть полезное дисковое пространство - это сокращение базы данных или использование разделов.

+0

Мне нравится эта идея, я дам ей повод и посмотрю, смогу ли я переделать таблицы в соответствии с этим. – Aki

-1

вы можете применить процесс термоусадочной к базе данных таким образом:

USE [YourDatabase] 
GO 
DBCC SHRINKFILE (N'YourDatabase') 
GO 

это команда обеспечивает SQL Server для того, чтобы вернуть это пространство для операционной системы, но и иметь в виду, что это не рекомендуется, чтобы этот процесс приводил к фрагментации над вашими индексами, а также влиял на стоимость процессора во время процесса. Пожалуйста, ознакомьтесь со следующим показанием: http://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files/

+0

Не используйте shrinkfile. Это очень, очень плохой совет. Это займет много времени и вытащит время отклика вашей базы данных после того, как вы это сделаете. Shrinkfile следует использовать один раз в пару лет в чрезвычайной ситуации. Пожалуйста, посмотрите, например, этих двух авторов (их много и много): http://www.sqlservercentral.com/articles/SHRINKFILE/71414/ и http://blog.sqlauthority.com/2011/01/19/sql -server-shrinking-database-is-bad-увеличивается-фрагментация-снижает-производительность/ –

+0

Я согласен с вашими комментариями, поэтому я делаю акцент на том, что этот процесс не рекомендуется, чтобы он продолжал или нет, а также добавьте блог от Пола Рэндала о http://www.sqlskills.com/blogs/paul/why-you-should-not-shrink-your-data-files/ – jthalliens

+0

Так зачем рекомендовать его? Это похоже на то, что кто-то теряет вес, кровоточив себя. –

0

Один из способов освободить пространство - это скопировать таблицу во временный файл, обрезать таблицу и снова вставьте строки из таблицы temp.

Попробуйте этот код:

create table dbo.x5 (name varchar(1000), i1 int IDENTITY(1,1)) 
set nocount on 
-- select the next two rows and run 
insert into dbo.x5 values (replicate('abcd',250)) 
go 10000 

exec sp_spaceused 'dbo.x5' --11488 KB 
update dbo.x5 set name='' 
select * into #a1 from dbo.x5 
truncate table dbo.x5 
insert into dbo.x5 (name) select name from #a1 

exec sp_spaceused 'dbo.x5' -- 136k 

На большом столе с несколькими индексами может заплатить, чтобы удалить индексы, вставьте строки и воссоздать индексы. Ваши результаты будут варьироваться, поэтому запустите код установки.

Если у вас есть кластеризованный указатель на таблице, то восстановление индекса по индексу также освободит пространство. Я не знаю, будет ли эффект перестройки в куче (таблица без кластеризованного индекса) будет иметь тот же эффект.

+0

База данных составляет 120 ГБ, а таблица, которую я хочу сделать, - 30 ГБ, с 50 миллионами строк. Это займет много времени, чтобы переместить данные, и на веб-сайте, который использует его, все 100-1000 человек. Это можно сделать при обслуживании, но не может делать это каждую неделю. Есть ли другой путь? – Aki

+0

Только создавая кластерный индекс и перестраивая индекс. Отбросьте другие индексы, перестройте кластеризованный индекс и заново создайте другие индексы. Этот подход должен быть проверен, чтобы убедиться, что это самый эффективный способ. Вы также должны рассмотреть раздел таблицы. Это позволит вам добавлять, удалять части таблицы очень, очень быстро и даже восстанавливать индекс отдельного раздела. Если вы хотите, чтобы пользователи отвечали на вопросы, приятно проголосовать за ответ. –

Смежные вопросы