MS SQL Server миллиард записей в одной транзакции

Программисты и администраторы стремятся к наиболее лаконичным транзакциям, которые затрагивают минимальные объемы данных.

Но регулярно возникают вопросы, а что будет если транзакция будет большой? Если очень большой? Какую максимально тяжелую транзакцию сможет обработать сервер?

 

И вот мне удалось провести эксперимент на сервере. Таблица в одной базе, прямым инсертом переносится в другую. Индексы на таблице-получателе не удалялись (обычно их перед заливкой удаляют а после строят заново). При этом расширение базы 10-Мб фрагментами, сервер 8-ядерный, памяти 8 Гб, виртуализирован. Таблица- получатель использует сжатие на уровне страниц.

 

Результат: (916716921 row(s) affected) почти миллиард записей
Заняло это 7 часов 20 минут. 07:20:39

Сжатие таблицы в 3,75 раза.

При этом размер файла данных составил 23 гигабайта (с учетом постраничного сжатия), лог размотало на 183 гигабайта (на 88 гигабайтной таблице).

 

Понятно, что на рабочей среде такой эксперимент не проведешь, но во время настройки удалось получить конкретные цифры.

 

CREATE TABLE [CELADOR].[***](
[Server_ID] [bigint] NOT NULL,
[Time_Step_ID] [bigint] NOT NULL,
[Counters_ID] [bigint] NOT NULL,
[Counters_Value] [bigint] NULL,
[Counters_Type] [int] NULL,
CONSTRAINT [PK_Primary_Params_Log] PRIMARY KEY CLUSTERED
(
[Time_Step_ID] ASC,
[Server_ID] ASC,
[Counters_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95) ON [PRIMARY]
) ON [PRIMARY]

GO

ALTER TABLE [CELADOR].[***]  WITH CHECK ADD  CONSTRAINT [FK_***] FOREIGN KEY([Counters_ID], [Server_ID])
REFERENCES [CELADOR].[***] ([Counters_ID], [Server_ID])
GO

ALTER TABLE [CELADOR].[***] CHECK CONSTRAINT [FK_***]
GO

ALTER TABLE [CELADOR].[***]  WITH CHECK ADD  CONSTRAINT [FK_***] FOREIGN KEY([Time_Step_ID], [Server_ID])
REFERENCES [CELADOR].[***] ([Time_Step_ID], [Server_ID])
GO

ALTER TABLE [CELADOR].[***] CHECK CONSTRAINT [FK_***]
GO

USE [**]
GO
— delete from [CELADOR].[***]
INSERT INTO [CELADOR].[***]
([Server_ID]
,[Time_Step_ID]
,[Counters_ID]
,[Counters_Value]
,[Counters_Type])
SELECT
[Server_ID]
,[Time_Step_ID]
,[Counters_ID]
,[Counters_Value]
,[Counters_Type]
from **_in.[CELADOR].[***]
GO

(916716921 row(s) affected)
07:20:39

exec sp_spaceused [CELADOR.***]

–***    916716921               88483896 KB    87899952 KB    572856 KB    11088 KB
–to
–***    916716921               23533104 KB    23416960 KB    113232 KB    2912 KB

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *