SQL SP运行缓慢

SQL SP运行缓慢,sql,Sql,嗨 我正在使用一个SP,它在一个有7336个RECRD的服务器上需要7分钟 在另一台有3500条记录的服务器上,6秒 有人能帮我知道为什么会这样吗 谢谢, -迪维亚 SP: 选择工作表\u ID 每人 内联受聘人 在Employee.PERSON\u ID=每个人\u ID上 和 dbo.FN_CHECKRPTSECURITYEMPLEE.PERSON_ID,@p_SEC_ACCOUNT_ID>0 LEFT JOIN SEARCH_ASSIGNMENT_VW PERSON_ASGN O

嗨 我正在使用一个SP,它在一个有7336个RECRD的服务器上需要7分钟 在另一台有3500条记录的服务器上,6秒

有人能帮我知道为什么会这样吗

谢谢, -迪维亚

SP:

选择工作表\u ID 每人 内联受聘人 在Employee.PERSON\u ID=每个人\u ID上 和 dbo.FN_CHECKRPTSECURITYEMPLEE.PERSON_ID,@p_SEC_ACCOUNT_ID>0

  LEFT JOIN SEARCH_ASSIGNMENT_VW PERSON_ASGN 
  ON PERSON_ASGN.ASSIGNMENT_ID =    
                  dbo.FN_GETRPTASSIGNMENTID(EMPLEE.PERSON_ID)

 LEFT JOIN LOOKUP EMPLEE_ASGN_STAT
 ON EMPLEE_ASGN_STAT.TYPE_ = 'ASSIGNMMENT_STATUS_CODE'
 AND EMPLEE_ASGN_STAT.CODE = PERSON_ASGN.ASGN_STAT_CODE
 INNER JOIN 
(SELECT w1.ASSIGNMENT_ID, w1.WORKSHEET_ID, w1.EFFECTIVE_DATE, w1.APPROVED_BY, w3.CREATED_BY
    FROM WORKSHEET_PAYROLL_VW w1 
    INNER JOIN WORKSHEET w3 
    ON w3.WORKSHEET_ID = w1.WORKSHEET_ID
    WHERE w1.EFFECTIVE_DATE = CASE 
                             WHEN @p_MOST_RECENT_ONLY = 'Y' 
                             THEN (SELECT MAX(w2.EFFECTIVE_DATE)
                                   FROM WORKSHEET_PAYROLL_VW w2
                                   WHERE w1.ASSIGNMENT_ID = w2.ASSIGNMENT_ID 
                                   AND (ISNULL(@p_WKS_EFFECTIVE_DATE,w2.EFFECTIVE_DATE) =w2.EFFECTIVE_DATE)) 
                             ELSE ISNULL(@p_WKS_EFFECTIVE_DATE,w1.EFFECTIVE_DATE)
                             END

       )
 PERSON_WKS
 ON PERSON_WKS.ASSIGNMENT_ID = dbo.FN_GETRPTASSIGNMENTID(EMPLEE.PERSON_ID)
 INNER JOIN  
  (SELECT ASSIGNMENT_ID, VALUE
   FROM ASSIGNMENT_HISTORY AH
   WHERE    FIELD_NAME ='HOME PAYROLL GROUP' 
   AND EFFECTIVE_DATE =  (SELECT MAX(EFFECTIVE_DATE)
                          FROM ASSIGNMENT_HISTORY 
                          WHERE ASSIGNMENT_ID = AH.ASSIGNMENT_ID 
                          AND   EFFECTIVE_DATE <=getDate() 
                          AND   FIELD_NAME = 'HOME PAYROLL GROUP')

    )HOME_PAYROLL 
    ON HOME_PAYROLL.ASSIGNMENT_ID = dbo.FN_GETRPTASSIGNMENTID(EMPLEE.PERSON_ID)

   WHERE 
    (@p_SELECTED_PERSON_ONLY = 'N' OR EMPLEE.PERSON_ID = @p_PERSON_ID)
     AND
    (@p_ASGN_STAT_CODE IS NULL OR PERSON_ASGN.ASGN_STAT_CODE = SUBSTRING(@p_ASGN_STAT_CODE,1,1)
     OR PERSON_ASGN.ASGN_STAT_CODE = SUBSTRING(@p_ASGN_STAT_CODE,2,1))
     AND
    (@p_POLICY_ID IS NULL OR PERSON_ASGN.PROGRAM_CODE = @p_POLICY_ID)
     AND
    (@p_HOME_COUNTRY_ID IS NULL OR PERSON_ASGN.HOMECOUNTRYID=@p_HOME_COUNTRY_ID) 
     AND
    (@p_HOME_CITY_ID IS NULL OR PERSON_ASGN.HOMECITYID=@p_HOME_CITY_ID )
     AND
    (@p_HOME_COMPANY_ID IS NULL OR PERSON_ASGN.HOMEBUSINESSID=@p_HOME_COMPANY_ID ) 
    AND
    (@p_HOME_DIVISION_ID IS NULL OR PERSON_ASGN.HOMECOMPONENTID=@p_HOME_DIVISION_ID )
     AND
    (@p_HOST_COUNTRY_ID IS NULL OR PERSON_ASGN.HOSTCOUNTRYID=@p_HOST_COUNTRY_ID )
     AND
    (@p_HOST_CITY_ID IS NULL OR PERSON_ASGN.HOSTCITYID=@p_HOST_CITY_ID )
     AND
    (@p_HOST_COMPANY_ID IS NULL OR PERSON_ASGN.HOSTBUSINESSID=@p_HOST_COMPANY_ID )
     AND
    (@p_HOST_DIVISION_ID IS NULL OR PERSON_ASGN.HOSTCOMPONENTID=@p_HOST_DIVISION_ID )
     AND
    (@p_CREATED_BY IS NULL OR PERSON_WKS.CREATED_BY=@p_CREATED_BY )
     AND
    (@p_APPROVED_BY IS NULL OR PERSON_WKS.APPROVED_BY=@p_APPROVED_BY )
     AND
    (@p_payroll_code IS NULL OR HOME_PAYROLL.VALUE=@p_payroll_code )

