webForumDet fria alternativet
Logga in / Bli medlem

User-defined function enormt seg ibland.

Databaser & SQL

0 svar · 244 visningar · startad av Fredde Mannen

Medlem sedan nov. 20014 054 inlägg
Frågan#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?!

254 ms totalt · 4 externa anrop · v20260731065814-full.df76c93f
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
122 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)