Программисты и администраторы стремятся к наиболее лаконичным транзакциям, которые затрагивают минимальные объемы данных.
Но регулярно возникают вопросы, а что будет если транзакция будет большой? Если очень большой? Какую максимально тяжелую транзакцию сможет обработать сервер?
И вот мне удалось провести эксперимент на сервере. Таблица в одной базе, прямым инсертом переносится в другую. Индексы на таблице-получателе не удалялись (обычно их перед заливкой удаляют а после строят заново). При этом расширение базы 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