2

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 ....クエリに時間がかかります。これはほんの一例です。

4

1 に答える 1

0

より多くの情報を提供した後、次のことを試してみることをお勧めします。テーブルtblPhoneNumberにインデックスを追加します。

create index ix_tblPhoneNumber_1
    on tblPhoneNumber (isDeleted, ObjectKey, ObjectTypeName, Preference)
        include (PhoneNumber, PhoneTypeName)

テーブルtblPhoneTypeに追加します(ない場合)

create unique clustered index ix_tblPhoneType
    on tblPhoneType (PhoneTypeName)

また

create unique index ix_tblPhoneType
    on tblPhoneType (PhoneTypeName) include (Mask)

vwPhoneNumberMaskedビューを次のように変更します。

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の 1 つはどこにありますか (アプローチ 2バージョンを使用してください)。

于 2013-08-13T20:04:08.530 に答える