Запрос к представлению в базе данных master намного медленнее, чем запрос непосредственно в конкретной базе данных.

Я не уверен, существует ли общий ответ, прежде чем я приведу более подробную информацию.

Например: у меня есть вид с именем vw_View

Я попробовал следующие два запроса, чтобы получить результат:

  1. Под основной базой данных select * From [test].[dbo].[vw_View]

  2. Тестируемая база данных select * From [dbo].[vw_View]

Может ли кто-нибудь сказать мне, почему запрос на тот же запрос, но из master база данных намного медленнее, чем запрос из других баз данных, я даже попробовал другие:

Use [db]    --any other databases not master database
select * From [test].[dbo].[vw_View]

Я проверил фактический план выполнения, порядок соединения отличается, но почему он изменится, так как я уже указал [test].[dbo].[vw_View] когда под master

Просто из любопытства, спасибо заранее.

1 ответ

Такая же проблема - выполнение представления из masterдлится бесконечно долго, но выполнение того же представления "под любой другой пользовательской базой данных на этом сервере" занимает всего 8 секунд. У меня есть среда, в которой мы только что перешли на SQL Server 2017, а "все остальные базы данных" имеют уровень совместимости = 2008 (или 2012).

Итак, я сделал несколько тестов:

  1. Если я создам новую БД с уровнем совместимости по умолчанию = 2017 и запустил запрос, он будет выполняться бесконечно долго.
  2. Если я изменю уровень совместимости на 2008 и снова подключусь - 8 секунд
  3. Если я верну уровень совместимости к 2017 году - снова долгая перспектива

И последнее, что мы заметили о самом запросе - запрос использует CHARINDEX функция, и если я закомментирую ее, запрос будет выполняться одинаково 8 секунд для обоих уровней совместимости.

Итак... похоже, у нас смешанная проблема с CHARINDEX выполнение функции в устаревшей базе данных в контексте уровня совместимости = 2017.

Решение (если это можно так назвать...) - выполнять устаревшие запросы в (том же) устаревшем контексте выполнения.

Обратите внимание, что это может быть не ответ, но в любом случае это был слишком большой текст для комментария...

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

Чаще всего это связано с различными настройками выполнения в зависимости от того, откуда вызывается процедура. Чтобы проверить, есть ли разница в этих настройках, я обычно использую SQL Profiler.

В вашем случае вы можете открыть два разных окна в SSMS, одно в контексте Master базы данных, а другой в контексте User Database и запустить SQL Profiler, самый первый профилировщик событий будет захватывать, будет Event Class = Existing Connections а также Text Data = -- network protocol: LPC.....,

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

-- network protocol: LPC
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read committed

Теперь сравните настройки обеих сессий и посмотрите, в чем различия.

Профилировщик также имеет столбец SIPD который поможет вам определить, какое окно является каким. Я почти уверен, что ответ где-то там.

Другие вопросы по тегам