2013-05-01 2 views
0

SQL Server Management Studio를 통해 실행중인 아래 쿼리는 매우 느립니다.SQL Server 쿼리가 매우 느리게 실행 중입니다.

입력 테이블 tbl_sb12_bhs에는 약 40000 개의 레코드가 있고 1 시간 후 40 개의 레코드 만 처리됩니다.

이 항목을 조금 더 빨리 실행하려면 여기를 변경할 수 있습니까?

DECLARE @bsrange INT 

SET @bsrange = 0 

WHILE @bsrange <= (SELECT max([p_a_l_out]) 
        FROM [DB001].[FD\f7].[tbl_sb12_bhs]) 
    BEGIN 
     INSERT INTO [FD\f7].tbl_sb13_b_lin1 
        (aId, 
        p_a_l_out, 
        bs_id, 
        bs_db, 
        bs_tbl, 
        bs_column, 
        Int1, 
        cd1, 
        Hop1, 
        Int2, 
        cd2, 
        Hop2, 
        Int3, 
        cd3, 
        Hop3, 
        Int4, 
        cd4, 
        Hop4, 
        Int5, 
        cd5, 
        Hop5, 
        Int6, 
        cd6, 
        Hop6, 
        Int7, 
        cd7, 
        Hop7, 
        Int8, 
        cd8, 
        Hop8, 
        Int9, 
        cd9, 
        Hop9, 
        Int10, 
        cd10, 
        Hop10, 
        Int11, 
        cd11, 
        Hop11, 
        Int12, 
        cd12, 
        Hop12, 
        Int13, 
        cd13, 
        Hop13, 
        Int14, 
        cd14, 
        Hop14, 
        Int15, 
        cd15, 
        Hop15, 
        Int16, 
        cd16, 
        Hop16) 
     SELECT DISTINCT tbl_sb12_bhs.aId, 
         tbl_sb12_bhs.p_a_l_out, 
         tbl_sb12_bhs.bs_id, 
         tbl_sb12_bhs.bs_db, 
         tbl_sb12_bhs.bs_tbl, 
         tbl_sb12_bhs.bs_column, 
         tbl_rpt_val_pt_crl.pt_el_Int AS Int1, 
         tbl_rpt_val_pt_crl.user_cd  AS cd1, 
         tbl_rpt_val_pt_crl.cfk_upel  AS Hop1, 
         tbl_rpt_val_pt_crl_1.pt_el_Int AS Int2, 
         tbl_rpt_val_pt_crl_1.user_cd AS cd2, 
         tbl_rpt_val_pt_crl_1.cfk_upel AS Hop2, 
         tbl_rpt_val_pt_crl_2.pt_el_Int AS Int3, 
         tbl_rpt_val_pt_crl_2.user_cd AS cd3, 
         tbl_rpt_val_pt_crl_2.cfk_upel AS Hop3, 
         tbl_rpt_val_pt_crl_3.pt_el_Int AS Int4, 
         tbl_rpt_val_pt_crl_3.user_cd AS cd4, 
         tbl_rpt_val_pt_crl_3.cfk_upel AS Hop4, 
         tbl_rpt_val_pt_crl_4.pt_el_Int AS Int5, 
         tbl_rpt_val_pt_crl_4.user_cd AS cd5, 
         tbl_rpt_val_pt_crl_4.cfk_upel AS Hop5, 
         tbl_rpt_val_pt_crl_5.pt_el_Int AS Int6, 
         tbl_rpt_val_pt_crl_5.user_cd AS cd6, 
         tbl_rpt_val_pt_crl_5.cfk_upel AS Hop6, 
         tbl_rpt_val_pt_crl_6.pt_el_Int AS Int7, 
         tbl_rpt_val_pt_crl_6.user_cd AS cd7, 
         tbl_rpt_val_pt_crl_6.cfk_upel AS Hop7, 
         tbl_rpt_val_pt_crl_7.pt_el_Int AS Int8, 
         tbl_rpt_val_pt_crl_7.user_cd AS cd8, 
         tbl_rpt_val_pt_crl_7.cfk_upel AS Hop8, 
         tbl_rpt_val_pt_crl_8.pt_el_Int AS Int9, 
         tbl_rpt_val_pt_crl_8.user_cd AS cd9, 
         tbl_rpt_val_pt_crl_8.cfk_upel AS Hop9, 
         tbl_rpt_val_pt_crl_9.pt_el_Int AS Int10, 
         tbl_rpt_val_pt_crl_9.user_cd AS cd10, 
         tbl_rpt_val_pt_crl_9.cfk_upel AS Hop10, 
         tbl_rpt_val_pt_crl_10.pt_el_Int AS Int11, 
         tbl_rpt_val_pt_crl_10.user_cd AS cd11, 
         tbl_rpt_val_pt_crl_10.cfk_upel AS Hop11, 
         tbl_rpt_val_pt_crl_11.pt_el_Int AS Int12, 
         tbl_rpt_val_pt_crl_11.user_cd AS cd12, 
         tbl_rpt_val_pt_crl_11.cfk_upel AS Hop12, 
         tbl_rpt_val_pt_crl_12.pt_el_Int AS Int13, 
         tbl_rpt_val_pt_crl_12.user_cd AS cd13, 
         tbl_rpt_val_pt_crl_12.cfk_upel AS Hop13, 
         tbl_rpt_val_pt_crl_13.pt_el_Int AS Int14, 
         tbl_rpt_val_pt_crl_13.user_cd AS cd14, 
         tbl_rpt_val_pt_crl_13.cfk_upel AS Hop14, 
         tbl_rpt_val_pt_crl_14.pt_el_Int AS Int15, 
         tbl_rpt_val_pt_crl_14.user_cd AS cd15, 
         tbl_rpt_val_pt_crl_14.cfk_upel AS Hop15, 
         tbl_rpt_val_pt_crl_15.pt_el_Int AS Int16, 
         tbl_rpt_val_pt_crl_15.user_cd AS cd16, 
         tbl_rpt_val_pt_crl_15.cfk_upel AS Hop16 
     FROM (SELECT DISTINCT pk_a AS aId, 
           p_a_l_out, 
           bs_id, 
           bs_db, 
           bs_tbl, 
           bs_column, 
           hop_pt_id_1, 
           hop_pt_id_2, 
           hop_pt_id_3, 
           hop_pt_id_4, 
           hop_pt_id_5, 
           hop_pt_id_6, 
           hop_pt_id_7, 
           hop_pt_id_8, 
           hop_pt_id_9, 
           hop_pt_id_10, 
           hop_pt_id_11, 
           hop_pt_id_12, 
           hop_pt_id_13, 
           hop_pt_id_14, 
           hop_pt_id_15, 
           hop_pt_id_16 
       FROM [FD\f7].tbl_sb12_bhs 
       WHERE [p_a_l_out] >= @bsrange 
        AND [p_a_l_out] < (@bsrange + 1)) AS tbl_sb12_bhs 
      LEFT JOIN tbl_rpt_val_pt_crl 
       ON tbl_sb12_bhs.hop_pt_id_1 = tbl_rpt_val_pt_crl.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_1 
       ON tbl_sb12_bhs.hop_pt_id_2 = tbl_rpt_val_pt_crl_1.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_2 
       ON tbl_sb12_bhs.hop_pt_id_3 = tbl_rpt_val_pt_crl_2.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_3 
       ON tbl_sb12_bhs.hop_pt_id_4 = tbl_rpt_val_pt_crl_3.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_4 
       ON tbl_sb12_bhs.hop_pt_id_5 = tbl_rpt_val_pt_crl_4.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_5 
       ON tbl_sb12_bhs.hop_pt_id_6 = tbl_rpt_val_pt_crl_5.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_6 
       ON tbl_sb12_bhs.hop_pt_id_7 = tbl_rpt_val_pt_crl_6.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_7 
       ON tbl_sb12_bhs.hop_pt_id_8 = tbl_rpt_val_pt_crl_7.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_8 
       ON tbl_sb12_bhs.hop_pt_id_9 = tbl_rpt_val_pt_crl_8.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_9 
       ON tbl_sb12_bhs.hop_pt_id_10 = tbl_rpt_val_pt_crl_9.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_10 
       ON tbl_sb12_bhs.hop_pt_id_11 = tbl_rpt_val_pt_crl_10.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_11 
       ON tbl_sb12_bhs.hop_pt_id_12 = tbl_rpt_val_pt_crl_11.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_12 
       ON tbl_sb12_bhs.hop_pt_id_13 = tbl_rpt_val_pt_crl_12.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_13 
       ON tbl_sb12_bhs.hop_pt_id_14 = tbl_rpt_val_pt_crl_13.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_14 
       ON tbl_sb12_bhs.hop_pt_id_15 = tbl_rpt_val_pt_crl_14.sk_el_pt 
      LEFT JOIN tbl_rpt_val_pt_crl AS tbl_rpt_val_pt_crl_15 
       ON tbl_sb12_bhs.hop_pt_id_16 = tbl_rpt_val_pt_crl_15.sk_el_pt 

     SET @bsrange = @bsrange + 1 
    END 
