2014-09-16 2 views
1

집합 기반 대체 방법으로 커서를 대체하면 성능이 크게 향상된다는 것을 여러 곳에서 읽었지만 실제로 예제, 자습서, 집합 기반 대안에 대한 설명을 실제로 찾지 못했습니다. 커서가 어떻게 하나로 변환 될 수 있는지에 대한 정보를 제공합니다.TSQL CURSOR 및 SET 기반 대안

아무에게도 그런 링크를 제공 할 수 있습니까?

감사

+0

의 같은 ....하지만 기본적으로 - 대신 ** RBAR ** (row-by-agonizing-row) 처리를 수행 할 때, 예를 들어 하나의 T-SQL 문을 실행하면 행 집합 전체에 대한 'UPDATE'(해당 행을 반복하고 각각을 개별적으로 업데이트하는 대신) –

+0

또한 [SQL의 "집합 기반"및 "절차 적 접근법 이해"(http : //www.codeproject. com/Articles/34142/Understanding-Set-based-and-Procedural-approaches) 또는 [Set-Based SQL 쿼리로 커서 바꾸기 - 2 부] (http://www.sqlservercentral.com/blogs/helpwithsql/2011/07/06/replaced-cursor-with-set_2D00_based-sql-queries-_1320_-part-2 /) –

+0

그리고 [전문 데이터베이스 개발로의 길 : 집합 기반 사고] (https : //www.simple-talk. SQL 쿼리를 피할 수있는 방법 (http://www.codemag.com/Article) (영문) (com/sql/database- administration/the-road-to-professional-database-development-set-/060113) –

답변

1

RDBMS의 관계에 대한 이동 당신은 병이 MSSQL, Oracle 및 다른 세트와 함께 작동하도록 최적화 된 시스템입니다 참조하십시오. 커서는 C#과 같은 명령형 언어와 비슷하게 작동합니다.

작은 예제 들어 조인을 구현하십시오! 커서를 사용하여 중첩 된 루프를 수행하여 조인을 모방 할 수 있습니다. 어리석은 예제지만 아이디어를 얻을 수 있습니다. 조인은 커서보다 빠릅니다.

또한 성능이 가장 중요한 것은 아닙니다. 적은 리소스를 사용하는 것입니다. 그 자원은 다음과 같습니다 : CPU, 메모리, IO, HD, 사용자 인내 (시간). 커서는 모든 리소스를 소비 할 수 있습니다.

때때로 커서는 빨리 감기와 다른 것들을 사용하여 최적화 할 수 있습니다. 결국 커서는 옵션 일 수 있으며 작업을위한 최상의 도구 일 수도 있습니다 (동기를 위해 존재 함).

커서의 문제점은 설정 기반 경험이 부족한 개발자가 과도하게 사용한다는 것입니다. 그 사람들은 C와 같은 프로그래밍 스타일을 끔찍한 결과로 관계형 세계에 적용하려고합니다.

편집 여기 SQL Shack

DECLARE @rowguidVar UNIQUEIDENTIFIER -- prepare unique ID variable to use in the WHERE statement below 

DECLARE test_cursor CURSOR FOR 
SELECT rowguid 
FROM AdventureWorks2012.Sales.SalesOrderDetail 
WHERE ModifiedDate BETWEEN '2008-07-15 00:00:00.000' AND '2008-07-31 00:00:00.000' 

OPEN test_cursor 
FETCH NEXT FROM test_cursor INTO @rowguidVar 
--This is the start of the cursor loop. 
WHILE @@FETCH_STATUS = 0 
BEGIN 
     SELECT * 
      FROM   Sales.SalesOrderDetail 
      WHERE rowguid = @rowguidVar 
    FETCH NEXT FROM test_cursor INTO @rowguidVar 
END 

CLOSE test_cursor 
DEALLOCATE test_cursor 
-- Don't forget these statements which flush the cursor from memory 

에서 빌린 예를 는 우리에게 구체적인 예를 보여

SELECT * 
FROM AdventureWorks2012.Sales.SalesOrderDetail 
WHERE ModifiedDate BETWEEN '2008-07-15 00:00:00.000' AND '2008-07-31 00:00:00.000' 
당신은해야합니다