0

以前は機能していたテーブル値関数がありますが、もう機能していないか、少なくとも時間がかかります。

唯一変更された可能性があるのは、クエリが読み取るテーブルのデータ量です。

これは関数のコードです。

ALTER FUNCTION [dbo].[SUPERVISOR_NOMINA2] (@iniDATE DATE,@endDATE DATE)
RETURNS @TABLA TABLE (
     [ID]               INT         NOT NULL PRIMARY KEY CLUSTERED
    ,[EFEC]             FLOAT       NOT NULL
    ,[TOP]              FLOAT       NOT NULL
    ,[EXTRA]            FLOAT       NOT NULL
    ,[DEUDA]            FLOAT       NOT NULL
    )

AS 
BEGIN

    INSERT INTO @tempTABLE

    /*------RUN FROM HERE TO TEST-------
    DECLARE @iniDATE DATE,@endDATE DATE
    SET @iniDATE = '2013-02-20'
    --*/

    SELECT 
    SOURCE.[ID],SOURCE.[NAME],SOURCE.[CAMPAIGN],[SUPERVISOR],[FLOOR MANAGER],[LAST LOGON],[EFEC],[TOP]
        ,[HR+] AS EXTRA
        ,CASE
            WHEN [DIF] >= 0 THEN 0
            ELSE [DIF]
        END AS DEUDA
    FROM (
    SELECT  
           NM.[ID]
          ,NM.[NAME]
          ,NM.[CAMPAIGN]
          ,NM.[SUPERVISOR]
          ,SUM(CASE 
             WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0'
             ELSE ROUND([EFEC],2)
          END) AS [EFEC]
          ,SUM(CASE 
             WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0'
             ELSE [TOP]
          END) AS [TOP]
          ,SUM(CASE 
             WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0'
             WHEN [EFEC] < [TOP] THEN 0
             WHEN [TOP]+[EXHR] > [EFEC] THEN ROUND([EFEC]-([TOP]+[EXHR]),0,1)
             ELSE [EXHR]
          END) AS [HR+]
          ,ROUND(SUM(CASE 
             WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0'
             WHEN [EFEC] < [TOP] THEN ROUND([EFEC]-[TOP],2)
             WHEN [TOP]+[EXHR] > [EFEC] THEN ROUND([EFEC]-([TOP]+ROUND([EFEC]-([TOP]+[EXHR]),0,1)),2)
             ELSE ROUND([EFEC]-([TOP]+[EXHR]),2)
          END),2) AS [DIF]

      FROM [WFO].[dbo].[VIEW_NOMINA] NM
      FULL JOIN [WFO].[dbo].[VIEW_ATTENDANCE] AT ON NM.ID = AT.ID AND NM.DATE = AT.DATE
      WHERE NM.DATE < CONVERT(DATE,GETDATE()) AND NM.[DATE] BETWEEN @iniDATE AND @endDATE
      GROUP BY NM.[ID],NM.[NAME],NM.[CAMPAIGN],NM.[SUPERVISOR]) SOURCE
      LEFT JOIN (
          SELECT [ID],CONVERT(DATE,MAX(DATETIME)) AS [LAST LOGON]
          FROM [WFO].[dbo].[AGENT-LOGBOOK] 
          GROUP BY [ID]
      ) LT ON LT.ID = SOURCE.ID
      LEFT JOIN [WFO].[dbo].[SUPERVISORS] SP ON SP.NAME = SOURCE.SUPERVISOR
      ORDER BY [NAME]
RETURN
END

面白いのは、insert ステートメントの直後と return ステートメントの前にクエリだけを実行すると、クエリは数秒で機能することです。

私が間違っているとあなたは何を示唆していますか?

4

2 に答える 2

0

これも実行されますか?多くの CASE ステートメントは、一方のケースでは char を返し、もう一方のケースでは数字を返します。これは失敗するはずです。このようにすべての行を変更します

 WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN '0'

これに

 WHEN [ATT ID] > 4 AND [ATT ID] <> 7 THEN 0
于 2013-03-04T21:39:53.583 に答える
0

考えられる問題の 1 つは、where 句の次の SQL です。

NM.DATE < CONVERT(DATE,GETDATE())

この場合は不要であると確信しているという事実に加えてCONVERT、この方法で関数を使用すると、多くの場合、配置されているインデックスが使用されなくなります。

于 2013-03-04T21:34:33.453 に答える