Размер таблицы и индекса в 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

sp_spaceused дает вам размер всех объединенных индексов.

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

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 года)
  • Включает информацию для всех таблиц в текущей базе данных
--Gets the size of each index for the specified table DECLARE @TableName sysname = N'SomeTable'; SELECT i.name AS IndexName ,8 * SUM(s.used_page_count) AS IndexSizeKB FROM sys.indexes AS i INNER JOIN sys.dm_db_partition_stats AS s ON i.[object_id] = s.[object_id] AND i.index_id = s.index_id WHERE s.[object_id] = OBJECT_ID(@TableName, N'U') GROUP BY i.name ORDER BY i.name; SELECT i.name AS IndexName ,8 * SUM(a.used_pages) AS IndexSizeKB FROM sys.indexes AS i INNER JOIN sys.partitions AS p ON i.[object_id] = p.[object_id] AND i.index_id = p.index_id INNER JOIN sys.allocation_units AS a ON p.partition_id = a.container_id WHERE i.[object_id] = OBJECT_ID(@TableName, N'U') GROUP BY i.name ORDER BY i.name;

Существует расширенная хранимая процедура sp_spaceused которая получает эту информацию. Это довольно запутанно, чтобы сделать это из словаря данных, но эта ссылка фанатов к сценарию, который это делает. Этот вопрос с использованием stackoverflow имеет некоторый разветвитель информации о базовых структурах данных, которые можно использовать для построения оценок размеров таблиц и индексов для планирования размера.

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

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

exec sp_spaceused 'aspnet_users'

дает

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

  1. Откройте Microsoft SQL Server Management Studio, и зарегистрируйтесь
  2. Нажмите на кнопку New Query
  3. Скопируйте нижеследующий скрипт в окно 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