Как измерить размер таблицы в ГБ в таблице в SQL - PullRequest
6 голосов
/ 16 августа 2011

В предыдущем вопросе @Morawski говорил, что «таблица с 1000 столбцов и 44 000 строк Это около 330 МБ; именно столько браузер использует для нескольких открытых вкладок ».

Сколько столбцов и строк в таблице должно быть указано, что ее размер равен > 10 ГБ (добавление таблицы имеет только двойные значения).

Как @Morawski пришел к выводу, что 1000 столбцов и 44 000 - это 330 МБ ?

Есть ли сценарий, который мог бы сказать это в SQL?

Ответы [ 4 ]

12 голосов
/ 16 августа 2011

Существует sproc-вызов sp_spaceused.Не знаю, использовал ли это @Morawski, но в качестве примера на БД разработчика мне пригодилось:

exec sp_spaceused 'aspnet_users'

дает

name          rows    reserved     data      index_size     unused
------------- ------- ------------ --------  ------------   ---------- 
aspnet_Users  3       48 KB        8 KB      40 KB          0 KB
7 голосов
/ 29 ноября 2011
-- Measures tables size (in kilobytes)
-- Tested in MS SQL Server 2008 R2

declare @t table (
name nvarchar(100), [rows] int, [reserved] nvarchar(100), [data] nvarchar(100), [index_size] nvarchar(100), [unused] nvarchar(100)
)
declare @name nvarchar(100)

declare tt cursor for
Select name from sys.tables
open tt

fetch next from tt into @name
while @@FETCH_STATUS = 0
begin
  insert into @t
  exec sp_spaceused @name
  fetch next from tt into @name
end

close tt
deallocate tt

select name as table_name, [rows] as rows_count, data + [index] as total_size, data as data_size, [index] as index_size
from (select name,
[rows],
cast (LEFT(data, LEN(data)-3) as int) data,
cast (LEFT(index_size, LEN(index_size)-3) as int) [index]
 from @t
) x
order by 3 desc, 1
3 голосов
/ 16 августа 2011

Существуют точные формулы для планирования емкости для SQL Server:

С 1000 столбцами фиксированной длины удваивается (это будет тип SQL float(53), 8 байт памяти), ваша строка приближается к максимальному размеру строки, но на самом деле она помещается на странице. Для строк размером 44 Кбайт требуется страница размером 44 Кбайт (из-за огромного размера строки подходит только одна строка на страницу), то есть при 8 Кбайт страницы 44000 * 8 Кбайт = ~ 344 Мб. Если у вас размер кластеризованного индекса будет увеличиваться в зависимости от размера ключа, см. Первую ссылку выше.

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

Возможно, вам интересно прочитать о разреженных столбцах , о моделировании EAV или о типе данных XML .

2 голосов
/ 16 августа 2011

Не уверен насчет скрипта TSQL (я уверен, что он существует), но вы можете найти его через пользовательский интерфейс (SSMS) следующим образом:

1) R-клик по столу
2) ... Недвижимость
3) ... Вкладка «Хранение»

Оттуда он сообщит вам и «пространство данных», и «пространство индекса» - так что, если вы хотите иметь общий объем, просто сложите их.

EDIT
Учтите также место для журнала, если вы ищете общий размер таблицы.

Вот информация о хранимой процедуре, приведенная в ответе @ jon. Кроме того, он ссылается на представления системы, где вы можете напрямую запросить данные об использовании пространства. http://msdn.microsoft.com/en-us/library/ms188776.aspx

...