複数行を取得する際に使用するユーザ定義関数のチューニングについて
下記のユーザ定義関数があったとします。
create function fn_GetProductName(@ProductID int)
returns nvarchar(50)
as
begin
declare @ProductName as nvarchar(50)
set @productName = (select [name] from Product where ProductID = @ProductID)
return @productName
end
↓のクエリで10万行を返すような処理をすると処理時間がとても掛かってしまいます。
select fn_GetProductName(ProductID), InStock, ReorderLevel from Inventory
原因は行単位に関数が実行されるているためです。
↓この対策は、ユーザ定義関数を使わずに
1)サブクエリを使用する
select (select [name] from Product P where P.ProductID = I.ProductID), InStock, ReorderLevel from Inventory I
2)inner joinを使用する(関係性によっては、left outer joinとisnullを使ってね。)
select P.[name], InStock, ReorderLevel from Product P
inner join Inventory I on P.ProductID = I.ProductID
などがあります。
良いハード設計に組み込まれたSQL Serverは正しく使えばそれなりに早いです。
0 件のコメント:
コメントを投稿