Sql 当联接视图包含透视图时,查询速度较慢

Sql 当联接视图包含透视图时,查询速度较慢,sql,sql-server,Sql,Sql Server,我有以下包含轴的视图: CREATE VIEW [vwPhoneNumberByPref] AS SELECT * FROM( SELECT ObjectKey, ObjectTypeName,r_id,MaskedNumber FROM ( SELECT * ,ROW_NUMBER() OVER (PARTITION BY ObjectKey, ObjectTypeName ORDER BY preference) as r_id FROM vwPhon

我有以下包含轴的视图:

CREATE VIEW [vwPhoneNumberByPref]
AS
SELECT * FROM(
    SELECT ObjectKey, ObjectTypeName,r_id,MaskedNumber FROM (
        SELECT * ,ROW_NUMBER() OVER (PARTITION BY ObjectKey, ObjectTypeName ORDER BY preference) as r_id
        FROM vwPhoneNumberMasked  ) AS a WHERE r_id<=3
    )AS P
PIVOT(
    MAX(MaskedNumber) FOR r_id in ([1],[2],[3])
)AS Pvt
大约需要10秒钟,在执行计划中,正在对200000多行进行排序

当不在联接中使用时,它是在单行上进行“排序”。我尝试使用
CROSS-APPLY
进行连接,这使连接速度稍微加快,但仍然需要很长时间,并且仍然在对200000多行进行排序

如何提高性能


其他信息:

CREATE VIEW [vwPhoneNumberMasked] AS
SELECT ph.ObjectTypeName, ph.ObjectKey, dbo.ApplyMask(ph.PhoneNumber, pt.Mask), ph.Preference
FROM tblPhoneNumber ph inner join tblPhoneType pt on
ph.PhoneTypeName = pt.Name
WHERE ph.isDeleted = 0
GO

CREATE TABLE tblPhoneType
Name varchar(20) NOT NULL,
Mask varchar(20) NOT NULL
GO
ObjectTypeName、ObjectKey、Preference、isDeleted上的
tblPhoneNumber
上有一个索引

函数
dbo.ApplyMask
将掩码从PhoneType应用到PhoneNumber,掩码是
(#########


我实际上并没有运行
Select*from tblPerson
,但即使运行
Select PersonID from tblPerson internal JOIN…
也会导致查询耗时。这只是一个例子。

在您提供了更多信息后,我建议您尝试以下内容。在表
tblPhoneNumber
中添加索引:

create index ix_tblPhoneNumber_1
    on tblPhoneNumber (isDeleted, ObjectKey, ObjectTypeName, Preference)
        include (PhoneNumber, PhoneTypeName)
在表
tblPhoneType
中添加(如果没有)

将您的
vwPhoneNumberSked
视图更改为:

ALTER VIEW [vwPhoneNumberMasked] AS
SELECT ph.ObjectTypeName, ph.ObjectKey, mp.Value as MaskedNumber, ph.Preference
FROM tblPhoneNumber ph
    inner /*loop*/ join tblPhoneType pt on ph.PhoneTypeName = pt.Name
    cross apply ftMaskPhone(ph.PhoneNumber, pt.Mask) mp
WHERE ph.isDeleted = 0

其中
ftMaskPhone
中的一个(请使用方法2版本)。

为什么要使用行号功能,对不起,我看不出有任何需要在此处指定行号,如果我错了,请更正。您可以通过删除指定的行号来提高效率。@surajsingh行号仅用于返回三个值,然后这三个值将转换为数据透视中的列。您可以发布表结构吗,查看
vwPhoneNumberAsked
的定义并显示您拥有的任何索引?我已经添加了依赖表和索引,很抱歉忽略了这些。@Molloch您能发布函数
dbo.ApplyMask
的create语句吗?谢谢您的建议,我正在审阅它们,同时,我在原来的问题中添加了更多信息。
create unique clustered index ix_tblPhoneType
    on tblPhoneType (PhoneTypeName)
create unique index ix_tblPhoneType
    on tblPhoneType (PhoneTypeName) include (Mask)
ALTER VIEW [vwPhoneNumberMasked] AS
SELECT ph.ObjectTypeName, ph.ObjectKey, mp.Value as MaskedNumber, ph.Preference
FROM tblPhoneNumber ph
    inner /*loop*/ join tblPhoneType pt on ph.PhoneTypeName = pt.Name
    cross apply ftMaskPhone(ph.PhoneNumber, pt.Mask) mp
WHERE ph.isDeleted = 0