Запрос к представлению в базе данных master намного медленнее, чем запрос непосредственно в конкретной базе данных.
Я не уверен, существует ли общий ответ, прежде чем я приведу более подробную информацию.
Например: у меня есть вид с именем vw_View
Я попробовал следующие два запроса, чтобы получить результат:
Под основной базой данных
select * From [test].[dbo].[vw_View]
Тестируемая база данных
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).
Итак, я сделал несколько тестов:
- Если я создам новую БД с уровнем совместимости по умолчанию = 2017 и запустил запрос, он будет выполняться бесконечно долго.
- Если я изменю уровень совместимости на 2008 и снова подключусь - 8 секунд
- Если я верну уровень совместимости к 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
который поможет вам определить, какое окно является каким. Я почти уверен, что ответ где-то там.