복붙노트

[SQL] MS SQL 서버 - 때 커서 좋은 무엇입니까?

SQL

MS SQL 서버 - 때 커서 좋은 무엇입니까?

등 내가 저장 프로 시저를 작성했습니다 여러 번, 나는 처음에 커서를 사용하고 나중에 내 절차에 약간의 성능 문제를 찾을 수 있습니다.

내가 읽은 모든 것은 불필요한 잠금 등 및 성능 테스트가 동일 증명 원인 커서, 끔찍했다.

그들이 유용하거나 좋은 당신이 커서 어떤 상황에서 사용 하는가하면 내 질문은?

아무 소용이없는 경우, 그들은 왜 SQL에 대한 나쁜 제어 구조 / 유형을 만들 것?

해결법

  1. ==============================

    1.일반적으로 그들은 피할 수 있지만,이 기능은 이유가 그들을 사용하는 시간이 있습니다. 나는 내가 본 커서의 90 + %가 필요하지 않습니다 말할 것입니다. 당신은 CRUD 작업을 위해 그들을 사용하는 경우, 그것은 거의 항상 집합 기반 방식으로 칠을 할 수 있습니다. 나는 종종 사람들이 삽입에 값 절 대신 선택 한 Statment을 사용할 수 있습니다 그들이 사용 업데이트에 조인하는 방법을 모르거나 삭제하지 않기 때문에 이것에 대한 커서를 사용하거나 것을 보았다. 사람들이 실제로 쉽게 case 문으로 처리 할 수 ​​약간 더 복잡한 처리를 필요가 있다고 생각하는 또 다른 불필요한 사용.

    일반적으로 그들은 피할 수 있지만,이 기능은 이유가 그들을 사용하는 시간이 있습니다. 나는 내가 본 커서의 90 + %가 필요하지 않습니다 말할 것입니다. 당신은 CRUD 작업을 위해 그들을 사용하는 경우, 그것은 거의 항상 집합 기반 방식으로 칠을 할 수 있습니다. 나는 종종 사람들이 삽입에 값 절 대신 선택 한 Statment을 사용할 수 있습니다 그들이 사용 업데이트에 조인하는 방법을 모르거나 삭제하지 않기 때문에 이것에 대한 커서를 사용하거나 것을 보았다. 사람들이 실제로 쉽게 case 문으로 처리 할 수 ​​약간 더 복잡한 처리를 필요가 있다고 생각하는 또 다른 불필요한 사용.

    커서는 때때로 빠른 실행중인 총 같은 것을 계산이다.

    커서는 한 번에 하나의 입력 값을 처리하도록 설정되어 저장된 프로 시저의 여러 실행을위한 편리합니다. (나는 데이터의 매우 작은 세트를 치는 것 알지 못한다면) 나는 사용자 procs 저장을 실행하기 위해이 기능을 사용하지 않지만 여러 테이블에 대한 시스템 발동을 실행하는 데 필요한 때 데이터베이스 관리자를위한 매우 편리합니다.

    당신은 SQL에서 이메일 작성 (하지 그것을 할 수있는 가장 좋은 장소를하지만, 일부 시스템에서 그 그들이 그것을 할 곳이다)과 목록에있는 다른 사람이 볼 수있는 이메일의 전체 관객을하지 않거나 각을 개인화하려면 수취인에 대한 정보를 전자 우편, 커서가 이동하는 방법입니다.

    삭제 전체 세트 기반 삽입 / 갱신 / 너무 오래 걸릴과 테이블을 잠급니다 경우 커서 또는 루프 기록의 과정을 일괄로도 사용할 수 있습니다. 이 커서와 집합 기반 솔루션 간의 하이브리드의 일종이다 종종 생산 시스템에 큰 변화를위한 최고의 하나입니다.

  2. ==============================

    2.당신이 무엇을 것 모두를위한 더 나은 제품을 만들 것 하나 개의 기능을 추가 할 수 있다면 나는 SQL 서버 팀 한 시간에 사람을 물어?

    당신이 무엇을 것 모두를위한 더 나은 제품을 만들 것 하나 개의 기능을 추가 할 수 있다면 나는 SQL 서버 팀 한 시간에 사람을 물어?

    그의 응답은 추가 '인가? 허, 난 도망 하나를 수행합니다. 당신은 커서를 제거하면 당신은 SET 기반의 방식으로 사물에 대한 생각을 시작하는 전 세계 프로그래머를 강제하고 가장 큰 세계가 넓은 당신이 이제까지 볼 DB의 성능이 향상 될 것입니다. '

    내가 패턴을 참조하는 경향이 있지만 내 일부를 들어, 한 번에 동작 하나의 요소를 할 수 있어야하고 이전 패션 WHILE 루프 개념을 그리워하기 때문에 커서를 사용 절차 코더가 많이있을 것 같습니다. 커서 오버 헤드없이 같은 기본 개념. 뭔가 SET로 여전히 근처 빨리 / 효과적이지를 기반으로하지만, 누군가의 주장은 시간의 90 % 내가 그들을 잠시 루프와 함께 할 얻을 수있는 '나는 기반이 세트를 수행하지 못할, 나는 커서를 사용에있다'.

  3. ==============================

    3.여기에 커서 그들이있게되었습니다 방법에 대한 몇 가지 답변을 사용하지 않는 추론 제공하는 대신 의견을 고집 동료에 의한 기사입니다 : 당신의 커서를 잃는 15 가지의 방법을이 있어야합니다.

    여기에 커서 그들이있게되었습니다 방법에 대한 몇 가지 답변을 사용하지 않는 추론 제공하는 대신 의견을 고집 동료에 의한 기사입니다 : 당신의 커서를 잃는 15 가지의 방법을이 있어야합니다.

  4. ==============================

    4.MCTS 특히 지금, SQL 서버 나는 커서가 T-SQL에서 요구되는 것을 외부 CLR 코드 어디를 사용하는 것이 좋습니다 공부하는 것이 2008 년이 SQL Server 2008을 지원하는 사용자 정의 집계 함수를 수동 수험.

    MCTS 특히 지금, SQL 서버 나는 커서가 T-SQL에서 요구되는 것을 외부 CLR 코드 어디를 사용하는 것이 좋습니다 공부하는 것이 2008 년이 SQL Server 2008을 지원하는 사용자 정의 집계 함수를 수동 수험.

    오년 전, 광범위한보고 기능을 위해 그들과 함께 일했다,하지만 난 지금에 대한 좋은 유스 케이스와 함께 올 수 있다고 생각하지 않습니다. CLR의 단위 및 기능이 내장에서 집계 함수와 유사하게 수행합니다.

  5. ==============================

    5.내가 그들을 사용할 수 있습니다 만 시간이 커서 내부에서 수행 된 무엇이든 절대적으로 한 번에 하나 개의 항목을 수행해야합니다 커서 내부에서 수행 된 무엇이든 곳에 너무 오래 걸립니다 그 무의미에 커서 페이드의 오버 헤드.

    내가 그들을 사용할 수 있습니다 만 시간이 커서 내부에서 수행 된 무엇이든 절대적으로 한 번에 하나 개의 항목을 수행해야합니다 커서 내부에서 수행 된 무엇이든 곳에 너무 오래 걸립니다 그 무의미에 커서 페이드의 오버 헤드.

    예 : 데이터베이스 백업, 무결성 검사, 인덱스 다시 작성합니다. 단, 관리 작업을합니다.

  6. ==============================

    6.OMG, 어떻게 그룹으로 잊지 않았다? 난 당신이 아래 참조 커서 기반 쿼리를 가져다가 그 후 하나를 교체했다. PHP에서 sqlsrv_next_result ()를 사용하여 아무 문제가 없다, 그래서 지금은 하나의 결과 집합을 얻을.

    OMG, 어떻게 그룹으로 잊지 않았다? 난 당신이 아래 참조 커서 기반 쿼리를 가져다가 그 후 하나를 교체했다. PHP에서 sqlsrv_next_result ()를 사용하여 아무 문제가 없다, 그래서 지금은 하나의 결과 집합을 얻을.

    DECLARE @thisday datetime;
    
    DECLARE daycursor CURSOR FOR
    SELECT DISTINCT DATEADD(day, 0, DATEDIFF(day, 0, TimeCollected)) as thisday
    FROM computerusedata
    
    OPEN daycursor;
    FETCH NEXT FROM daycursor
    INTO @thisday;
    WHILE @@FETCH_STATUS = 0
        BEGIN
        select distinct left(ComputerName,5) as CompGroup,DATEADD(day, 0, DATEDIFF(day, 0, TimeCollected)) as day
        FROM computerusedata
        where DATEADD(day, 0, DATEDIFF(day, 0, TimeCollected)) = @thisday
        order by CompGroup;
        FETCH NEXT FROM daycursor;
        END;
    CLOSE daycursor;
    DEALLOCATE daycursor;";
    
    
    select DATEADD(day, 0, DATEDIFF(day, 0, TimeCollected)) as day,left(ComputerName,5) as CompGroup
    from ComputerUseData
    group by DATEADD(day, 0, DATEDIFF(day, 0, TimeCollected)),left(ComputerName,5)
    order by day,CompGroup
    
  7. ==============================

    7.나는 일반적으로 커서를 사용하지 않지만 내가 할 때, 내가 로컬로 실행 해요있는 "일회성"쿼리 ​​나 매일 작업해야합니다. 당신은 생산 코드는 웹 요청에 대한 응답처럼 자주 호출 될 커서를 호출하도록 자제하고 싶다.

    나는 일반적으로 커서를 사용하지 않지만 내가 할 때, 내가 로컬로 실행 해요있는 "일회성"쿼리 ​​나 매일 작업해야합니다. 당신은 생산 코드는 웹 요청에 대한 응답처럼 자주 호출 될 커서를 호출하도록 자제하고 싶다.

  8. ==============================

    8.1) 당신이 응용 프로그램 계층에서 반복 호출하여 같은 작업을 수행 할 수 이해가되지 않습니다) 당신이 설정 작업을 함께 할, 또는이 할 수없는 일을 할 필요가있을 때 커서 유용합니다. 또는 때때로 당신은 데이터베이스 계층에 남아 있어야하는 프로 시저를 가지고, 당신은 단순히 어떤 결과 집합을 반복 응용 프로그램 계층 중류 밖으로 다시 분리 할 수 ​​없습니다.

    1) 당신이 응용 프로그램 계층에서 반복 호출하여 같은 작업을 수행 할 수 이해가되지 않습니다) 당신이 설정 작업을 함께 할, 또는이 할 수없는 일을 할 필요가있을 때 커서 유용합니다. 또는 때때로 당신은 데이터베이스 계층에 남아 있어야하는 프로 시저를 가지고, 당신은 단순히 어떤 결과 집합을 반복 응용 프로그램 계층 중류 밖으로 다시 분리 할 수 ​​없습니다.

    그래도 만들 것 하나 추천, 당신은 정상 커서를 둘러싸고 커서 할당 / 해제 문제를 방지하기 때문에 사람들이, 일반 커서가 아닌 커서 변수를 사용한다는 것입니다. 당신이 그들을 할당을 해제하지 않을 경우 정상적인 커서 함께, 그들은 메모리 누수의 원인이 될 수있는 지속. 안 변수 기반 커서 (즉 DECLARE의 @cursor의 커서)와.

    결론은 만약에 당신이 가능하게, 할 수있는 그들을 피하기 당신이 할 수없는 경우, 최소한의 현명을 사용합니다.

  9. ==============================

    9.개별적 테이블 인덱스를 다시 작성 또는 재구성을 위해 커서를 사용 집합 기반 작업으로 ... ALTER INDEX를 실행하는 방법이 없다면.

    개별적 테이블 인덱스를 다시 작성 또는 재구성을 위해 커서를 사용 집합 기반 작업으로 ... ALTER INDEX를 실행하는 방법이 없다면.

  10. from https://stackoverflow.com/questions/1479680/ms-sql-server-when-is-a-cursor-good by cc-by-sa and MIT license