结束

模式是否完全匹配。。。特别是检查缺少的索引。

首先,您有标量函数,随着记录数的增加,它的运行速度会明显减慢,因为它们逐行处理记录。不仅如此,您还使用了连接中的函数,如果您需要性能,这是一种可怕的做法。你有一系列的或条件,往往缓慢。虽然阅读您发布的代码太难了,请尝试格式化,并且只使用所有大写字母作为关键字,但我怀疑其中一些条件是不可取的

要了解实际发生的情况,请检查SQL Server的执行计划,或解释mySQL计划和其他我认为的计划,或数据库中的等效功能。您可能会发现,随着记录数量的增加,表扫描的速度当然会显著降低


您可能还存在参数嗅探问题。请谷歌看看如何解决这个问题

一个改进是确保dbo.FN_getrptsignmentid只执行一次

目前,它执行了三次。 您可以通过加入其中一个reming调用的字段来替换其中的两个调用

差不多

SELECT  WORKSHEET_ID 
FROM    PERSON PER
        INNER JOIN PERSON EMPLEE ON EMPLEE.PERSON_ID = PER.PERSON_ID AND dbo.FN_CHECKRPTSECURITY(EMPLEE.PERSON_ID, @p_SEC_ACCOUNT_ID) > 0
        INNER JOIN (
          SELECT  w1.ASSIGNMENT_ID
                  , w1.WORKSHEET_ID
                  , w1.EFFECTIVE_DATE
                  , w1.APPROVED_BY
                  , w3.CREATED_BY
          FROM    WORKSHEET_PAYROLL_VW w1 
                  INNER JOIN WORKSHEET w3 ON w3.WORKSHEET_ID = w1.WORKSHEET_ID
          WHERE   w1.EFFECTIVE_DATE = 
                    CASE  WHEN @p_MOST_RECENT_ONLY = 'Y' 
                    THEN  (
                            SELECT  MAX(w2.EFFECTIVE_DATE)
                            FROM    WORKSHEET_PAYROLL_VW w2
                            WHERE   w1.ASSIGNMENT_ID = w2.ASSIGNMENT_ID AND (ISNULL(@p_WKS_EFFECTIVE_DATE,w2.EFFECTIVE_DATE) = w2.EFFECTIVE_DATE)
                          ) 
                    ELSE ISNULL(@p_WKS_EFFECTIVE_DATE,w1.EFFECTIVE_DATE)
                    END

        ) PERSON_WKS ON PERSON_WKS.ASSIGNMENT_ID = dbo.FN_GETRPTASSIGNMENTID(EMPLEE.PERSON_ID)
        INNER JOIN  (
          SELECT  ASSIGNMENT_ID
                  , VALUE 
          FROM    ASSIGNMENT_HISTORY AH
          WHERE   FIELD_NAME ='HOME PAYROLL GROUP' 
                  AND EFFECTIVE_DATE = (
                                          SELECT  MAX(EFFECTIVE_DATE) 
                                          FROM    ASSIGNMENT_HISTORY   
                                          WHERE   ASSIGNMENT_ID = AH.ASSIGNMENT_ID 
                                                  AND EFFECTIVE_DATE <=getDate() 
                                                  AND  FIELD_NAME = 'HOME PAYROLL GROUP'
                                      )                   
        LEFT JOIN SEARCH_ASSIGNMENT_VW PERSON_ASGN ON PERSON_ASGN.ASSIGNMENT_ID = PERSON_WKS.ASSIGNMENT_ID
        LEFT JOIN LOOKUP EMPLEE_ASGN_STAT ON EMPLEE_ASGN_STAT.TYPE_ = 'ASSIGNMMENT_STATUS_CODE' AND EMPLEE_ASGN_STAT.CODE = PERSON_ASGN.ASGN_STAT_CODE
       ) HOME_PAYROLL ON HOME_PAYROLL.ASSIGNMENT_ID = PERSON_WKS.ASSIGNMENT_ID
 WHERE  (@p_SELECTED_PERSON_ONLY = 'N' OR EMPLEE.PERSON_ID = @p_PERSON_ID) 
        AND (@p_ASGN_STAT_CODE IS NULL OR PERSON_ASGN.ASGN_STAT_CODE = SUBSTRING(@p_ASGN_STAT_CODE,1,1) OR PERSON_ASGN.ASGN_STAT_CODE = SUBSTRING(@p_ASGN_STAT_CODE,2,1)) 
        AND (@p_POLICY_ID IS NULL OR PERSON_ASGN.PROGRAM_CODE = @p_POLICY_ID) 
        AND (@p_HOME_COUNTRY_ID IS NULL OR PERSON_ASGN.HOMECOUNTRYID=@p_HOME_COUNTRY_ID) 
        AND (@p_HOME_CITY_ID IS NULL OR PERSON_ASGN.HOMECITYID=@p_HOME_CITY_ID ) 
        AND (@p_HOME_COMPANY_ID IS NULL OR PERSON_ASGN.HOMEBUSINESSID=@p_HOME_COMPANY_ID ) 
        AND (@p_HOME_DIVISION_ID IS NULL OR PERSON_ASGN.HOMECOMPONENTID=@p_HOME_DIVISION_ID ) 
        AND (@p_HOST_COUNTRY_ID IS NULL OR PERSON_ASGN.HOSTCOUNTRYID=@p_HOST_COUNTRY_ID ) 
        AND (@p_HOST_CITY_ID IS NULL OR PERSON_ASGN.HOSTCITYID=@p_HOST_CITY_ID ) 
        AND (@p_HOST_COMPANY_ID IS NULL OR PERSON_ASGN.HOSTBUSINESSID=@p_HOST_COMPANY_ID ) 
        AND (@p_HOST_DIVISION_ID IS NULL OR PERSON_ASGN.HOSTCOMPONENTID=@p_HOST_DIVISION_ID ) 
        AND (@p_CREATED_BY IS NULL OR PERSON_WKS.CREATED_BY=@p_CREATED_BY ) 
        AND (@p_APPROVED_BY IS NULL OR PERSON_WKS.APPROVED_BY=@p_APPROVED_BY ) 
        AND (@p_payroll_code IS NULL OR HOME_PAYROLL.VALUE=@p_payroll_code )
