2014-07-19 1 views
0

ad-hoc SQL (예 : "SELECT foo FROM tablename")을 사용하여 MSSQL 데이터베이스를 호출 할 때 해당 호출의 일괄 처리 크기를 지정할 수 있습니다. 이것은 많은 데이터가 반환 될 것으로 기대할 때 매우 유용합니다.페이지 매김 또는 mssql_execute() 호출을 일괄 처리하는 방법은 무엇입니까?

필자의 경우 2 억 개가 넘는 행이있는 테이블이 있는데, 모두 가져오고 있습니다. 예, 이런 큰 돼지 데이터가되는 이유가 있습니다.

DB 사람들은 "이봐, 여기에 임시 SQL을 사용하지 마라.이 멋진 SP를 사용하라. 똑같은 일을한다"고 말했다.

그래서 나는 mssql_execute() 함수 호출로 사용하고 있지만, mssql_query()

로 존재하는 한이 일을 내가뿐만 아니라이 ini_set('memory_limit', '64G')을해야 할 때 배치 크기를 지정할 수있는 방법은 없습니다; 이 일을하기 위해 SP 통화가 30 분 이상 걸리는만큼 물건을 땀을 흘려야합니다. 일단 실행되면 mssql_fetch_row()에 루프를 수행 할 수 있지만 아무런 문제가 없지만 초기 호출은 못 박는 행위입니다!

그리고 끝나면 57G의 메모리 (96G 상자에 있음)를 사용하여 풀고 가비지 수집을 위해 80 % CPU에서 1 시간이 걸립니다. 그래, 그 과정을 죽일 수는있어.하지만 그건 해킹이야.

더 좋은 방법이 있습니다.

ad-hoc SQL에서는 배치 크기가 10,000 행인 mssql_query()을 호출하고 처리 한 다음 다시 돌아갑니다. 그런 다음 에코 (echo)와 같은 작업을 수행 할 수 있습니다. "예, 실제로, 저는 지금 행 $i에 있습니다 ..."그리고 모든 것이 제대로 실행되고 있다는 편집증을 풀어보십시오.

그래서 DB를 사용하기를 원한다면 어떻게해야할까요?

+0

DB 사용자에게 당신이 제안한 것을 물었습니까 ?? – etr

답변

0

테이블에 기본 키가 있다고 가정하면 DB 사용자에게 저장된 프로 시저에 2 개의 매개 변수를 추가하도록 요청하는 것이 좋습니다. 하나는 반환 할 행 수이고 다른 하나는 시작 키 값입니다. 초기 일괄 처리에 대해서는 NULL을 전달하고 이후의 일괄 처리마다 반환되는 마지막 키 값을 전달합니다. 이는 효율적인 전진 전용 페이지 매김을 제공합니다. 예를 들면 다음과 같습니다.

CREATE PROCEDURE dbo.usp_select_tablename 
     @NumRows int 
    , @StartKey int = NULL 
AS 
IF @StartKey IS NULL 
BEGIN 
    SELECT TOP(@NumRows) foo 
    FROM tableName 
    ORDER BY StartKey; 
END 
ELSE 
BEGIN 
    SELECT TOP(@NumRows) foo 
    FROM tableName 
    WHERE Key > @StartKey 
    ORDER BY StartKey; 
END; 
+0

이것은 우리가 한 일입니다. 완벽하게 작동합니다. –

관련 문제