Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MS SQL разное время insert 'a / 22 сообщений из 22, страница 1 из 1
30.10.2018, 13:08
    #39724908
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Добрый день! Прошу помощи.

Имеется MS SQL 2016 (13.0.4001.0). 256Гб ОЗУ, 32 ядра Xeon. Большая БД - около 50Тб (содержит изображения). Модель восстановления БД - Simple.
Существуют две большие таблицы (более 600кк строк в каждой): Info и Image.

Scheme


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Image](
	[Id] [bigint] IDENTITY(1,1) NOT NULL,
	[Image] [varbinary](max) NULL,
	[InfoID] [bigint] NOT NULL,
 CONSTRAINT [PK_Image] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

/****** Object:  Table [dbo].[Info]    Script Date: 30.10.2018 12:27:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Info](
	[ID] [bigint] IDENTITY(1,1) NOT NULL,
	[Field_1] [nvarchar](max) NULL,
	[Field_2] [datetime2](7) NOT NULL,
	[Field_3] [datetime2](7) NOT NULL,
	[Field_4ID] [int] NOT NULL,
	[Field_5] [nvarchar](max) NULL,
	[Field_6Id] [int] NOT NULL,
	[Field_7] [nvarchar](13) NULL,
	[Field_8] [int] NOT NULL,
	[Field_9] [nvarchar](max) NULL,
	[Field_10] [int] NOT NULL,
	[Field_11] [int] NOT NULL,
 CONSTRAINT [PK_Info] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

/****** Object:  Index [IX_Image_InfoID]    Script Date: 30.10.2018 12:27:54 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Image_InfoID] ON [dbo].[Image]
(
	[InfoID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO

/****** Object:  Index [IX_Info_Field_2_Field_7_Field_4ID]    Script Date: 30.10.2018 12:27:54 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Info_Field_2_Field_7_Field_4ID] ON [dbo].[Info]
(
	[Field_2] ASC,
	[Field_7] ASC,
	[Field_4ID] ASC
)
WHERE ([Field_7] IS NOT NULL)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

/****** Object:  Index [IX_Info_Field_4ID]    Script Date: 30.10.2018 12:27:54 ******/
CREATE NONCLUSTERED INDEX [IX_Info_Field_4ID] ON [dbo].[Info]
(
	[Field_4ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO

/****** Object:  Index [IX_Info_Field_4ID_Field_3]    Script Date: 30.10.2018 12:27:54 ******/
CREATE NONCLUSTERED INDEX [IX_Info_Field_4ID_Field_3] ON [dbo].[Info]
(
	[Field_4ID] ASC,
	[Field_3] ASC
)
INCLUDE ( 	[ID],
	[Field_2],
	[Field_7],
	[Field_8]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO

/****** Object:  Index [IX_Info_Field_7]    Script Date: 30.10.2018 12:27:54 ******/
CREATE NONCLUSTERED INDEX [IX_Info_Field_7] ON [dbo].[Info]
(
	[Field_7] ASC
)
INCLUDE ( 	[ID]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

/****** Object:  Index [NonClusteredIndex-20180913-142646]    Script Date: 30.10.2018 12:27:54 ******/
CREATE NONCLUSTERED INDEX [NonClusteredIndex-20180913-142646] ON [dbo].[TiInHour]
(
	[Field_4ID] ASC,
	[Hour] ASC
)
INCLUDE ( 	[ID],
	[Count],
	[ElapsedTimeSum],
	[Loaded]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
SET ANSI_PADDING ON
GO

/****** Object:  StoredProcedure [dbo].[InsertInfo]    Script Date: 30.10.2018 12:27:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[InsertInfo]
	@Field_1 nvarchar(250),
	@Field_2 datetime2(7),
	@Field_3 datetime2(7),
	@Field_4ID int,
	@Field_5 nvarchar(40),
	@Field_6Id int,
	@Field_7 nvarchar(13),
	@Field_8 int,
	@Image varbinary(MAX),
	@Field_10 int,
	@Field_11 int
AS  
INSERT INTO Info ([Field_1]
      ,[Field_2]
      ,[Field_3]
      ,[Field_4ID]
      ,[Field_5]
      ,[Field_6Id]
      ,[Field_7]
      ,[Field_8]
      ,[Field_10]
      ,[Field_11]) 
	  OUTPUT INSERTED.ID
	  VALUES
	  ( @Field_1
      ,@Field_2
      ,@Field_3
      ,@Field_4ID
      ,@Field_5
      ,@Field_6Id
      ,@Field_7
      ,@Field_8
      ,@Field_10
      ,@Field_11)

INSERT INTO Image 
	([Image], [InfoID]) VALUES (@Image, SCOPE_IDENTITY())
GO




Записываем данные через приложение .NET Core, используя System.Data.SqlClient и хранимую процедуру (есть в схеме). Упрощенно алгоритм выглядит так: каждую запись по одной записываем в Info (там только текст), получаем ID и записываем изображение с этим ID в Image.

SQL установлен с настройками по умолчанию. База лежит на 5 разных RAID массивах, емкостью по 10Тб. Нагрузка на ЦП низкая, очереди на дисках нет. Входные данные всегда усреднено одинаковые. Подсчитываю время записи на 1000 записей.

Проблема: время записи на 1000 "строк" постоянно прыгает. К примеру, 1-2 часа пишет со скоростью 20 сек на 1000 "строк", после начинает тратить на это 8 секунд. Работает так от нескольких минут до нескольких часов, снова сваливается в 20 сек. Проверял все это ночью, нагрузки клиентов в данный период нет - подтверждается логами приложения и особенностью работы.

Индексы перестраивал полностью на Info, на Image фрагментации нет. Не помогает.

Такое ощущение, что SQL выполняет какие-то регламентные операции, чистит кеш или что-то там пересчитывает, работает какое-то время, потом снова тупит. Как понять, с чем может быть связано это рендомная запись при одинаковых условиях?
...
Рейтинг: 0 / 0
30.10.2018, 13:19
    #39724915
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
DiZarКак понять, с чем может быть связано это рендомная запись при одинаковых условиях?
Как вы убедились, что условия разные? Вы размер записываемых данных посчитали? Вы помониторили нагрузку на сервере, когда "снова сваливается в 20 сек"?
...
Рейтинг: 0 / 0
30.10.2018, 13:51
    #39724925
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Гавриленко Сергей АлексеевичDiZarКак понять, с чем может быть связано это рендомная запись при одинаковых условиях?
Как вы убедились, что условия разные? Вы размер записываемых данных посчитали? Вы помониторили нагрузку на сервере, когда "снова сваливается в 20 сек"?

В моменты быстрой записи и медленной смотрел текущие операции скриптом:

Скрипт по текущим операциям
select session_id, status, wait_type, command, last_wait_type, percent_complete
, qt.text sql1
, total_elapsed_time/1000 as [total_elapsed_time, sec],
wait_time/1000 as [wait_time, sec], (total_elapsed_time - wait_time)/1000 as [work_time, sec]
from sys.dm_exec_requests as qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt


Сравнивал загрузку ЦП, количество очередей на дисках, ожидающие запросы в мониторинге ресурсов в Managment Studio.

В двух случаях все эти показатели были одинаковыми, кроме записи на диск. В момент "быстрой" работы SQL пишет 7-8 метров в секунду в лог и столько же в файлы БД. При медленной работе скорость записи составляет 3 Мб\сек.

Объем данных не замерял, сделаю.
...
Рейтинг: 0 / 0
30.10.2018, 13:54
    #39724927
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Текущих операций в эти моменты, кроме самого insert вообще нет. Т.е. SQL никто никто не мешает.
...
Рейтинг: 0 / 0
30.10.2018, 13:56
    #39724929
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
DiZar, значит в этот момент что-то еще хочет получить доступ к диску.
...
Рейтинг: 0 / 0
30.10.2018, 13:57
    #39724932
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
DiZar,

размер/ приращение лога какой?
...
Рейтинг: 0 / 0
30.10.2018, 14:02
    #39724941
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Посмотрите нагрузку на файлы через sys.dm_io_virtual_file_stats.

Нехорошо, если кол-во байт записанных / прочитанных отличается между файлами данных, или отличается ожидание на одну операцию ввода-вывода между файлами. Так же сраните показатели между периодами быстрой и медленной работы.

З.Ы. Ну и самое главное: хотите писать быстро -- прикрутите bulk-вставку.
...
Рейтинг: 0 / 0
30.10.2018, 14:04
    #39724942
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
TaPaKDiZar,

размер/ приращение лога какой?И файлов данных. Настроено ли instant file initialization?
...
Рейтинг: 0 / 0
30.10.2018, 14:09
    #39724946
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Как-то сомнительно, что размер приращения такой, что он два часа диск пилит.
...
Рейтинг: 0 / 0
30.10.2018, 14:12
    #39724951
Гавриленко Сергей Алексеевич
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Владислав КолосовКак-то сомнительно, что размер приращения такой, что он два часа диск пилит.Степень точности измерения продолжительности медленной работы не известена.
...
Рейтинг: 0 / 0
30.10.2018, 14:31
    #39724967
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
TaPaKDiZar,

размер/ приращение лога какой?

1024 Мб

sys.dm_io_virtual_file_stats попробую посмотреть чуть позже.

bulk-вставку пробовали, что-то остановило нас, постараюсь вспомнить.

И файлов данных. Настроено ли instant file initialization?


Файлам данных сейчас разрешено расти только одному по 2048 Мб. Instant file initialization не настраивал, только сегодня прочитал про это. Но, я нарезал свободного места вперед. Сейчас свободного места порядка 600Гб. Это сутки работы без авторасширения.

Замерил по последним логам периоды, оказывается закономерность есть:

32 минут медленной
15 минут быстрой
36 минут медленной
16 минут быстрой

Еще момент забыл указать. В субботу я перестроил все индексы и поставил запись, в надежде, что все залетает. Чуда не произошло - все тупило. Потом взял и нарезал вперед 300 Гб места и запись пошла очееень быстро. Я думал, что решил проблему, но вчера она возникла снова даже при свободном месте. И добавление места во все файлы также не помогает. Логи SQL кстати чистые. Смущает именно цикличность ....
...
Рейтинг: 0 / 0
30.10.2018, 14:54
    #39724985
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
DiZar,

посмотрите на события file growths и chekpoint. Вполне может быть что дело в них... Ну и чем больше индексов тем медленней вставка
...
Рейтинг: 0 / 0
30.10.2018, 15:14
    #39725006
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
DiZar,

Сохраните для пишущей сессии содержимое sys.dm_exec_session_wait_stats в начале и конце медленных периодов. Потом посмотрите на чем были ожидания.

А может у вас сервер в виртуальной среде и чудит именно она?
...
Рейтинг: 0 / 0
30.10.2018, 16:58
    #39725101
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Все рекомендации проверю вечером, отпишусь, спасибо всем!
...
Рейтинг: 0 / 0
30.10.2018, 17:00
    #39725103
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Для проформы вопрос: лог лежит, конечно же на отдельном диске? не вместе с каким-либо сегментом данных?
...
Рейтинг: 0 / 0
30.10.2018, 18:41
    #39725204
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
На виртуальных дисках и процессорах вообще все что угодно может быть.
...
Рейтинг: 0 / 0
30.10.2018, 22:50
    #39725336
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Новости следующие.

1. Да, это виртуалка. Доступа к администрированию у меня нет. Что происходит на гипервизоре для меня загадка.
2. Думаю дело не в instant file initialization, т.к. место я нарезал в файлах руками на пару дней вперед. Тоже самое с file growths, маловероятно.
3. Сhekpoint, прочитал. Идя хорошая, но, насколько я понял, это влияло бы на на каждую запись. Хотя, судя по настройкам, у меня автоматические контрольные точки (в SSMS в настройках стоит 0, что якобы говорит от автоматических, но команда "SELECT name, target_recovery_time_in_seconds FROM sys.databases WHERE name = 'My_DB" выдает значение "60". Что свидетельствует о косвенных контрольных точках.

Переложить лог на отдельный диск, собрать статистику sys.dm_exec_session_wait_stats и остальные рекомендации проверить не успел, потому происходит что-то странное. Я решил считать количество записанных Мб, добавил это в логи. Перезалил ПО и запустил.....уже 2 часа запись идет на идеальной скорости. Хотя до этого я перезаливал его раз 20 для сбора статистики и ничего такого не было. Начинаю склоняться к версии "На виртуальных дисках и процессорах вообще все что угодно может быть."

Продолжаю наблюдение.....
...
Рейтинг: 0 / 0
31.10.2018, 10:58
    #39725603
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
DiZar,

"лучшие практики" рекомендуют использование физических дисков на виртуальных машинах (одно из главных требований производительности), но если вы не можете повлиять на настройки, то придется смириться.
...
Рейтинг: 0 / 0
31.10.2018, 16:14
    #39725965
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
DiZar, вот хорошая статья на Хабре https://habr.com/post/414269/
Там, в общем то, прописные истины в отношении логфайлов, но прочесть полезно.
Да, в случае высоконагруженных систем, в частности - в случае если вы заливаете данные терабайтами - логи желательно держать на отдельных физических дисках, либо на виртуальных, но физически расположенных на отдельной, предназначенной только для этой БД и только для логов - группе дисков, причем размер виртуального диска должен быть фиксированным.
Кстати, размер в виртуального диска с данными - тоже крайне желательно делать фиксированным.
И в любом случае крайне нежелательно помещать логи и данные на один диск, даже виртуальный.

Кстати, нужно проверить, сколько иопсов у вас выделено под диск, на котором расположены логи. Пропускная способность, например, может быть зарезана сверху.
Если у вас, к примеру, 300 иопсов на диске с логами - вы на больше 300 операций в секунду и не сделаете, причем не важно, по сколько вы будете заливать на диск - пакетом по 1000 записей или по 1 записи - всё равно максимум 300 таких пакетов в секунду. Но по 1000 записей это будет, грубо говоря, 300 тыс. записей максимум, а по одной - 300 :-)
Ну, речь о верхней планке, разумеется.

Поправьте, если ошибаюсь.
...
Рейтинг: 0 / 0
31.10.2018, 21:35
    #39726163
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
uaggster, спасибо за статью! Полезные вещи всегда читаю и сохраняю. IOPS могу замерить, но для этого придется остановить систему, чтобы замерять в "чистых" условиях. Пока этого делать не хочется.
...
Рейтинг: 0 / 0
01.11.2018, 22:10
    #39726869
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
Всем спасибо. Похоже, отгадка нашлась. СХД занимается беками по расписанию. В этом причина такого поведения СУБД. Тема закрыта.
...
Рейтинг: 0 / 0
01.11.2018, 22:11
    #39726871
DiZar
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MS SQL разное время insert 'a
*бекапами данных, включая мои 50Тб
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / MS SQL разное время insert 'a / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]