버퍼링 된 데이터 제한을 늘리는 방법은 무엇입니까?


16

우분투 내에서 1 백만 개의 레코드가 포함 된 MongoDB Db 컬렉션을 만들었으며 그것에 대해 정렬 명령을 실행하려고하면 다음 오류가 발생합니다.

 "$err" : "Runner error: Overflow sort stage buffered data usage of 33555002 bytes exceeds internal limit of 33554432 bytes",
 "code" : 17144

누구든지 데이터에 대해이 명령 및 다른 대규모 명령을 실행할 수 있도록 내부 제한을 늘리는 방법을 설명 할 수 있습니까?


나는 당신이 할 수 있는지 의심합니다. 문제는 아마도 당신의 진술에 있습니다 : EXPLAIN은 INDEX를 사용하고 있음을 보여줍니까? 그렇지 않으면 테이블에 INDEX를 추가해야합니다.
Rinzwind

안녕 Rinzwind. 성능을 비교하려고하므로 noindex, primary index 및 secondary index를 사용하여 일종의 데이터를 실행하려고합니다. 인덱스없이이 스케일을 실행할 수 없다는 것을 제안하고 있습니까?
Jon295087

아 EXPLAIN을 사용하여 성능을 검사하는 경향이 있습니다 (EXPLAIN이 저조한 레코드 수를 제공하지 않으면 성능이 나쁩니다). 이렇게하려면 레코드를 제한해야합니다.
Rinzwind

MongoDB 가이 데이터 세트에서 약 25000 개의 문서를 처리한다는 것을 알았지 만 더 큰 문제가 발생했습니다 ... 데이터베이스의 한계에 불과하다고 생각하십니까? 귀하의 의견에 감사드립니다.
Jon295087

답변:


23

이것은 SERVER-13611 과 같은 버그 (최신 버전인지 확인하십시오) 또는 2.6에서 희소 색인정렬 하려고 시도하기 때문에 발생할 수 있지만 더 일반적으로 단순히 정렬하려고 시도하기 때문입니다. 인덱스가없는 메모리의 많은 레코드.

적중하는 특정 한계는 의도적이며 여기설명 되어 있습니다. 변경할 수 없으므로 결과 집합을 줄이거 나 색인 등을 사용하여 정렬을 수행해야합니다.

업데이트 (2014 년 11 월) : 곧 출시 될 2.8 릴리스 (이 글을 쓰고있는 현재 2.8.0-rc0)에서 다음과 같이이 설정을 조정할 수 있습니다.

db.adminCommand({setParameter: 1, internalQueryExecMaxBlockingSortBytes: <limit in bytes>})

기본값은 32MiB (33554432 바이트)이며주의해서 조정해야합니다. 메모리 내 정렬이 크면 데이터베이스가 정지 될 수 있습니다 (먼저 한계가있는 이유).


"errmsg": "설정할 옵션이 없습니다. help : true를 사용하여 옵션을보십시오."
Mohammad Efazati

1
아마 당신은이 답변이 의도 한 것과는 다른 버전을 사용하고있을 것입니다. 이것은 꽤 오래 전에 쓰여졌습니다
Adam C

2

200K + 레코드를 정렬하고 페이지를 매길 때도 문제가 발생했습니다. 가장 쉬운 해결책은 정렬하는 속성에 대해 색인을 추가하는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.