2017-02-22 25 views
10

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

sp_refreshview on the view and the subsequennt sql views 

приложение начинает работать снова.

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

+0

Имеет ли представление какие-либо встроенные функции?и сколько времени требуется для выполнения при прямом запуске без слоя, такого как .net? поэтому через студию управления и т. д. ... –

+1

вид не содержит встроенных функций. просмотр занимает всего несколько миллисекунд при прямом запуске через .net или студию управления sql при выполнении sp_refresh. если sp_refresh не выполняется, просмотр по-прежнему выполняется только в миллисекундах с сервера sql, но время при запуске от .net – Baahubali

+0

@ user1490835, ваш последний комментарий звучит точно так же, как название статьи [Slow in Application, Fast in SSMS] (http : //www.sommarskog.se/query-plan-mysteries.html) Эрланд Соммарског, о котором я уже говорил в своем ответе. Прочитали ли вы его и проверили, что проблема отличается от той, что обсуждается в этой статье? –

ответ

4

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

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

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

+0

ОК, но вопрос в том, что ничего не обновляется внутри представления. То же самое было за последние 2 года. Нет заявления DML ... ничего не было затронуто. Мы рассмотрели документацию, прежде чем публиковать этот вопрос, и на данный момент ничего не имеет смысла, за исключением того, что он работает – Baahubali

+0

Основные данные, содержащие представление, не изменились через 2 года? Само представление не является тем, что меняется, именно данные в таблицах содержат представление, которое будет меняться. – JRLambert

+0

, но как это изменит метаданные вокруг представления? – Baahubali

0

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

2

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

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

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

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

Я рекомендую прочитать отличную статью Slow in the Application, Fast in SSMS от Erland Sommarskog.

+0

Это не работает. Любые другие предложения? Есть ли способ, которым я могу получить sql внутри хранимой процедуры sp_Refreshview? – Baahubali

+0

@ user1490835, я бы попытался использовать SQL Profiler, чтобы увидеть, какие запросы выполняются при запуске 'sp_refreshview'. –

+0

Из того, что я знаю и читаю в Google, и после общения с нашими администраторами баз данных, SQL Server, похоже, не создает планы запросов для просмотров. – Baahubali