2017-04-12 64 views
0

我有一个像下面这样的SQL Server表值函数。表值函数性能

CREATE FUNCTION dbo.GetDeptName (@DId INT) 
RETURNS TABLE 
    AS 
     RETURN 
     (SELECT DeptID , 
        DeptName , 
        Location 
      FROM  dbo.department 
      WHERE  Deptno = @DId 
     ); 

现在我想从Employee表中使用此表值函数得到数据。哪一个能够为以下3种情况下的50k记录提供更好的性能。

方案1:

SELECT * 
FROM dbo.employee 
WHERE deptname IN (SELECT deptname 
         FROM  dbo.GetDeptName(50)); 

方案2:

SELECT * 
FROM dbo.employee e 
     JOIN dbo.GetDeptName (50) fn ON e.deptname = fn.deptname; 

方案3:

SELECT * 
FROM dbo.employee e 
WHERE EXISTS (SELECT 1 
       FROM dbo.GetDeptName (50) fn 
       WHERE e.deptname = fn.deptname); 
+2

只要运行它,看看自己。并且你的函数没有条款 –

+0

你的查询是否工作 – TheGameiswar

+0

是的这些工作... – Ram

回答

1

所有三个查询AR e未优化:

它不是一个很好的练习在查询中使用函数,因为SQL引擎在这种情况下执行employee表的所有记录的函数。

总之,要知道什么是最好的三个就可以运行这个命令:

SET STATISTICS IO ON 

select * from dbo.employee where deptname in(select deptname from dbo.GetDeptName(50)) 

select * from dbo.employee e join dbo.GetDeptName(50) fn on e.deptname =fn.deptname 

select * from dbo.employee e where exists(select 1 from dbo.GetDeptName(50) fn where e.deptname =fn.deptname) 

然后在消息面板检查(在搜索结果右侧)输出。

,您将收到3的消息是这样的:

表 '员工'。扫描计数1,逻辑读取2,物理读取0,预读读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.

扫描中具有较少值号码的查询逻辑读取和物理读取是执行得更好的查询。

Ciao

-1

试试这个,它可能是加入功能的最佳方式。

SELECT * 
FROM dbo.employee e 
cross apply (SELECT deptname FROM dbo.GetDeptName(e.deptid)) 
where e.deptid=50