Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД? / 12 сообщений из 12, страница 1 из 1
24.03.2018, 22:52
    #39620045
Redmond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
Добрый вечер!
Итак... Столкнулся со странной проблемой.

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

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

Попробовал сделать из MSSQLSMS простой INSERT без данных:
Код: sql
1.
INSERT INTO [X] ([A], [B], [C], [D], [E], [F], [G], [H], [I]) VALUES (0, 0, '', '', '', '', '', '', 1);

Работает моментально, зараза, что меня ещё больше озадачило.
Может с программой моей что не так? Ну сделал чтоб программа перед началом непосредственной работы делала холостой INSERT, почти такой же как выше:
Код: sql
1.
INSERT INTO [X] ([A], [B], [C], [D], [E], [F], [G], [H], [I]) VALUES (0, 0, 'Program started', '', '', '', '', '', 1);

Работает, и тоже моментально...
Не придумал ничего другого кроме как вывести в лог полный текст INSERT-запроса, который так вот намертво зависает (с данными), вот он приблизительно какой:
Код: sql
1.
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.
Что же случилось..?
...
Рейтинг: 0 / 0
24.03.2018, 23:36
    #39620047
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
- посмотреть есть ли свободное место в файле базы
- в момент тормозящего инсерта посмотреть на счётчики производительности (диск, память, процессор)
- посмотреть ожидания в sys.dm_os_wait_stats
...
Рейтинг: 0 / 0
24.03.2018, 23:43
    #39620048
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
да, если будете смотреть ожидания...
перед экспериментами для наглядности может быть удобно очистить старую статистику
DBCC SQLPERF (N'sys.dm_os_wait_stats', CLEAR)
...
Рейтинг: 0 / 0
25.03.2018, 00:15
    #39620056
Redmond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
База - начальный размер = 1Мб, увиличение/максимальный = с шагом по 1 МБ, без ограничений.
На SSD места навалом. Диспетчер задач ничего примечательного не показывает.

Погуглил, нашёл и выполнил пару хитрых запросов из sys.dm_os_wait_stats - показывает ASYNC_NETWORK_IO = 97%, внезапно, будем думать, спасибо большое!
...
Рейтинг: 0 / 0
25.03.2018, 10:13
    #39620080
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
Redmondв таблице никаких ключей, ну, если не считать авто-счётчика ID.А триггер есть?
...
Рейтинг: 0 / 0
25.03.2018, 12:02
    #39620100
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
>Redmond, вчера, 22:52 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1288709&msg=21283454][21283454]
>... который так вот намертво зависает...
Доставай бубен... и по шагам добавляй в INSERT не пустые поля. Найди поле(-я), что губит INSERT.
...
Рейтинг: 0 / 0
25.03.2018, 16:56
    #39620161
Redmond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
alexeyvgRedmondв таблице никаких ключей, ну, если не считать авто-счётчика ID.А триггер есть?
Нет, ничего нету кроме не связанных таблиц.

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

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

Но почему оно не давало о себе знать пока количество строк таблицы не перевалило да 2 миллиона? И при этом INSERT'ы которые я обозвал "без данных" спокойно работают? гм...
...
Рейтинг: 0 / 0
25.03.2018, 20:32
    #39620207
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
RedmondБаза - начальный размер = 1Мб, увиличение/максимальный = с шагом по 1 МБ, без ограничений.
На SSD места навалом. Диспетчер задач ничего примечательного не показывает.

Погуглил, нашёл и выполнил пару хитрых запросов из sys.dm_os_wait_stats - показывает ASYNC_NETWORK_IO = 97%, внезапно, будем думать, спасибо большое!
Точно 1 Мб, а не 10%, как по умолчанию?
Instant File Initialization включено?
...
Рейтинг: 0 / 0
25.03.2018, 20:34
    #39620209
uaggster
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
Хотя, конечно, 26 минут быть не может.
Возможно, дело в программе.
Например, она открыла транзакцию, а закрыть - забыла.
...
Рейтинг: 0 / 0
25.03.2018, 23:56
    #39620246
Redmond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
Не, я сделал SELECT и работаю с результатами, а потом разумеется обязательно закрываю. Но вот INSERT'ы идут до этого закрытия, на тот момент выборка ещё нужна.
Просто я машинально ожидал что у меня эти данные "локальная копия" и ничего не блокируют... Привык к библиотекам со службы, которые из коробки всё обеспечивают как надо...
А тут через ADO подсоединился и вот. Непонятно только чего оно раньше спокойно работало.

У меня 2014 Express, настроек вообще не трогал - по умолчанию "шаг 1МБ" . "Instant File Initialization" тоже не трогал и даже не смотрел - у меня же SSD и микроскопическая (пока) нагрузка.
...
Рейтинг: 0 / 0
26.03.2018, 00:51
    #39620260
Дедушка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
RedmondПросто я машинально ожидал что у меня эти данные "локальная копия" и ничего не блокируют. snapshot isolation
...
Рейтинг: 0 / 0
26.03.2018, 11:32
    #39620414
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
какой тип курсора используете? очень похоже на серверный (динамический).
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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