Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 вопрос по размеру таблиц  [new]
gosn1ck
Member

Откуда:
Сообщений: 2
Добрый день!
как определить таблицы, которые занимают больше всего места я нашел с помощью ссылки, а как определить колонки, которые больше всего занимают места в этих таблицах?
28 апр 15, 15:23    [17576131]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по размеру таблиц  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DATALENGTH Вам в помощь. А вообще смотрите в сторону столбов с NVARCHAR/VARCHAR/XML
28 апр 15, 15:26    [17576163]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по размеру таблиц  [new]
gosn1ck
Member

Откуда:
Сообщений: 2
а что про ntext ?
28 апр 15, 15:39    [17576244]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по размеру таблиц  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Эти типы уже давно объявлены устаревшими. Но если положа руку на сердце - и их тоже нужно брать во внимание. Также как и BINARY и многие другие. Я бы смотрел на длину колонки (эту информацию можно взять из метаданных):

SELECT c.name, c.max_length, TYPE_NAME(c.user_type_id)
FROM sys.[columns] c
WHERE c.[object_id] = OBJECT_ID('dbo.test1')
28 апр 15, 16:01    [17576416]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по размеру таблиц  [new]
o-o
Guest
AlanDenton
Я бы смотрел на длину колонки (эту информацию можно взять из метаданных):

у varchar(max), varbinary(max) max_length = -1.
а если бы даже и фиксированное число.
для var-типов это же максимально возможный размер, а не по факту.
если я создам колонку varchar(8000), да еще и nullable, и не заполню ее совсем,
под нее никто место резервировать не станет.
и будет моя якобы широченная колонка вообще минимальной по занятому месту
28 апр 15, 16:11    [17576506]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по размеру таблиц  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE
	  @object_id INT = OBJECT_ID('dbo.test1')
	, @SQL NVARCHAR(MAX)

SELECT @SQL = 'SELECT ' + STUFF((
	SELECT ', [' + c.name + '] = SUM(DATALENGTH([' + c.name + ']))'
	FROM sys.columns c
	WHERE c.[object_id] = @object_id
		AND c.is_computed = 0
	FOR XML PATH('')), 1, 2, '') + ' FROM [' + OBJECT_SCHEMA_NAME(@object_id) + '].[' + OBJECT_NAME(@object_id) + ']'

--PRINT @SQL
EXEC sys.sp_executesql @SQL


тогда динамический SQL в помощь. Правда здесь очень много оговорок (например, persisted computed column, которые мы не учитываем). Реальный запросик будет на порядок сложнее чем тот что выше. Надеюсь то что есть - Вам поможет.
28 апр 15, 16:19    [17576564]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по размеру таблиц  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
В общем идея вывести сумму байт по каждому столбцу функцией DATALENGTH.
28 апр 15, 16:21    [17576580]     Ответить | Цитировать Сообщить модератору
 Re: вопрос по размеру таблиц  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
Баловство это с колонками.
28 апр 15, 16:54    [17576814]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить