2018年3月17日土曜日

SQL Server:チューニング>複数行を取得する際のユーザ定義関数の使用方法について(処理が遅い場合の対策)

複数行を取得する際に使用するユーザ定義関数のチューニングについて

下記のユーザ定義関数があったとします。
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 件のコメント:

コメントを投稿