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

Откуда: Msk ->NL
Сообщений: 306
Привет.

Хотелось бы получить подтверждение своим теоретическим предположениям у местных гуру.
Дело касается в первую очередь времени выполнения.

Допустим у нас есть некая таблица размером скажем с терабайт и строк эдак 15 млрд.
EventDate datetime2(2),
SomeID int,
SomeValue double,
SomeFK int,
LongStrValue nvarchar(max),
ShortStrValue nvarchar(20)

Первые два поля = Primary Key.
Какие соображения надо учитывать меняя тип данных у следущих полей?
1. EventDate datetime2(2) -> datetime2(7)
Тут никаких constraint не проверяется, надо токо метаданные обновить. Но это Primary Key. И поле с фиксированной длиной. То есть надо все данные в дата файле передвигать. Так? То есть по сути самая тяжеловесная операция.
Доп. вопрос: надо ли после этого индекс ребилдить или оно само в процессе дефрагментируется? Что-то мне подсказывает, то само...

2. LongStrValue nvarchar(max) -> nvarchar(200)
Это тип данных с нефиксированной длиной. Метаданные обновить, но и еще проверить, влезают ли все значения в 200. Это может занять время, так? Играет ли тут какую-нить роли статистика?

3. ShortStrValue nvarchar(20) -> nvarchar(50)
Вот тут я вообще никакой доп. задержки не ожидаю. Я прав?

4. SomeFK int ->bigint
Можно отключить constraint временно и поменять тип данных, сэкономив время на проверке целостности.
Но это поле с фикс. длиной. Будет ли операция столь же тяжеловесной как и в (1) ? Приведет ли к большей фрагментации?
5 апр 18, 18:44    [21316454]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типов данных в большой таблице. Подводные камни  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7399
Glebanski,

при увеличении размерности обычно не чекается при уменьшении - да. Строки, конечно, просмотром только можно проверить.
5 апр 18, 18:48    [21316470]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типов данных в большой таблице. Подводные камни  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
Glebanski,

+ Изучайте
use tempdb;
go

create function dbo.fnColumnsInfo
(
  @name sysname
)
returns table
as
return (
 select
  c.name as column_name,
  t.name,
  pc.max_length,
  pc.is_dropped,
  pc.leaf_offset
 from
  sys.system_internals_partition_columns pc join
  sys.partitions p on p.partition_id = pc.partition_id left join
  sys.columns c on column_id = pc.partition_column_id and c.object_id = p.object_id join
  sys.types t on t.system_type_id = pc.system_type_id and t.user_type_id = t.system_type_id
 where
  p.object_id = object_id(@name)
);
go

create table dbo.t
(
 EventDate datetime2(2),
 SomeID int,
 SomeValue float,
 SomeFK int,
 LongStrValue nvarchar(max),
 ShortStrValue nvarchar(20)
);

select * from dbo.fnColumnsInfo(N'dbo.t');
go

alter table dbo.t alter column EventDate datetime2(7);
select * from dbo.fnColumnsInfo(N'dbo.t');
go

alter table dbo.t alter column LongStrValue nvarchar(200);
select * from dbo.fnColumnsInfo(N'dbo.t');
go

alter table dbo.t alter column ShortStrValue nvarchar(50);
select * from dbo.fnColumnsInfo(N'dbo.t');
go

alter table dbo.t alter column SomeFK bigint;
select * from dbo.fnColumnsInfo(N'dbo.t');
go

drop table dbo.t;
drop function dbo.fnColumnsInfo;
go
5 апр 18, 19:54    [21316631]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типов данных в большой таблице. Подводные камни  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
invm,
Благодарю!
5 апр 18, 20:33    [21316704]     Ответить | Цитировать Сообщить модератору
 Re: Изменение типов данных в большой таблице. Подводные камни  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 306
Вот отличная статья на тему https://social.technet.microsoft.com/wiki/contents/articles/29228.sql-server-internals-of-a-change-of-the-size-of-a-fixed-data-type.aspx
Хорошо, что в ней объяснили, а то у меня глаза на лоб когда измененные поля в конец строки переместились
11 апр 18, 18:55    [21330927]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить