我在MS SQL中有這個查詢,這很奇怪(至少從我的角度來看)。如果在WHERE子句中使用函數,SQL查詢時間從1秒跳到1分鐘以上
我有一個用戶定義的函數調用:dbo.NajblizszaDataWyceny(3,'2010-02-05')這是簡單的檢查TOP 1條目在一個表中加入了其他人。查詢本身需要幾毫秒,所以它不是一個大問題,但我仍然顯示該函數。
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
當我使用以下方式這樣的功能:
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
它需要1秒來運行。但是,當我在WHERE直接把用戶的功能,所以它看起來像:
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
它需要1.5分鐘完成。任何人都可以解釋爲什麼會發生?
除了重新調用函數之外,索引也不能再使用了。這可能會產生更大的影響。 – Thilo 2010-02-05 09:37:21
感謝這真的解釋了很多。 – MadBoy 2010-02-05 09:44:53