2013-01-24 2 views
0

커서와 관련된 성능 문제가 있습니다. 해결하려는 문제는 다음과 같습니다. 자체 업데이트 카운터를 업데이트해야하는 UDF에 의해 계산 된 결과를 사용하여 Main 테이블의 각 레코드 (약 6000000) (하나의 업데이트 문 사용)에서 열 (VARCHAR)을 업데이트하려면 다른 카운터 테이블에.
- 문제는 UDF가 부작용이기 때문에 Countertable을 업데이트 할 수 없다는 것입니다. - 또한 READONLY 플래그로 인해 임시 테이블이나 변수 테이블을 업데이트 할 수 없습니다. - 메인 테이블에서 업데이트 트리거를 사용했지만 삽입 된 테이블에 저장된 단일 업데이트 문에 의해 트리거가 한 번 실행되었습니다.일괄 업데이트를 피하는 SQL Server 커서

내가 선택한 해결책은 다음과 같이 커서를 사용하는 것입니다.

  1. 메인 테이블에서 커서를 만듭니다.
  2. 는 등이
  3. 업데이트 PROC의 결과와 메인 테이블, 카운터 테이블
  4. 카운터 ++
  5. 호출 결과, 카운터를 계산하는 PROC에서 카운터를 얻을 첫 번째 행
  6. 를 가져
  7. 페치 카운터 테이블을 다른 행

  • 를 업데이트하지만 t 나를 믿어
  • 약 125 시간 (안돼)에 천천히.

    아무도 저를 도와 줄 수 있습니까?

  • +0

    좀 더 구체적으로 말씀해 주시겠습니까? 테이블 구조는 무엇입니까? 무엇을 업데이트하려고합니까? –

    +0

    카운터 테이블의 주 테이블 레코드를 계산하고 주 테이블에 해당 카운터를 저장합니다. 감사. – user2007209

    +1

    왜 주 테이블에 카운터를 저장하고 있습니까? – fancyPants

    답변

    1

    메인 테이블에 행을 식별하는 다른 열이 있다고 가정합니다. 그렇지 않으면 카운터가별로 의미가 없습니다.

    시도해 볼 수 있습니까? 내가 당신의 문제를 올바르게 이해했다면, 기능도 커서도 필요하지 않습니다. 임시 테이블 일 뿐이므로 동시에 테이블을 읽고 업데이트 할 수 없습니다.

    INSERT INTO tmpTable 
    SELECT 
    yourPrimaryKey, sex, YEAR(dob) AS dobyear, ROW_NUMBER() OVER (PARTITION BY YEAR(dob) ORDER BY dob) AS counter 
    FROM 
    mainTable; 
    
    UPDATE mainTable 
    SET code = CONCAT(tmpTable.sex, tmpTable.dobyear, counter) 
    FROM 
    mainTable 
    INNER JOIN tmpTable 
    ON mainTable.yourPrimaryKey = tmpTable.yourPrimaryKey; 
    

    구문 오류나 기타 이유는 테스트하지 않았습니다.

    +0

    정말 고마워요, 저에게 많은 도움이되었습니다. – user2007209

    관련 문제