webForumDet fria alternativet

User-defined function enormt seg ibland.

0 svar · 244 visningar · startad av Fredde Mannen

Fredde MannenMedlem sedan nov. 20014 054 inlägg
#1

Har skapat en User-defined scalar function som då innehåller en sql-sats som i vanliga fall smäller till så finns restultatet inom 1-2 sek. Men nu när jag skapat en funktion av den och vill använda den i en annan sql-sats, eller om jag bara testar att skriva ut resultatet

 print dbo.CountAds(@CustomerId,@StartDate,@StopDate)

så tar det kring 20 sek.

Om jag använder den i en annan sql-sats likt denna

select customername, customerid, dbo.CountAds(customerid, @StartDate,@StopDate) as Antal from customers

så kan det ta mellan 20 sek till ja, tills jag inte orkar vänta längre.

Och det är ju tokigt alldeles för länge. Funktionen ser ut som följer (visas ur modifieringsläget

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

-- =============================================
-- Author:		Fredrik Malmström
-- Create date: 20070613
-- Description:	Beräknar antalet annonser under en viss period som underlag för fakturering
-- =============================================
ALTER FUNCTION [dbo].[CountAds] 
(
	-- Add the parameters for the function here
	@CustomerID int, @StartDate datetime, @Stopdate datetime
)
RETURNS int
AS
BEGIN
	-- Declare the return variable here
	DECLARE @Result int

-- SQL-sats för att returnera antalet annonser för import kunder som 
-- skall vara underlag för fakturering

select @Result = (select sum(c.annonser) from (
	select 
	(
	select count(distinct custompropertyid) from properties where customer=a.Customer
	and imported between @StartDate and @StopDate
	) As annonser 
from properties a
	inner join 
customers b on
	a.Customer=b.customerid 
	where a.customer=@CustomerID
-- end
UNION 
-- SQL-sats beräkna antal annonser för ej importerad kund som skall
-- vara underlag för fakturering.
select
	(
		(select count(*) from properties where customer=a.Customer
			and deleted is null and imported is null)
		+ 
		(select count(propertyid) from properties where customer=a.Customer
			and deleted between @StartDate and @StopDate and imported is null)
	) As annonser
from properties a
	inner join 
customers b on
	a.Customer=b.customerid
	where a.Customer=@CustomerID
) as c)

-- Returnera antalet annonser under den angivna perioden. 
	RETURN @Result

END

beror det på hur jag skrivit sql-satsen i funktionen eller kan det bero på annat?!

137 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)