ORDER BY 
        PER.LAST_NAME ASC
        , PER.FIRST_NAME ASC
        , PERSON_WKS.EFFECTIVE_DATE DESC

不是没有详细信息,不是。请提供存储过程的代码。是。架构完全匹配。:by mistak caps lock已打开:
SELECT  WORKSHEET_ID 
FROM    PERSON PER
        INNER JOIN PERSON EMPLEE ON EMPLEE.PERSON_ID = PER.PERSON_ID AND dbo.FN_CHECKRPTSECURITY(EMPLEE.PERSON_ID, @p_SEC_ACCOUNT_ID) > 0
        INNER JOIN (
          SELECT  w1.ASSIGNMENT_ID
                  , w1.WORKSHEET_ID
                  , w1.EFFECTIVE_DATE
                  , w1.APPROVED_BY
                  , w3.CREATED_BY
          FROM    WORKSHEET_PAYROLL_VW w1 
                  INNER JOIN WORKSHEET w3 ON w3.WORKSHEET_ID = w1.WORKSHEET_ID
          WHERE   w1.EFFECTIVE_DATE = 
                    CASE  WHEN @p_MOST_RECENT_ONLY = 'Y' 
                    THEN  (
                            SELECT  MAX(w2.EFFECTIVE_DATE)
                            FROM    WORKSHEET_PAYROLL_VW w2
                            WHERE   w1.ASSIGNMENT_ID = w2.ASSIGNMENT_ID AND (ISNULL(@p_WKS_EFFECTIVE_DATE,w2.EFFECTIVE_DATE) = w2.EFFECTIVE_DATE)
                          ) 
                    ELSE ISNULL(@p_WKS_EFFECTIVE_DATE,w1.EFFECTIVE_DATE)
                    END

        ) PERSON_WKS ON PERSON_WKS.ASSIGNMENT_ID = dbo.FN_GETRPTASSIGNMENTID(EMPLEE.PERSON_ID)
        INNER JOIN  (
          SELECT  ASSIGNMENT_ID
                  , VALUE 
          FROM    ASSIGNMENT_HISTORY AH
          WHERE   FIELD_NAME ='HOME PAYROLL GROUP' 
                  AND EFFECTIVE_DATE = (
                                          SELECT  MAX(EFFECTIVE_DATE) 
                                          FROM    ASSIGNMENT_HISTORY   
                                          WHERE   ASSIGNMENT_ID = AH.ASSIGNMENT_ID 
                                                  AND EFFECTIVE_DATE <=getDate() 
                                                  AND  FIELD_NAME = 'HOME PAYROLL GROUP'
                                      )                   
        LEFT JOIN SEARCH_ASSIGNMENT_VW PERSON_ASGN ON PERSON_ASGN.ASSIGNMENT_ID = PERSON_WKS.ASSIGNMENT_ID
        LEFT JOIN LOOKUP EMPLEE_ASGN_STAT ON EMPLEE_ASGN_STAT.TYPE_ = 'ASSIGNMMENT_STATUS_CODE' AND EMPLEE_ASGN_STAT.CODE = PERSON_ASGN.ASGN_STAT_CODE
       ) HOME_PAYROLL ON HOME_PAYROLL.ASSIGNMENT_ID = PERSON_WKS.ASSIGNMENT_ID
 WHERE  (@p_SELECTED_PERSON_ONLY = 'N' OR EMPLEE.PERSON_ID = @p_PERSON_ID) 
        AND (@p_ASGN_STAT_CODE IS NULL OR PERSON_ASGN.ASGN_STAT_CODE = SUBSTRING(@p_ASGN_STAT_CODE,1,1) OR PERSON_ASGN.ASGN_STAT_CODE = SUBSTRING(@p_ASGN_STAT_CODE,2,1)) 
        AND (@p_POLICY_ID IS NULL OR PERSON_ASGN.PROGRAM_CODE = @p_POLICY_ID) 
        AND (@p_HOME_COUNTRY_ID IS NULL OR PERSON_ASGN.HOMECOUNTRYID=@p_HOME_COUNTRY_ID) 
        AND (@p_HOME_CITY_ID IS NULL OR PERSON_ASGN.HOMECITYID=@p_HOME_CITY_ID ) 
        AND (@p_HOME_COMPANY_ID IS NULL OR PERSON_ASGN.HOMEBUSINESSID=@p_HOME_COMPANY_ID ) 
        AND (@p_HOME_DIVISION_ID IS NULL OR PERSON_ASGN.HOMECOMPONENTID=@p_HOME_DIVISION_ID ) 
        AND (@p_HOST_COUNTRY_ID IS NULL OR PERSON_ASGN.HOSTCOUNTRYID=@p_HOST_COUNTRY_ID ) 
        AND (@p_HOST_CITY_ID IS NULL OR PERSON_ASGN.HOSTCITYID=@p_HOST_CITY_ID ) 
        AND (@p_HOST_COMPANY_ID IS NULL OR PERSON_ASGN.HOSTBUSINESSID=@p_HOST_COMPANY_ID ) 
        AND (@p_HOST_DIVISION_ID IS NULL OR PERSON_ASGN.HOSTCOMPONENTID=@p_HOST_DIVISION_ID ) 
        AND (@p_CREATED_BY IS NULL OR PERSON_WKS.CREATED_BY=@p_CREATED_BY ) 
        AND (@p_APPROVED_BY IS NULL OR PERSON_WKS.APPROVED_BY=@p_APPROVED_BY ) 
        AND (@p_payroll_code IS NULL OR HOME_PAYROLL.VALUE=@p_payroll_code )
ORDER BY 
        PER.LAST_NAME ASC
        , PER.FIRST_NAME ASC
        , PERSON_WKS.EFFECTIVE_DATE DESC