Извините за длинный вопрос, но я думаю, что это интересная ситуация, и я не смог найти объяснения этому:
Я занимался оптимизацией приложения, которое выполняло большое количество последовательных операторов SELECT и INSERT в одной выделенной базе данных SQL Server.
Процесс должен ВСТАВИТЬ большое количество записей в таблицу, но для каждой из них должно быть несколько отображений значений, которые выполняются с использованием операторов SELECT для другой таблицы в той же базе данных. Для конкретного выполнения потребовалось 90 минут.
Я использовал профилировщик (JProfiler - приложение основано на Java), чтобы определить, сколько времени занимает каждая часть приложения. Это дает 60% времени, потраченного на вызовы метода INSERT, и почти 20% времени на вызовы SELECT (остальное распределено в других частях).
После некоторых испытаний я пришел к такой ситуации: я закомментировал запрос INSERT, который занимал 60% времени. Я ожидал, что общее время выполнения составит около 35 минут, так как я удалил 60% из 90 минут. Но весь процесс занял те же 90 минут (только SELECT и ничего больше), но каждый SELECT занимал больше времени!
Все работало с синхронизацией, асинхронных вызовов не было. И был только один поток исполнения. Запросы SELECT и INSERT очень просты и не имеют ничего особенного, они находятся в разных таблицах, но в одной и той же БД.
Я тестировал как БД на компьютере приложения, так и на удаленном сетевом компьютере.
Я не могу придумать какого-либо объяснения этому, поскольку Profiler (Профилировщик приложений, а не SQL Profiler) сообщил об изменениях во времени вызова метода, и, удалив операторы INSERT, инструкции SELECT потребовали больше времени для запуска.
Кто-нибудь может дать мне какое-то объяснение того, что могло бы произойти?
(не может быть кеширования / оптимизации запросов, потому что запросы выполнялись синхронно и в одном потоке, и это не сильно влияло на кеш)
Я должен отметить, что узким местом скорости был SQL-сервер, использующий большую часть процессорного времени.