У меня есть база данных Sql Server, в которой есть несколько таблиц с нулевым количеством строк, но они занимают в совокупности 10 ГБ места. Я могу увидеть это, щелкнув правой кнопкой мыши / свойства в соответствующих таблицах (пространство данных огромно, от 1 до 6 ГБ, а количество строк в этих таблицах равно нулю). Я понятия не имею, что может быть причиной этого, поскольку я предполагаю, что нулевые строки означают почти нулевое занимаемое пространство.
Любые идеи?
Восстановите все индексы в таблицах, включая кластерный индекс. Из Книги в Интернете:
При восстановлении индекса удаляется и создается заново индекс. Это устраняет фрагментацию, освобождает дисковое пространство путем сжатия страниц на основе указанного или существующего параметра коэффициента заполнения и переупорядочивает строки индекса на смежных страницах.
Что-то вроде:
ALTER INDEX ALL ON [lc_db_user].[JMS_MESSAGES] REBUILD
DBCC SHRINKDATABASE или (что более предпочтительно) DBCC SHRINKFILE будет делать что-то только в том случае, если пространство фактически было освобождено из самой таблицы. Также убедитесь, что вы знакомы с проблемы, связанные с сжатием файлов базы данных. Резюме: НИКОГДА не используйте автоматическое сжатие, сжимайте файлы только при необходимости и всегда выполняйте полный переиндекс, чтобы дефрагментировать все индексы, которые вы только что фрагментировали.
Другой способ справиться с подобной проблемой - использовать оператор TRUNCATE TABLE:
TRUNCATE TABLE [lc_db_usr].[JMS_MESSAGES]
Однако это будет работать только с таблицами, на которые не ссылается ограничение FOREIGN KEY.
Больше подробностей: http://msdn.microsoft.com/en-us/library/ms177570.aspx
Если база данных содержала много строк данных, то эти данные были удалены из таблиц, ядро базы данных не будет сжимать файлы. Для этого есть команды, надо их поискать.
ОБНОВЛЕНИЕ: я использовал в прошлом DBCC SHRINKDATABASE, вы можете найти сведения о TechNet Вот
Кажется, я не могу опубликовать снимок экрана, но что я делаю, это щелкаю правой кнопкой мыши по таблице, перехожу в свойства и в разделе «Хранилище»:
Data space: 2,152.883 MB
FileGroup: PRIMARY
Index space: 0.063 MB
Partition scheme:
Row count: 0
Table is partitioned: False
Text filegroup: PRIMARY
Когда я делаю SELECT * в таблице, я не получаю результатов.
Вот сценарий CREATE (там есть поле изображения):
CREATE TABLE [lc_db_usr].[JMS_MESSAGES](
[MESSAGEID] [int] NOT NULL,
[DESTINATION] [varchar](150) NOT NULL,
[TXID] [int] NULL,
[TXOP] [char](1) NULL,
[MESSAGEBLOB] [image] NULL,
PRIMARY KEY CLUSTERED
(
[MESSAGEID] ASC,
[DESTINATION] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Это немного странно, но работает:
Вставьте фиктивный столбец в качестве первого столбца вашей таблицы, затем сохраните таблицу.
Наконец, удалите новый столбец и снова сохраните таблицу.
Теперь у вас наверняка будет использовано 0 байтов.
Ноэль Париколо
попробуй это:
alter table table_name rebuild;