+3

16 열 tbl_rpt_val_pt_crl에 16 배에 가입하는 대신, 엔티티가 한 번 tbl_rpt_val_pt_crl에 합류 당 16 개 행을 가지고 테이블을 정규화 :

그래서 같은 것이 될 것이다. – HardCode

+2

루프없이 하나의 삽입 quey를 실행하는 방법을 생각해보십시오. –

+0

결과를 #temp 테이블에 던져 볼 수 있습니까? 그렇다면 삽입 하시겠습니까? – granadaCoder

답변

0

내 생각에 가장 집중적 인 작업은 모두 한 번에 많은 집중적 인 작업을 수행하기 때문입니다. 샘플 데이터가 없어도 힘든 일이지만 몇 가지 제안을해볼 수 있습니다.

한 시간 후에 40 개의 레코드 만 처리한다고 말한 것에서부터 루프 내부에서 진행되는 작업이 느려집니다.

SELECT DISTINCT는 모든 데이터를 비교해야하기 때문에 값이 싸지 않습니다. 또한 상당히 많은 열을 비교하고 있습니다. 가능한 경우 고유 한 선택에 필요한 최소한의 수로 열 수를 제한 한 다음 원본 테이블과 자체 조인하면 더 빨리 실행될 수 있습니다. 그것은 당신이 같은 결과를 얻고 있는지 그리고 그것이 더 빠를지를 확인하기 위해 그것의 나머지 부분과 분리하여 테스트하기에 충분히 간단해야합니다.

