2016-07-20 11 views
0

Ich habe diese Funktion und die AbfrageDatum Kompression SQL Server

Funktion:

ALTER FUNCTION [dbo].[dateholiday] 
(@date1 AS DATETIME, 
@date2 AS DATETIME) 
RETURNS DATETIME 
AS 
BEGIN 

DECLARE @Answer AS DATETIME 

IF(@date1 = @date2) 
SET @Answer = @date2 

RETURN @Answer 
END 

die Abfrage:

SELECT Posted_By 
    ,Document_Number 
    ,Account_Description 
    ,dbo.dateholiday(CONVERT(NVARCHAR(10), CONVERT(DATETIME, Feiertage, 104), 20), [dbo].[QLIK].[Posted_Date]) AS Holiday 
FROM [dbo].[FEIERTAGE_O] 
    ,[dbo].[QLIK] 
WHERE dbo.dateholiday(CONVERT(NVARCHAR(10), CONVERT(DATETIME, Feiertage, 104), 20), [dbo].[QLIK].[Posted_Date]) IS NOT NULL 
GROUP BY dbo.dateholiday(CONVERT(NVARCHAR(10), CONVERT(DATETIME, Feiertage, 104), 20), [dbo].[QLIK].[Posted_Date]) 
    ,Posted_By 
    ,Document_Number 
    ,Account_Description 

wo FEIERTAGE_O ist eine Liste von 115 Tagen, aber die Posted_Date über ist 1914495. Die Abfrage funktioniert gut, aber das einzige Problem ist, dass es viel und viel Zeit in Anspruch nimmt. Also muss ich es schneller machen.

Irgendwelche Ideen!

+0

Bitte posten Sie Ihren aktuellen Ausführungsplan Ihrer Anfrage – StackUser

+0

'Join ohne Prädikat',' Skalarfunktion', 'Index Scan' - primäre Probleme – Devart

+0

ist das die ganze Funktion? Scheint seltsam, auch der Name scheint nicht zur Funktion zu passen. Wie auch immer, Ihre Funktion erwartet zwei 'datetime' Werte, aber Sie füttern sie (mindestens) einen' NVARCHAR'. Ich nehme an, dass es implizit in eine "Datetime" konvertiert wird. Es kann auch hilfreich sein, die Funktion in einer Unterabfrage zu verwenden, damit Sie sie nicht so oft auswerten müssen. Die Funktion wird für das 'select', für' where' und für 'group by' ausgeführt – HoneyBadger

Antwort

1

Versuchen Sie, ob das hilft:

SELECT  Posted_By 
,   Document_Number 
,   Account_Description 
,   Holiday 
FROM  (
       SELECT DISTINCT Posted_By 
       ,   Document_Number 
       ,   Account_Description 
       ,   dbo.dateholiday(CONVERT(DATETIME, Feiertage, 104)), [dbo].[QLIK].[Posted_Date]) AS Holiday 
       FROM  [dbo].[FEIERTAGE_O] 
       CROSS JOIN [dbo].[QLIK] 
      ) A 
WHERE  Holiday IS NOT NULL 

Beachten Sie die cross join, Sie keine on Klausel für Ihre implizite join angegeben haben (Sie immer explizit join Syntax verwenden sollte), sind Sie sicher, ein kartesisches Produkt ist, was du brauchst? Dies wird die Anzahl der Datensätze explodieren (nach google Rechner bis unendlich). Haben Sie deshalb eine group by gemacht (obwohl Sie nicht aggregieren)? Ich habe die group by durch eine distinct ersetzt, wird das gleiche Ergebnis geben, ist aber klarer. Schau dir deine join an, ob es wirklich richtig ist.

bearbeiten

Nach der erneuten Lektüre Ihrer Frage Ich denke, das Sie geben, was Sie brauchen:

SELECT  Posted_By 
,   Document_Number 
,   Account_Description 
,   Holiday 
FROM  (
       SELECT DISTINCT Posted_By 
       ,   Document_Number 
       ,   Account_Description 
       ,   dbo.dateholiday(CONVERT(DATETIME, Feiertage, 104)), [dbo].[QLIK].[Posted_Date]) AS Holiday 
       FROM  [dbo].[FEIERTAGE_O] FO 
       LEFT JOIN [dbo].[QLIK] Q 
         ON Q.[Posted_Date] = FO.Feiertage 
      ) A 
WHERE  Holiday IS NOT NULL 

Wenn das der Fall ist, brauchen Sie nicht wirklich die Funktion nicht mehr. Sie können stattdessen einen Ausdruck CASE verwenden.