Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
Добрый вечер! Итак... Столкнулся со странной проблемой. Установил бесплатный Express на домашний комп. Создал пару практически пустых баз. Пользуюсь компом один. Никто кроме меня к SQLServer'у не тыкается. Моя программа выполняет запросы в одном Connection, строго по очереди, иногда только из MSSQLSMS какую-то выборку гляну и всё. Программа подключается через OleObject ADODB.Connection к серверу, периодически делает SELECT, потом генерирует новые данные и делает однострочные INSERT'ы, всё строго по очереди. И вот программа застопорилась, висела-висела, выдаёт EOleException with message 'Время ожидания запроса истекло' - и программа выключается. Перезапускал раз пять - одно и то же. Почесал я тыкву, увеличил ему до кучи и ConnectionTimeout и CommandTimeout. Пытаюсь продолжить работу - без изменений, только разумеется висит дольше. За время работы программа сделала чуть больше 2 миллионов INSERT'ов - соответственно в таблице столько же строк - и все всегда выполнялись моментально. При этом база и сейчас не такая уж и большая - 265 Мб. Удалил логи БД - без изменений. Сделал сжатие "Реорганизовать" и "Освободить" файлам базы - без изменений. Презагружал службу SQLServer'а многократно - без изменений. Перезагружал весь комп многократно - без изменений. Попробовал сделать из MSSQLSMS простой INSERT без данных: Код: sql 1. Работает моментально, зараза, что меня ещё больше озадачило. Может с программой моей что не так? Ну сделал чтоб программа перед началом непосредственной работы делала холостой INSERT, почти такой же как выше: Код: sql 1. Работает, и тоже моментально... Не придумал ничего другого кроме как вывести в лог полный текст INSERT-запроса, который так вот намертво зависает (с данными), вот он приблизительно какой: Код: sql 1. Вроде ничего подозрительного, в остальных строках такая же кириллица, но вот вставляю его в MSSQLSMS - бинго, зависает! Минута, три, пять... Отошёл по делам, когда вернулся смотрю - всё же сработал, но длился 26 минут! Вот сфига ли? Единственное подключение к БД, единственный запрос, в таблице никаких ключей, ну, если не считать авто-счётчика ID. Что же случилось..? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2018, 22:52 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
- посмотреть есть ли свободное место в файле базы - в момент тормозящего инсерта посмотреть на счётчики производительности (диск, память, процессор) - посмотреть ожидания в sys.dm_os_wait_stats ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2018, 23:36 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
да, если будете смотреть ожидания... перед экспериментами для наглядности может быть удобно очистить старую статистику DBCC SQLPERF (N'sys.dm_os_wait_stats', CLEAR) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2018, 23:43 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
База - начальный размер = 1Мб, увиличение/максимальный = с шагом по 1 МБ, без ограничений. На SSD места навалом. Диспетчер задач ничего примечательного не показывает. Погуглил, нашёл и выполнил пару хитрых запросов из sys.dm_os_wait_stats - показывает ASYNC_NETWORK_IO = 97%, внезапно, будем думать, спасибо большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 00:15 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
Redmondв таблице никаких ключей, ну, если не считать авто-счётчика ID.А триггер есть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 10:13 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
>Redmond, вчера, 22:52 http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1288709&msg=21283454][21283454] >... который так вот намертво зависает... Доставай бубен... и по шагам добавляй в INSERT не пустые поля. Найди поле(-я), что губит INSERT. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 12:02 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
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'ы которые я обозвал "без данных" спокойно работают? гм... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 16:56 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
RedmondБаза - начальный размер = 1Мб, увиличение/максимальный = с шагом по 1 МБ, без ограничений. На SSD места навалом. Диспетчер задач ничего примечательного не показывает. Погуглил, нашёл и выполнил пару хитрых запросов из sys.dm_os_wait_stats - показывает ASYNC_NETWORK_IO = 97%, внезапно, будем думать, спасибо большое! Точно 1 Мб, а не 10%, как по умолчанию? Instant File Initialization включено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 20:32 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
Хотя, конечно, 26 минут быть не может. Возможно, дело в программе. Например, она открыла транзакцию, а закрыть - забыла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 20:34 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
Не, я сделал SELECT и работаю с результатами, а потом разумеется обязательно закрываю. Но вот INSERT'ы идут до этого закрытия, на тот момент выборка ещё нужна. Просто я машинально ожидал что у меня эти данные "локальная копия" и ничего не блокируют... Привык к библиотекам со службы, которые из коробки всё обеспечивают как надо... А тут через ADO подсоединился и вот. Непонятно только чего оно раньше спокойно работало. У меня 2014 Express, настроек вообще не трогал - по умолчанию "шаг 1МБ" . "Instant File Initialization" тоже не трогал и даже не смотрел - у меня же SSD и микроскопическая (пока) нагрузка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2018, 23:56 |
|
||
|
Почему может неадекватно долго выполняться простейший INSERT на простаивающей БД?
|
|||
|---|---|---|---|
|
#18+
RedmondПросто я машинально ожидал что у меня эти данные "локальная копия" и ничего не блокируют. snapshot isolation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.03.2018, 00:51 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=158&tid=1690047]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
20ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 287ms |

| 0 / 0 |
