リンク サーバー上のビューから選択するインライン テーブル値関数を使用して完了するのに約 14 分かかるクエリがあります。ただし、このクエリを変更して関数を削除し、クエリから直接選択すると、約 20 秒で完了します。
関数:
CREATE FUNCTION [dbo].[fn_GetView](CompanyCharacters VARCHAR(4))
RETURNS TABLE
AS
RETURN
(
SELECT DISTINCT
[Some Rows]
FROM LinkedServer.Database.dbo.LinkedView
WHERE Co_char = RIGHT(REPLACE('0', 4) +
CAST(@CompanyCharacters AS VARCHAR(4)), 4)
)
14 分かかるクエリ:
SELECT DISTINCT
[Some Rows]
FROM fn_GetSomeCompanyData() AS Comp
JOIN CustomerData ON Comp.ID = CustomerData.CompID
JOIN fn_GetView('MSF') AS gv ON gv.CompanyChar = Comp.CompanyChar
AND gv.FirstName = Comp.FirstName
AND gv.FirstName = Comp.FirstName
20 秒かかる変更されたクエリ:
SELECT DISTINCT
[Some Rows]
FROM fn_GetSomeCompanyData() AS Comp
JOIN CustomerData ON Comp.ID = CustomerData.CompID
JOIN LinkedServer.Database.dbo.LinkedView AS gv ON gv.CompanyChar = Comp.CompanyChar
AND gv.FirstName = Comp.FirstName
AND gv.FirstName = Comp.FirstName
AND gv.Co_char = RIGHT(REPLACE('0', 4) + 'MSF', 4)
WHERE [Some Data Filtering]
なぜこれがこのように動作するのか、誰にもアイデアがありますか? 高速でありながら関数を保持できるようにクエリを変更する最良の方法はありますか?