ほとんどの場合、テーブルを参照するスカラー値関数は避けるのが最善です。テーブルは基本的にブラックボックスであり、行ごとに1回実行する必要があり、クエリプランエンジンで最適化できないためです。したがって、関連付けられたテーブルにインデックスがある場合でも、線形にスケーリングする傾向があります。
インラインテーブル値関数はクエリとインラインで評価され、最適化できるため、使用を検討することをお勧めします。必要なカプセル化が得られますが、selectステートメントに式を正しく貼り付けるパフォーマンス。
インライン化の副作用として、手続き型コードを含めることはできません(@variableを宣言しない; @variable =..; returnを設定する)。ただし、複数の行と列を返すことができます。
次のように関数を書き直すことができます:
create function usf_GIS_GET_LAT(
@City varchar (30),
@State char (2)
)
returns table
as return (
select top 1 lat
from GIS_Location with (nolock)
where [State] = @State
and [City] = @City
);
GO
create function usf_GIS_GET_LON (
@City varchar (30),
@State char (2)
)
returns table
as return (
select top 1 LON
from GIS_Location with (nolock)
where [State] = @State
and [City] = @City
);
それらを使用するための構文も少し異なります:
select
Lat.Lat,
Lon.Lon
from
Address_Location with (nolock)
cross apply dbo.usf_GIS_GET_LAT(City,[State]) AS Lat
cross apply dbo.usf_GIS_GET_LON(City,[State]) AS Lon
WHERE
ID IN (SELECT TOP 100 ID FROM Address_Location WITH(NOLOCK) ORDER BY ID DESC)