2015-04-29 51 views
1

我使用Sql-server 2012要使用標量函數或表值函數,在SQL Server確定最佳

我的表的定義是:

create table products1(pid int,pnm varchar(10),oid int foreign key references orders1(oid)) 

create table orders1(oid int primary key,onm varchar(10),odt date) 

insert into products1 values(1,'ABC',1),(2,'DEF',2) 

insert into orders1 values(1,'QTY','2013-04-27'),(2,'PROD','2015-04-29') 

create function dbo.udf_getmaxdt(@a date) 
returns date 
as 
begin 
select @a=max(o.odt) from orders1 o inner join products1 p on o.oid=p.pid 
return @a 
end 


create function dbo.udf_getmaxdt(@a date) 
returns TABLE 
as 
RETURN 
(
select @a=max(o.odt) from orders1 o inner join products1 p on o.oid=p.pid 
) 
end 

的語法可能是錯誤的,但我對任務來確定兩種功能中最好的一種。

但不能告訴哪一個,你能幫我嗎?

問候, 基奧

+0

只要記住UDF的往往是意想不到的性能殺手。如果您不必要地創建和使用UDF,您可能會發現它無法擴展,並且當您擁有100倍的記錄時,您會遇到難以解決的性能問題。 –

回答

1

第一個是標量函數

第二個是內聯表值UDF

第二個具有可識別的模式:

create FUNCTION [dbo].[fn_geo_calcDistance] 
(
    ... 
) 
RETURNS table 
AS 
RETURN SELECT ... 

第二個與查詢一起內聯時,將導致查詢不被引用爲外部查詢,而是作爲內聯查詢,這將會變得更快

0

除了您提供的表值函數的定義具有不正確的語法(您沒有返回結果集那裏)的事實,它是不可能陳述「標量函數比表 - 價值「(反之亦然) - 因爲這種說法像」蘋果比汽車好「。

它是兩個完全不同類型的功能:

  • 表值函數返回某些查詢的結果,它可以在此ResultSet多行。
  • 標量函數只返回一個標量值。

所以這取決於你 - 你應該在每個特定情況下使用什麼。

有一些技巧使用內聯表值函數作爲標量函數(通過返回包含單值的單行數據),這在某些情況下很有意義(主要是通過消除性能優化中的瓶頸),但它不應該被視爲任何用例的一些「通用配方」。