Sql Server огромные таблицы без строк
У меня есть база данных Sql Server, в которой есть несколько таблиц с нулевым числом строк, но занимающих в совокупности 10 ГБ пространства. Я могу убедиться в этом, щелкнув правой кнопкой мыши на свойствах соответствующих таблиц (объем данных огромен, от 1 до 6 ГБ, а количество строк в этих таблицах равно нулю). Я понятия не имею, что может быть причиной этого, так как я предполагаю, что нулевые строки означали бы почти нулевое занимаемое пространство.
Есть идеи?
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
Это немного странно, но работает:
Вставьте фиктивный столбец в качестве первого столбца таблицы, затем сохраните таблицу.
Наконец, удалите новый столбец и снова сохраните таблицу.
Теперь вы наверняка будете использовать 0 байтов.
Ноэль Париколло
Если база данных содержала много строк данных, то эти данные были удалены из таблиц, ядро базы данных не будет сокращать файлы. Для этого есть команды, мне придется их искать.
ОБНОВЛЕНИЕ: В прошлом я использовал 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]