2016-05-10 3 views
2

У меня ситуация/контекст, где конкретный вид занимает 120 секунд перед возвратом результата. При выполнении простого ALTER (или drop/create) вид занимает от 1 до 2 секунд. Как это возможно и как мы можем это исправить - поскольку у нас нет выделенного администратора баз данных, который может помочь нам. Создание индексированных представлений не является вариантом из-за связанной настройки сервера, которую мы имеем (MSSQL Server 2012 жалуется на это).MSSQL 2012 быстрее просматривается после выполнения «alter»

Ниже приведена информация о настройке.

TL; DR View_MAIN занимает 120 секунд после определенного количества времени. Когда мы выполняем представление ALTER на View_X, View_Y и View_MAIN, ничего не меняя, производительность снова нормальна к 1 - 2 секундам.


View_MAIN

SELECT 
    column1, column2, column3, column4, column5 
FROM View_X 

UNION ALL 

SELECT 
    column1, column2, column3, column4, column5 
FROM View_Y 

View_X

SELECT 
    LTRIM(RTRIM(table1.a)) as column1, 
    table2.b COLLATE Latin1_General_CI_AS as column2, 
    table1.c as column3, 
    CAST(table3.d AS DATETIME) as column4, 
    'XXXXXX' as column5 
FROM 
    [linkedserver01].[DATABASE_IDN].[dbo].[dataForX] table1 
    LEFT OUTER JOIN [linkedserver02].[DATABASE_INFM] as table2 
    ON table2.id = table1.id 
    LEFT OUTER JOIN [linkedserver02].[DATABASE_PIK] as table3 
    ON table3.id = table1.id 

View_Y

SELECT 
    LTRIM(RTRIM(table1.a)) as column1, 
    table2.b COLLATE Latin1_General_CI_AS as column2, 
    table1.c as column3, 
    CAST(table3.d AS DATETIME) as column4, 
    'YYYYY' as column5 
FROM 
    [linkedserver01].[DATABASE_IDN].[dbo].[dataForY] table1 
    LEFT OUTER JOIN [linkedserver02].[DATABASE_INFM] as table2 
    ON table2.id = table1.id 
    LEFT OUTER JOIN [linkedserver02].[DATABASE_PIK] as table3 
    ON table3.id = table1.id 
+0

Каковы запросы против View_Main? Я подозреваю, что у вас есть два запроса, которые используют один и тот же план. Поэтому, когда вы исправляете текущий запрос, у вас будет другой, который замедляется позже (этого еще не произошло). Я добавил комментарии ниже к первому предложенному Ответу (по подолуске). – ripvlan

+0

SQL Server строит хороший план для первого запроса, но это не очень хороший план для второго запроса. Если это проблема, то исправление Temp - использовать плагины для оптимизации для одного запроса. Большее исправление заключается в параметризации двух запросов, чтобы сделать их разными. Планы хранятся в буквальном тексте. Найдите используемый PLAN, чтобы выяснить причину проблемы. ALTER VIEW сбрасывает план. – ripvlan

ответ

6

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

Вы можете достичь того же эффекта, выполнив sp_recompile 'View_Main'

https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx

Глядя на фактический план выполнения для запроса должен стать вашей отправной точкой для определения того, почему он работает медленно (в SSMS, на запросе меню)

+0

Спасибо. Это выглядит действительно действительно, мы не контролируем данные в linkedservers, и когда они меняются (см. Ссылку «перекомпилировать планы выполнения»), план выполнения действительно может стать недействительным для новой ситуации. Будет ли вызов, предлагаемый «Явным вызовом sp_recompile», быть решением и делать это еженедельно как «обслуживание», или это грязное решение? –

+1

@YvesSchelpe, выполняющий sp_recompile, не является «грязным решением», особенно если он решает вашу проблему. Соответствующая частота зависит от вашей ситуации и того, как часто происходит это замедление - возможно, зависит от изменения одного из наборов данных. – podiluska

+0

Спасибо, а что относительно предложения Рауля-Себастьяна на первом этапе данных и убрать связанные серверы с пути (учитывая, что нам нужно обновлять эти поэтапные данные несколько раз в день, чтобы убедиться, что данные " живой "и" свежий "достаточно для конечных пользователей, использующих его)? Я предпочел бы использовать эту «постановку» в качестве последнего средства - считая, что это означает больше кода + обслуживание, а также, когда изменения sth на другой стороне, а не? –

2

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

EXEC sp_updatestats 

, прежде чем запрашивать мнение или вы можете попробовать Query Hints Recompile, если на самом деле ничего не помогает или еще лучше вариант быстро. Если вы можете оценить количество строк вид обычно возвращается, скажем, его 50.000 строк, вы можете попробовать:

SELECT * FROM View_MAIN OPTION (FAST 50000); 

EDIT:

Почему я предлагаю избавиться от связанных серверов:

  1. Вам не хватает общего журнала регистрации, статистики, планов выполнения и т. Д.
  2. Как только у вас нет dbo или подобных разрешений, вы не сможете использовать статистику, что приведет к плохой производительности соединений связанных серверов.
  3. Вы в основном получаете полные результаты, и объединение данных организовано впоследствии. Поэтому попробуйте присоединиться к минимально возможному набору результатов с удаленного сервера.
  4. Вы не знаете, был ли ваш запрос заблокирован на целевом сервере, если у вас нет доступа к нему.

Если вы вынуждены использовать связанные серверы, рассмотрите OPENQUERY. Таким образом, агрегации будут выполняться на вашем SQL-сервере.

+0

Учитывая, что спрос - «живые данные» как можно быстрее, мы пренебрегли сбором данных сначала - но похоже, что это будет лучший вариант, каждый раз x раз в день обновлять и запрашивать оттуда. По сути делаете «дамп» и размещаете данные перед тем, как запросить и использовать его для отчетности, которую вы предлагаете? –

+1

Взгляните на [Изменить захват данных] (https://msdn.microsoft.com/en-us/library/cc645937 (v = sql.120) .aspx). В основном вы будете «запускать» процесс ETL каждый раз, когда изменяется какая-либо из ваших исходных данных и обновляется ваша таблица отчетов. –

+1

Изменение захвата данных доступно только в версии Enterprise. Я предполагаю, что у вас не будет этой версии и не будет выделенного администратора баз данных. – podiluska

 Смежные вопросы

  • Нет связанных вопросов^_^