0

在 SQL Server 中,我声明了一个表并尝试插入记录,但是插入需要花费很多时间。这是我的临时表:

   declare @totalAprovals Table(
         apptype varchar(max)
       , Id varchar(max)
       , empno varchar(max)
       , empname varchar(max)
       , AppliedDate varchar(max)
       , rstatus varchar(max)
       , LeaveType varchar(max)
       , fromdate varchar(max)
       , todate varchar(max)
       , finyear varchar(max)
       , noofdays varchar(max)
       , perdate varchar(max)
       , pertype varchar(max) 
       , TotMin varchar(max)
       , FrmTime varchar(max)
       , ToTime varchar(max)
       , ConDate varchar(max)
       , Amount varchar(max)
       , MaterialDesc varchar(max)
       , EstValue varchar(max)
       , FromYear varchar(max)
       , ToYear varchar(max)
       , AvailedFrom varchar(max)
       , AvailedTo varchar(max)
       , Purpose  varchar(max)
       , FromPlace  varchar(max)
       , ToPlace  varchar(max)
       , ICode  varchar(max)
       , IDesc  varchar(max) 
       , MgrId varchar(max)    

)

和我的插入语句:

    insert into @totalAprovals          
     SELECT DISTINCT  'LEAVE' AppType
                    , CRS.applicationId ID
                    , CRS.EmpId EmpNo
                    , ISNULL((
                               SELECT FirstName 
                               FROM Tbl_Emp_M 
                               WHERE EmpId=CRS.EmpId
                               )
                               , CRS.EmpId) EmpName
                    , CONVERT(VARCHAR(10),LA.LeaveDate,103) AppliedDate
                    , (CASE ISNULL((
                                     SELECT top 1 CurStatus 
                                     FROM Tbl_CRS_Leave_AppHis_T 
                                     WHERE stepno=CRS.StepNo-1 
                                     and applicationId=CRS.applicationId  
                                     AND Status=1 
                                     order by StepNo desc),'0')   
                        WHEN '0' THEN 'Applied' 
                            WHEN '1' THEN 'Recommended' 
                            WHEN '2' THEN 'Approved' 
                       END) Rstatus
                    , LT.LeaveName LeaveType
                    , CONVERT(VARCHAR(10),LA.FromDate,103) FromDate
                    , CONVERT(VARCHAR(10),LA.ToDate,103) ToDate
                    , '' FinYear
                    , '' NoOfDays
                    , '' PerDate
                    , '' PerType
                    , '' TotMin
                    , '' FrmTime
                    , '' ToTime
                    , '' ConDate
                    , 0 Amount
                    , '' MaterialDesc
                    , 0 EstValue
                    , '' FromYear
                    , '' ToYear 
                    , ''AvailedFrom
                    , '' AvailedTo
                    , '' Purpose
                    , '' FromPlace
                    , '' ToPlace
                    , '' ICode
                    , '' IDesc
                    , CRS.MgrId    
    FROM   Tbl_Leave_App_T LA
         , Tbl_CRS_Leave_App_T CRS
         , Tbl_Leave_Typ_M LT
         , Tbl_Emp_ServiceDetails_T EMS   
    WHERE  CRS.applicationId = LA.ApplicationId 
    AND    LA.LeaveTypeId = LT.LeaveTypeId 
    and    crs.EmpId = ems.EmpId  
    AND    CRS.Status = 1 
    AND    LA.Status = 1 
    AND    LT.Status = 1 
    and    ems.Status = 1 
    AND    CRS.CurStatus IN ('0') 
    AND    YEAR(LA.LeaveDate) = YEAR(GETDATE()) 
    AND    la.LeaveTypeId not in (9,12) 
    AND  -- LA.ApplicationId LIKE '%LEV%' AND       
           CRS.EmpId = EMS.EmpId 
    and    ems.LocationCode  IN ('101','102','103','104','AHUP') 
    and    crs.MgrId ='xxxxx'

执行此操作需要 2 到 3 分钟。可能是什么原因?我是否编写了错误的过程来插入记录?

4

2 回答 2

2

您有性能问题,因此将其作为性能问题进行调查。使用Waits 和 Queues 之类的方法。遵循SQL Server 性能流程图

当您在此处发布时,请始终添加用于创建这些表的确切DDL,包括所有索引,并捕获和链接执行计划。

很可能不是INSERT问题,而是SELECT. DISTINCT 始终是一种代码异味,表示对连接的了解甚少。WHERE 子句充满了不可分割的谓词。

于 2012-08-27T11:44:52.720 回答
0

我得到了解决方案,实际上我将声明表如“declare @totalAprovals Table”替换为“create table #totalAprovals 现在它工作得很好。谢谢大家的回复。

于 2012-08-28T04:41:18.287 回答