我有一个sql查询,在1秒内检索大约2500行。当我将这个查询放在一个表值函数中时,花了20分钟,只检索了450-500行,它仍在运行。
select g.AccountNumber,g.AccountName,g.ProductNumber,g.ProductName,g.SlsNumber,g.SlsName,g.GoalAmount,s.SalesAmount
from
(
select g.AccountNumber,g.AccountName,g.ProductNumber,g.ProductName,g.SlsNumber,g.SlsName,sum(g.GoalAmount) GoalAmount
from RucoNetApiBase.dbo.Goals g with(nolock)
where ((@month <> 0 and g.Month_=@month) or (@month=0 and 1=1)) and (g.Year_=year(getdate()))
group by g.AccountNumber,g.AccountName,g.ProductNumber,g.ProductName,g.SlsNumber,g.SlsName
) g left outer join
(
select s.ClientCode,left(s.ItemCode,5) ItemCode,s.SalesmanCode,sum(s.Amount) SalesAmount
from dbo.V_NetSalesBase s
where ((@month <> 0 and s.Month_=@month) or (@month=0 and 1=1)) and (s.Year_=year(getdate())) and (s.FicheSpeCode='')
group by s.ClientCode,left(s.ItemCode,5),s.SalesmanCode
) s on (g.AccountNumber=s.ClientCode) and (g.ProductNumber=s.ItemCode) and (g.SlsNumber=s.SalesmanCode)
功能;
ALTER FUNCTION [dbo].[F_GoalSummary]
(
@month int
)
RETURNS TABLE
AS
RETURN
(
select g.AccountNumber,g.AccountName,g.ProductNumber,g.ProductName,g.SlsNumber,g.SlsName,g.GoalAmount,s.SalesAmount
from
(
select g.AccountNumber,g.AccountName,g.ProductNumber,g.ProductName,g.SlsNumber,g.SlsName,sum(g.GoalAmount) GoalAmount
from RucoNetApiBase.dbo.Goals g with(nolock)
where ((@month <> 0 and g.Month_=@month) or (@month=0 and 1=1)) and (g.Year_=year(getdate()))
group by g.AccountNumber,g.AccountName,g.ProductNumber,g.ProductName,g.SlsNumber,g.SlsName
) g left outer join
(
select s.ClientCode,left(s.ItemCode,5) ItemCode,s.SalesmanCode,sum(s.Amount) SalesAmount
from dbo.V_NetSalesBase s
where ((@month <> 0 and s.Month_=@month) or (@month=0 and 1=1)) and (s.Year_=year(getdate())) and (s.FicheSpeCode='')
group by s.ClientCode,left(s.ItemCode,5),s.SalesmanCode
) s on (g.AccountNumber=s.ClientCode) and (g.ProductNumber=s.ItemCode) and (g.SlsNumber=s.SalesmanCode)
)
和使用功能;
SELECT [t0].[AccountNumber], [t0].[AccountName], [t0].[ProductNumber], [t0].[ProductName], [t0].[SlsNumber], [t0].[SlsName], [t0].[GoalAmount], [t0].[SalesAmount]
FROM [dbo].[F_GoalSummary](5) AS [t0]
ORDER BY [t0].[ProductName]
如果在管理工作室中执行查询本身每件事都很好(1秒内2500行),但是当我将查询文本放在表值函数中并在查询中使用它时,我在20分钟内只获得450行。它还在运行。那个功能昨天运行正常。
我使用的是sql server 2008 r2 Microsoft SQL Server Management Studio 10.50.1600.1 Microsoft Analysis Services客户端工具10.50.1600.1 Microsoft数据访问组件(MDAC)6.1.7600.16385 Microsoft MSXML 3.0 6.0 Microsoft Internet Explorer 8.0.7600.16385 Microsoft .NET Framework 2.0.50727.4963 操作系统6.1.7600
一个简单的解决方法可以是,而不是使用函数。但是我有一个更复杂的功能,我使用clr存储过程,并且不能轻易复制粘贴。
我不知道这两者之间有什么区别。
请帮助我!!
答案 0 :(得分:0)
您是否尝试将尝试加入的两个查询的结果放入表变量并加入这两个变量?
如果您不订购结果会怎样?