2016-07-20 6 views
0

私は、この機能とクエリ日付圧縮SQL Serverの

機能があります。

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 

問合せ:

FEIERTAGE_Oは115の日付のリストですが、Posted_Date程度である
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 

をクエリは正常に動作しますが、唯一の問題は時間がかかります。だから私はそれをより速くする必要があります。

すべてのアイデア!

+0

クエリの実際の実行計画を投稿してください。 – StackUser

+0

'Join without predicate'、' Scalar function'、 'Index Scan' - 主な問題 – Devart

+0

は全体の機能ですか?奇妙に見えますが、名前は機能に合っていないようです。とにかく、あなたの関数は2つの 'datetime'値を期待していますが、(少なくとも)1つの' NVARCHAR'を与えます。暗黙のうちに 'datetime'に変換されていると仮定します。サブクエリでこの関数を使用すると役立ちますので、頻繁に評価する必要はありません。この関数は 'select'、' where'、 'group by'のために実行されます。 – HoneyBadger

答えて

1

このことができます場合は試してみてください:

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 

お知らせcross joinを、あなたはデカルト積とは何か確信している、(あなたは常に明示的にjoin構文を使用する必要があります)あなたの暗黙のjoinためon句が指定されていませんでしたあなたが必要ですか?これは、レコードの数を(無限大にGoogle電卓によると)爆発するでしょう。あなたがgroup byをやったのはなぜですか(集計していなくても)?私はgroup bydistinctに置き換えましたが、同じ結果が得られますが、より明確です。あなたのjoinが本当に正しいかどうかを見てください。

編集

は、あなたの質問を再度読んだ後、私は、これはあなたが必要なものを与えるだろうと思う:

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 

そのような場合、あなたが本当に任意のより多くの機能を必要としません。代わりにCASE式を使用できます。