Размер таблицы и индекса в SQL Server. Ms sql размер таблиц
Размер таблицы и индекса в SQL Server MS SQL Server
Можем ли мы иметь SQL-запрос, который в основном поможет в просмотре размеров таблиц и индексов на SQl-сервере.
Как SQL Server поддерживает использование памяти для таблиц / индексов?
exec sp_spaceused без параметра показывает сводку для всей базы данных. Решение foreachtable генерирует один результат для каждой таблицы – SSMS, возможно, не сможет справиться, если у вас слишком много таблиц.
Я создал скрипт, который собирает информацию таблицы через sp_spaceused и отображает сводку в одном наборе записей, отсортированном по размеру.
create table #t ( name nvarchar(128), rows varchar(50), reserved varchar(50), data varchar(50), index_size varchar(50), unused varchar(50) ) declare @id nvarchar(128) declare c cursor for select '[' + sc.name + '].[' + s.name + ']' FROM sysobjects s INNER JOIN sys.schemas sc ON s.uid = sc.schema_id where s.xtype='U' open c fetch c into @id while @@fetch_status = 0 begin insert into #t exec sp_spaceused @id fetch c into @id end close c deallocate c select * from #t order by convert(int, substring(data, 1, len(data)-3)) desc drop table #tЕсли вам нужен размер каждого индекса для таблицы, используйте один из этих двух запросов:
SELECT i.name AS IndexName, SUM(s.used_page_count) * 8 AS IndexSizeKB FROM sys.dm_db_partition_stats AS s JOIN sys.indexes AS i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id WHERE s.[object_id] = object_id('dbo.TableName') GROUP BY i.name ORDER BY i.name SELECT i.name AS IndexName, SUM(page_count * 8) AS IndexSizeKB FROM sys.dm_db_index_physical_stats( db_id(), object_id('dbo.TableName'), NULL, NULL, 'DETAILED') AS s JOIN sys.indexes AS i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id GROUP BY i.name ORDER BY i.nameРезультаты обычно немного отличаются, но в пределах 1%.
EXEC sp_MSforeachtable @command1="EXEC sp_spaceused '?'"На SQL 2012 получение этой информации на уровне таблицы стало очень простым:
SQL Management Studio -> Щелкните правой кнопкой мыши по Db -> Отчеты -> Стандартные отчеты -> Использование диска по таблице!
наслаждаться
Вот более компактная версия наиболее успешного ответа:
create table #tbl( name nvarchar(128), rows varchar(50), reserved varchar(50), data varchar(50), index_size varchar(50), unused varchar(50) ) exec sp_msforeachtable 'insert into #tbl exec sp_spaceused [?]' select * from #tbl order by convert(int, substring(data, 1, len(data)-3)) desc drop table #tblэто долгое время с момента создания для этого сообщения, но я хотел поделиться своим скриптом:
WITH CteIndex AS ( SELECT reservedpages = (reserved_page_count) ,usedpages = (used_page_count) ,pages = ( CASE WHEN (s.index_id < 2) THEN (in_row_data_page_count + lob_used_page_count + row_overflow_used_page_count) ELSE lob_used_page_count + row_overflow_used_page_count END ) ,s.object_id ,i.index_id ,i.type_desc AS IndexType ,i.name AS indexname FROM sys.dm_db_partition_stats s INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id] AND s.index_id = i.index_id ) SELECT DISTINCT DB_NAME(DB_ID()) AS DatabaseName ,o.name AS TableName ,o.object_id ,ct.indexname ,ct.IndexType ,ct.index_id , IndexSpace = LTRIM (STR ((CASE WHEN usedpages > pages THEN CASE WHEN ct.index_id < 2 THEN pages ELSE (usedpages - pages) END ELSE 0 END) * 8, 15, 0) + ' KB') FROM CteIndex ct INNER JOIN sys.objects o ON o.object_id = ct.object_id INNER JOIN sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL , NULL) ps ON ps.object_id = o.object_id AND ps.index_id = ct.index_id ORDER BY name ASC- SQL Server (начиная с 2008 года)
- Включает информацию для всех таблиц в текущей базе данных
sqlserver.bilee.com
Как измерить размер таблицы в GB в таблице в SQL MS SQL Server
В предыдущем вопросе @Morawski говорил, что «таблица с 1000 столбцами и 44 000 строк – около 330 МБ, это то, как браузер использует только несколько открытых вкладок».
Сколько столбцов и строк должно быть указано в таблице размером > 10 ГБ (при этом таблица имеет только двойные значения).
Как @Morawski пришел к выводу, что 1000 столбцов и 44 000 – 330 МБ ?
Есть ли какой-нибудь скрипт, который мог бы сказать это в SQL?
-- 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дает
name rows reserved data index_size unused ------------- ------- ------------ -------- ------------ ---------- aspnet_Users 3 48 KB 8 KB 40 KB 0 KBСуществуют точные формулы для планирования емкости для SQL Server:
- Оценка размера кластерного индекса
- Оценка размера некластеризованного индекса
- Оценка размера кучи
Если 1000 столбцов фиксированной длины удваиваются (это будет тип SQL с float(53) , 8 байт памяти), ваша строка приближается к максимальному пределу размера строки, но она действительно подходит на странице. Для строк 44 тыс. Требуется 44 тыс. Страниц (из-за огромного размера строки, только одна строка на странице будет соответствовать), то есть на 8 КБ на странице 44000 * 8kb = ~ 344 Мб. Если размер кластеризованного индекса увеличится в зависимости от размера ключа, см. Первую ссылку выше.
Но дизайн таблицы из 1000 столбцов – это огромный запах кода. Ваш вопрос очень расплывчатый относительно части базы данных, ваш предыдущий вопрос никогда не упоминает базу данных и находится в массивах памяти, когда они объединяются, эти два вопроса просто не имеют большого смысла.
Возможно, вам интересно прочитать о разреженных колонках , о моделировании EAV или о типе данных XML .
Не уверен в TSQL-скрипте (я уверен, что он существует), но вы можете найти его через UI (SSMS) следующим образом:
1) R-клик по таблице 2) … Свойства 3) … вкладка «Хранение»
Оттуда он расскажет вам как «пространство данных», так и «индексное пространство», поэтому, если вы хотите получить общий объем, просто добавьте их.
РЕДАКТИРОВАТЬ Рассмотрим также пространство журнала, если вы ищете общую площадь для таблицы.
Ниже приведена информация о хранимой процедуре, указанной в ответе @ jon. Кроме того, он ссылается на представления sys, где вы можете напрямую запрашивать данные об использовании пространства. http://msdn.microsoft.com/en-us/library/ms188776.aspx
sqlserver.bilee.com
Как найти самые большие таблицы в базе данных MS SQL
Как найти самые большие таблицы в базе данных MS SQL
Как найти самые большие таблицы в базе данных MS SQL
Как найти самые большие таблицы в базе данных MS SQL
Если ваша база данных на практике оказывается больше, чем вы ожидали, то очень полезно будет узнать, какие именно таблицы выросли и увеличили общий объем базы данных.
Эта статья покажет вам, как можно просмотреть список больших по размеру таблиц баз данных MS SQL. Таблицы будут выведены по мене уменьшения их размера, то есть самые большие таблицы окажутся вверху списка.
Все что потребуется, это установка Microsoft SQL Server Management Studio на вашем компьютере. Если эта оснастка уже установлена, тем лучше.
Менеджер Microsoft SQL Server Management Studio Express 2008 доступен для свободного скачивания на сайте Microsoft, вы можете перейти к нему по ссылке: www.microsoft.com/download/en/details.aspx?id=22985
- Откройте Microsoft SQL Server Management Studio, и зарегистрируйтесь
- Нажмите на кнопку New Query
- Скопируйте нижеследующий скрипт в окно New Query, не забывая заменять [DatabaseName] на имя вашей реальной базы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | USE [DatabaseName] GO CREATE TABLE #temp ( table_name sysname , row_count INT, reserved_size VARCHAR(50), data_size VARCHAR(50), index_size VARCHAR(50), unused_size VARCHAR(50)) SET NOCOUNT ON INSERT #temp EXEC sp_msforeachtable 'sp_spaceused ''?''' SELECT a.table_name, a.row_count, COUNT(*) AS col_count, a.data_size FROM #temp a INNER JOIN information_schema.columns b ON a.table_name collate database_default = b.table_name collate database_default GROUP BY a.table_name, a.row_count, a.data_size ORDER BY CAST(REPLACE(a.data_size, ' KB', '') AS integer) DESC DROP TABLE #temp |
нажмите на кнопку Execute
Дек 15, 2014 21:48 Иван Семинpyatilistnik.org