0

SQL Serverで、1つのテーブルを宣言してレコードを挿入しようとしていますが、挿入に非常に時間がかかります。これは私の一時テーブルです:

   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

パフォーマンスの問題があるので、パフォーマンスの問題として調査してください。待機やキューなどの方法を使用します。SQLServerのパフォーマンスフローチャートに従ってください。

ここに投稿するときは、すべてのインデックスを含め、これらのテーブルの作成に使用される正確なDDLを常に追加し、実行プランをキャプチャしてリンクします。

ほとんどの場合INSERT、問題ではありませんが、SELECT。DISTINCTは常に、理解が不十分な結合を示すコードの臭いです。WHERE句は、引数不可の述語でいっぱいです。

于 2012-08-27T11:44:52.720 に答える
0

私は解決策を手に入れました。実際には、「declare @totalAprovalsTable」のようなテーブルの宣言を「createtable#totalAprovalsに置き換えて、すばらしい動作をしています。すべてに返信していただきありがとうございます。

于 2012-08-28T04:41:18.287 に答える