2
我有一个查询,当运行时,结果是即时的。查询速度很快,但是当在VIEW中时,速度很慢 - 由于ROW_NUMBER
但是,我将完全相同的查询粘贴到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%的时间,它在排序(排名前N的排序),执行视图时。在查询中,这34%,但计划完全不同。
我怀疑参数嗅探,但不认为这是视图的问题。
我实际上只是'固定'它,但不知道为什么。
我在我的第一列是第ROW_NUMBER。
SELECT ROW_NUMBER() over(partition by h.Id order by h.[SysStartTime]) as` VersionNumber,
删除,我得到即时结果。 不确定为什么,因为我排序和分区的列都已经在结果集中。
您是否检查过执行计划?您可以从工具栏中包含执行计划。在运行查询之后,您可以点击执行计划选项卡并查看正在进行的操作。 – KrishnaDhungana
我做到了这一点,这就是我“97%的时间,它在一个排序(排名前N的排序)”。 – Craig
您是使用top还是order by子句?你能发布实际的查询,表格脚本和执行计划吗?你是否在ssms中运行? – under