SQL View time out используется .NET Application

У нас есть приложение .NET с использованием LINQ to SQL (ORM), чтобы вызвать представление, содержащее объединения из нескольких объектов в разных базах данных. Приложение .NET время от времени вызывает это представление, однако наш DBA запускает следующее выражение:

sp_refreshview on the view and the subsequennt sql views

приложение снова запустится.

Это приложение начинает отсчет времени снова на том же самом представлении после 20 минут. Таким образом, наш администратор базы данных назначил работу для запуска вышеуказанного заявления каждые 30 минут. Структурных изменений в представлении не было, и мы пытаемся понять, почему sp_refreshview устраняет эту проблему и что может быть основной проблемой, которую мы могли бы исправить?

Ответ 1

Причина, по которой sp_refreshview устраняет проблему, заключается в том, что представление не связано с привязкой к схеме. SQLServer хранит метаданные о представлении, чтобы помочь в выполнении, и поскольку представление не привязано к схеме, метаданные устаревают по мере обновления базовых объектов (считайте утверждения DML). Что sp_refreshview делает, это обновление метаданных для не связанных с схемой представлений, чтобы они могли работать оптимально. Взгляните на документацию для sp_refreshview.

Для некоторых разъяснений, почему это работает, подумайте о том, что такое точка зрения? Представление - это просто запрос. Метаданные, которые хранятся, относятся к этому запросу.

Всякий раз, когда вы запускаете запрос, сервер будет определять наиболее оптимальный способ запуска этого запроса (называемый планом), и это зависит от статистики таблиц, используемых в запросе. По мере изменения данных в таблицах статистика для таблиц изменится, и поэтому план может измениться. Когда вы создаете представление (не связанное с схемой), метаданные вокруг оптимального исполнения сохраняются (скорее всего, план). Поскольку представление - это всего лишь запрос, план может устаревать, а sp_refreshview обновляет метаданные.

Ответ 2

Скорее всего, sp_refreshview заставляет сервер удалять кешированный план выполнения вашего запроса из кеша. Когда вы запускаете запрос после вызова sp_refreshview, генерируется новый (лучший) план выполнения. Вот почему помогает вызов sp_refreshview. По-видимому, обновление статистики не удаляет кэшированные планы выполнения, поэтому в вашем случае это не помогает.

Есть несколько типов запросов, которые не могут иметь хороший план для всех возможных значений параметров, или ваши данные могут быть значительно искажены.

Если вы добавите OPTION(RECOMPILE) в свой запрос, скорее всего, вам не нужно будет вызывать sp_refreshview, чтобы он работал быстро.

Я не знаю, как добавить подсказку запроса, когда запрос генерируется вашим ORM.

Я рекомендую вам прочитать отличную статью Медленно в приложении, быстро в SSMS Эрланд Соммарског.

Ответ 3

Метаданные - это информация о таблицах, используемых представлением. Статистика обновляет информацию о данных. Это может помочь увидеть ваше определение вида. Например, выбор * в представлении может действительно вызвать проблемы. В качестве обновления, представление представляет собой просто выражение, пока оно не будет выполнено. Если вы используете таблицы, которые всегда меняют свою структуру или отбрасываются и повторно добавляются, вам нужно будет запускать sp_refreshview каждый раз. Если вам нужна дополнительная помощь, вам нужно будет предоставить запрос и любую информацию о базовых таблицах, например процессы обновления. Все приведенные выше комментарии были в правильном порядке.