또한 조인이 많을수록 일반적으로 성능이 저하됩니다. 정규화를 위해 지불하는 가격입니다.

어쨌든, 나는 그걸 뒤로 물러나서 가장 작은 작업 단위로 나누려고합니다. 그러면 범인을 찾을 때까지 각각 하나씩 개별적으로 테스트 할 수 있습니다. 그렇게함으로써 훨씬 더 나은 방법을 생각할 수 있습니다. 다시 말하지만, 어떤 샘플 데이터도없이 이것은 도움이되는 것이 어렵습니다.

0

대상에 인덱스가 있거나 인덱스가 있으면 모든 행이 다시 인덱싱됩니다. 삽입이 완료되면 대상 테이블의 모든 인덱스를 비활성화 한 다음 다시 불러올 수 있습니다. Id 일괄 처리는 5k 레코드의 인서트 범위 (in-range)를 제한하여 차단을 줄이거 나 결과에서 select와 bcp의 결과로 임시 파일을 생성합니다. 그 끔찍한 왼쪽 세트를 한 번 녹음하기 전에 매번 결합하기 때문입니다. SQL은 약 7 개 또는 8 개 이상의 왼쪽 또는 오른쪽 조인을 최적화합니다. 내 생각 엔 삽입되는 테이블에 거의 또는 전혀 인덱스가 없다는 것입니다. 즉, 각 조인 또는 약 17 개의 테이블 스캔이 삽입 된 각 행에 대한 테이블 스캔을 의미합니다. 죄송 합니다만이 접근법은 모든 단계에서 잘못되었습니다. 아니면 당신에게 데이트 센타를 사주기 위해 상사를 얻을 수 있습니다 ....

0

또 다른 작업은 초기에 임시 테이블에 조인 한 다음 참조하는 것입니다. 매번 별개 또는 조인 할 필요가 없습니다. 그냥 bsrange에 where 절을 추가하십시오.

Create temporary table with as much of the joins/distinct as you can. 
while..... 
    insert into [FD\f7].tbl_sb13_b_lin1 
     select * from temptable where [p_a_l_out] >= @bsrange 
        AND [p_a_l_out] < (@bsrange + 1) 
관련 문제