PIVOT を含む次のビューがあります。
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
を使用して実行するとWHERE ObjectKey = 1234
、すぐに結果が返されます。ただし、結合でこのクエリを使用すると:
Select *
from tblPerson p
inner join
vwPhoneNumberByPref ph on p.PersonID = ph.ObjectKey
約 10 秒かかり、実行計画では 200,000 行以上の並べ替えを実行しています。
結合で使用されていない場合は、単一の行で「並べ替え」を実行しています。わずかに高速化する結合を使用してみましCROSS APPLY
たが、それでも時間がかかりすぎて、まだ 200,000 の奇数行をソートしています。
どうすればパフォーマンスを向上させることができますか?
追加情報:
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
に索引がありtblPhoneNumber
ますObjectTypeName, ObjectKey, Preference, isDeleted
この関数dbo.ApplyMask
は、PhoneType から PhoneNumber に Mask を適用します。マスクは次のとおりです。(##) #### ####
私は実際には実行していませんが、実行しSelect * from tblPerson
ていてもSELECT PersonID from tblPerson INNER JOIN ....
クエリに時間がかかります。これはほんの一例です。