2017-04-12 63 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