За последние два дня я столкнулся с довольно раздражающей проблемой: в анализаторе запросов SQL Server 2012 выполняется сохранённая процедура примерно из 120 строк, Скорость очень идеальная, и около 500 записей данных можно отфильтровать и зафиксировать менее чем за секунду. Однако при вызове в программном коде C# появляется тайм-аут соединения. Установите CommandTimeout на 300, и отображение займёт около 3 минут. Я несколько раз проверил код и не обнаружил ошибок. Проблема остаётся.
Анализ причин: 1. Потому что скорость выполнения в анализаторе запросов высокая, а объём данных невелик. 2. Только вызов в программе медленный. 3. Установите параметр CommandTimeout, и результат можно отобразить, но это займет много времени.
В итоге предварительно делается вывод, что проблема кроется в коде C#. Но после проверки не было никакой выгоды.
Проверьте эту информацию на Baidu. Наконец-то нашёл похожий информационный пост на форуме CSDN. Один из пользователей в ответе написал: «Возможно, план реализации истёк». Это действительно разбудило меня во сне.
Выполните немедленно на анализаторе запросов:
Тестировал программу ещё раз, и на этот раз она наконец сработала. Скорость очень удовлетворительная.
Анализ причин: Поскольку хранящиеся процедуры предварительно компилированы, план выполнения генерируется при первом выполнении, и этот план исполнения используется при последующих выполнениях (если не указано перекомпиляция), а не генерировать план выполнения при каждом выполнении. Когда структура объекта, участвующая в хранящейся процедуре, корректируется или связанные данные существенно меняются, что может привести к тому, что исходный план станет непригодным для текущего статус-кво (истечение срока действия плана выполнения), сохранённая процедура должна быть перекомпилирована.
Наконец, приложите код для сохранённой процедуры:
|