У меня есть запрос, который при запуске дает мгновенный результат.
Однако я вставляю точно такой же запрос в VIEW, и для ответа требуется 6 секунд.
Например,
SELECT ... FROM MyTables WHERE PersonID = x
работает быстро.
Но создайте представление с помощью:
SELECT ... FROM MyTables
А затем вызовите представление:
SELECT * FROM MyView WHERE PersonID = x
И работает медленно.
Фактический запрос:
select ROW_NUMBER() over(partition by h.Id order by h.[SysStartTime]) as VersionNUmber,
h.Id,
fac.HIC,
... plus 18 other columns from the joined tables.
from [hist].[A_View] as h
inner join [dbo].[Facilities] as fac
on fac.Id = h.FacilityId
inner join ref.FormStatus as r_fs
on r_fs.Id = h.FormStatusId
inner join TableA as data
on data.Id = h.dataId
inner join Consultants as c
on c.Id = h.ConsultantId
inner join dbo.Specialties spec
on spec.Id = h.SpecialtyId
inner join dbo.Users modifieduser
on modifieduser.Id = h.ModifiedByUserId
left join ref.ARefTable as r_uc
on r_uc.Id = h.refId
cross apply [dbo].[getPersonUrn](h.PersonId, h.AnotherIdId) as PersonURN
(Обратите внимание, я меняю имена некоторых таблиц и столбцов, так как мы находимся в довольно конфиденциальной области)
Я заметил, что в 97% случаев это происходит в сортировке (Top N Sort) при выполнении представления. В запросе, что 34%, но планы совсем другие.
Я подозревал обнюхивание параметров, но не думаю, что это проблема с представлениями.
Я на самом деле только что «исправил» это, но понятия не имею, почему.
Мой первый столбец в моем выборе - ROW_NUMBER.
SELECT ROW_NUMBER() over(partition by h.Id order by h.[SysStartTime]) as` VersionNumber,
Удаление этого, и я получаю мгновенные результаты. Не уверен, почему, так как столбцы, по которым я упорядочиваю и разделяю, уже находятся в наборе результатов.
row_number()
в запросе, который выполняется мгновенно? Просто убедитесь, что вы сравниваете яблоки с яблоками. - person sstan   schedule 14.12.2016