Ich habe diese Abfrage in MS SQL, die sich sehr seltsam verhält (zumindest aus meiner Sicht).
Ich habe benutzerdefinierte Funktion namens: dbo.NajblizszaDataWyceny(3, '2010-02-05'), die einfache Prüfung für TOP 1 Eintrag in einer Tabelle mit einigen anderen verbunden ist. Die Abfrage selbst dauert wie Millisekunden, also ist es kein großes Problem, aber ich zeige die Funktion trotzdem.
CREATE FUNCTION [dbo].[NajblizszaDataWyceny] (@idPortfela INT, @dataWaluty DATETIME)
RETURNS DATETIME
AS BEGIN
RETURN (
SELECT TOP 1 [WycenaData]
FROM [BazaZarzadzanie].[dbo].[Wycena] t1
LEFT JOIN [BazaZarzadzanie].[dbo].[KlienciPortfeleKonta] t3
ON t1.[KlienciPortfeleKontaID] = t3.[KlienciPortfeleKontaID]
LEFT JOIN [BazaZarzadzanie].[dbo].[KlienciPortfele] t4
ON t3.[PortfelID] = t4.[PortfelID]
WHERE [WycenaData] <= @dataWaluty AND [t3].[PortfelID] = @idPortfela
ORDER BY [WycenaData] DESC)
END
Wenn ich diese Funktion auf folgende Weise verwende:
DECLARE @dataWyceny DATETIME
SET @dataWyceny = dbo.NajblizszaDataWyceny(3, '2010-02-05')
SELECT t1.[KlienciPortfeleKontaID],
t4.[PortfelIdentyfikator] AS 'UmowaNr',
t5.[KlienciRachunkiNumer],
[WycenaData],
t2.[InISIN] AS 'InstrumentISIN',
t2.[InNazwa] AS 'InstrumentNazwa',
[WycenaWartosc]
FROM [BazaZarzadzanie].[dbo].[Wycena] t1
LEFT JOIN [BazaZarzadzanie].[dbo].[Instrumenty] t2
ON t1.[InID] = t2.[InID]
LEFT JOIN [BazaZarzadzanie].[dbo].[KlienciPortfeleKonta] t3
ON t1.[KlienciPortfeleKontaID] = t3.[KlienciPortfeleKontaID]
LEFT JOIN [BazaZarzadzanie].[dbo].[KlienciPortfele] t4
ON t3.[PortfelID] = t4.[PortfelID]
LEFT JOIN [BazaZarzadzanie].[dbo].[KlienciRachunki] t5
ON t3.[KlienciRachunkiID] = t5.[KlienciRachunkiID]
LEFT JOIN [BazaZarzadzanie].[dbo].[WycenaTyp] t6
ON t1.[WycenaTyp] = t6.[WycenaTyp]
WHERE WycenaData = @dataWyceny AND t3.[PortfelID] = 3
ORDER BY t5.[KlienciRachunkiNumer],
WycenaData
dauert es 1 Sekunde, um zu laufen. Aber wenn ich die Benutzerfunktion direkt in WHERE einfüge, sieht es so aus:
SELECT t1.[KlienciPortfeleKontaID],
t4.[PortfelIdentyfikator] AS 'UmowaNr',
t5.[KlienciRachunkiNumer],
[WycenaData],
t2.[InISIN] AS 'InstrumentISIN',
t2.[InNazwa] AS 'InstrumentNazwa',
[WycenaWartosc]
FROM [BazaZarzadzanie].[dbo].[Wycena] t1
LEFT JOIN [BazaZarzadzanie].[dbo].[Instrumenty] t2
ON t1.[InID] = t2.[InID]
LEFT JOIN [BazaZarzadzanie].[dbo].[KlienciPortfeleKonta] t3
ON t1.[KlienciPortfeleKontaID] = t3.[KlienciPortfeleKontaID]
LEFT JOIN [BazaZarzadzanie].[dbo].[KlienciPortfele] t4
ON t3.[PortfelID] = t4.[PortfelID]
LEFT JOIN [BazaZarzadzanie].[dbo].[KlienciRachunki] t5
ON t3.[KlienciRachunkiID] = t5.[KlienciRachunkiID]
LEFT JOIN [BazaZarzadzanie].[dbo].[WycenaTyp] t6
ON t1.[WycenaTyp] = t6.[WycenaTyp]
WHERE WycenaData = dbo.NajblizszaDataWyceny(3, '2010-02-05') AND t3.[PortfelID] = 3
ORDER BY t5.[KlienciRachunkiNumer],
WycenaData
Es dauert 1,5 Minuten bis zum Ende. Kann mir jemand erklären, warum das passiert?