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

Откуда:
Сообщений: 17
Добрый вечер!
Итак... Столкнулся со странной проблемой.

Установил бесплатный Express на домашний комп. Создал пару практически пустых баз. Пользуюсь компом один. Никто кроме меня к SQLServer'у не тыкается.
Моя программа выполняет запросы в одном Connection, строго по очереди, иногда только из MSSQLSMS какую-то выборку гляну и всё.
Программа подключается через OleObject ADODB.Connection к серверу, периодически делает SELECT, потом генерирует новые данные и делает однострочные INSERT'ы, всё строго по очереди.

И вот программа застопорилась, висела-висела, выдаёт EOleException with message 'Время ожидания запроса истекло' - и программа выключается. Перезапускал раз пять - одно и то же.
Почесал я тыкву, увеличил ему до кучи и ConnectionTimeout и CommandTimeout. Пытаюсь продолжить работу - без изменений, только разумеется висит дольше.
За время работы программа сделала чуть больше 2 миллионов INSERT'ов - соответственно в таблице столько же строк - и все всегда выполнялись моментально. При этом база и сейчас не такая уж и большая - 265 Мб.
Удалил логи БД - без изменений. Сделал сжатие "Реорганизовать" и "Освободить" файлам базы - без изменений. Презагружал службу SQLServer'а многократно - без изменений. Перезагружал весь комп многократно - без изменений.

Попробовал сделать из MSSQLSMS простой INSERT без данных:
INSERT INTO [X] ([A], [B], [C], [D], [E], [F], [G], [H], [I]) VALUES (0, 0, '', '', '', '', '', '', 1);
Работает моментально, зараза, что меня ещё больше озадачило.
Может с программой моей что не так? Ну сделал чтоб программа перед началом непосредственной работы делала холостой INSERT, почти такой же как выше:
INSERT INTO [X] ([A], [B], [C], [D], [E], [F], [G], [H], [I]) VALUES (0, 0, 'Program started', '', '', '', '', '', 1);
Работает, и тоже моментально...
Не придумал ничего другого кроме как вывести в лог полный текст INSERT-запроса, который так вот намертво зависает (с данными), вот он приблизительно какой:
INSERT INTO [X] ([A], [B], [C], [D], [E], [F], [G], [H], [I]) VALUES (8374633393, 8374633015, '<строка, кириллица и пробелы, 15 символов>', '<строка, только цифры, 27 символов>', '<строка, цифры, 2 символа>', NULL, '<строка, латиница, 4 символа>', NULL, 0);
Вроде ничего подозрительного, в остальных строках такая же кириллица, но вот вставляю его в MSSQLSMS - бинго, зависает!
Минута, три, пять... Отошёл по делам, когда вернулся смотрю - всё же сработал, но длился 26 минут!

Вот сфига ли? Единственное подключение к БД, единственный запрос, в таблице никаких ключей, ну, если не считать авто-счётчика ID.
Что же случилось..?
24 мар 18, 22:52    [21283454]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
- посмотреть есть ли свободное место в файле базы
- в момент тормозящего инсерта посмотреть на счётчики производительности (диск, память, процессор)
- посмотреть ожидания в sys.dm_os_wait_stats
24 мар 18, 23:36    [21283518]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
да, если будете смотреть ожидания...
перед экспериментами для наглядности может быть удобно очистить старую статистику
DBCC SQLPERF (N'sys.dm_os_wait_stats', CLEAR)
24 мар 18, 23:43    [21283528]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
Redmond
Member

Откуда:
Сообщений: 17
База - начальный размер = 1Мб, увиличение/максимальный = с шагом по 1 МБ, без ограничений.
На SSD места навалом. Диспетчер задач ничего примечательного не показывает.

Погуглил, нашёл и выполнил пару хитрых запросов из sys.dm_os_wait_stats - показывает ASYNC_NETWORK_IO = 97%, внезапно, будем думать, спасибо большое!
25 мар 18, 00:15    [21283562]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30712
Redmond
в таблице никаких ключей, ну, если не считать авто-счётчика ID.
А триггер есть?
25 мар 18, 10:13    [21283772]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 2199
>Redmond, вчера, 22:52 [21283454]
>... который так вот намертво зависает...
Доставай бубен... и по шагам добавляй в INSERT не пустые поля. Найди поле(-я), что губит INSERT.
25 мар 18, 12:02    [21283914]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
Redmond
Member

Откуда:
Сообщений: 17
alexeyvg
Redmond
в таблице никаких ключей, ну, если не считать авто-счётчика ID.
А триггер есть?

Нет, ничего нету кроме не связанных таблиц.

https://www.sql.ru/forum/705900/async-network-io
https://www.sqlskills.com/help/waits/async_network_io/
https://www.sql.ru/forum/4345/ado-cursorlocation-aduseserver-pri-kazhdom-vyzove-sp-sozdaetsya-novaya-sessiya
https://www.sql.ru/forum/53351/cursorlocation-cluseserver-i-cluseclient

Так что судя по всему мой SELECT использует adUseServer, и поэтому сервер держит какие-то блокировки.
Не задумывался об этом, слишком уже привык к другим системам, где об таком просто не требуется задумываться...

Но почему оно не давало о себе знать пока количество строк таблицы не перевалило да 2 миллиона? И при этом INSERT'ы которые я обозвал "без данных" спокойно работают? гм...
25 мар 18, 16:56    [21284283]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
uaggster
Member

Откуда:
Сообщений: 757
Redmond
База - начальный размер = 1Мб, увиличение/максимальный = с шагом по 1 МБ, без ограничений.
На SSD места навалом. Диспетчер задач ничего примечательного не показывает.

Погуглил, нашёл и выполнил пару хитрых запросов из sys.dm_os_wait_stats - показывает ASYNC_NETWORK_IO = 97%, внезапно, будем думать, спасибо большое!

Точно 1 Мб, а не 10%, как по умолчанию?
Instant File Initialization включено?
25 мар 18, 20:32    [21284545]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
uaggster
Member

Откуда:
Сообщений: 757
Хотя, конечно, 26 минут быть не может.
Возможно, дело в программе.
Например, она открыла транзакцию, а закрыть - забыла.
25 мар 18, 20:34    [21284550]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
Redmond
Member

Откуда:
Сообщений: 17
Не, я сделал SELECT и работаю с результатами, а потом разумеется обязательно закрываю. Но вот INSERT'ы идут до этого закрытия, на тот момент выборка ещё нужна.
Просто я машинально ожидал что у меня эти данные "локальная копия" и ничего не блокируют... Привык к библиотекам со службы, которые из коробки всё обеспечивают как надо...
А тут через ADO подсоединился и вот. Непонятно только чего оно раньше спокойно работало.

У меня 2014 Express, настроек вообще не трогал - по умолчанию "шаг 1МБ". "Instant File Initialization" тоже не трогал и даже не смотрел - у меня же SSD и микроскопическая (пока) нагрузка.
25 мар 18, 23:56    [21284796]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
Redmond
Просто я машинально ожидал что у меня эти данные "локальная копия" и ничего не блокируют.
snapshot isolation
26 мар 18, 00:51    [21284846]     Ответить | Цитировать Сообщить модератору
 Re: Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?  [new]
Konst_One
Member

Откуда:
Сообщений: 11512
какой тип курсора используете? очень похоже на серверный (динамический).
26 мар 18, 11:32    [21285678]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить