최근에 제 애플리케이션에 가져오는 데이터가 업데이트되지 않는 문제가 발생했습니다. 하지만 저는 제 프로세스가 예상한 대로 정확하게 구축되었다고 확신했습니다.
이 문제에 대한 배경 지식으로 시작하겠습니다. 말씀드렸듯이, 저는 제 애플리케이션에 레코드를 가져왔습니다. 예를 들어, 약 10,000개의 레코드를 가져왔고, 이를 업데이트하고 "처리됨"으로 표시하고 싶었습니다.
그래서 웹 서비스를 사용하여 가져오기를 빌드했고, 제 데이터는 아무 문제 없이 들어왔습니다. 그런 다음 한 번에 1,000개의 레코드로 제한하는 프로세스를 빌드하고 업데이트했습니다. 제한을 사용하여 검색하면 테이블 내 데이터의 하위 집합을 처리할 수 있으므로 메모리에 너무 많은 레코드를 넣지 않고 잠재적으로 애플리케이션 성능에 영향을 미치지 않도록 할 수 있습니다.
또한 오프셋을 사용했습니다. 오프셋을 사용하면 테이블에서 검색을 시작할 위치를 지정할 수 있습니다. 이를 적용하면 제한을 늘려 프로세스를 반복하여 모든 레코드를 처리했는지 확인할 수 있습니다. 아래에 표시된 대로:


그럼, 위 그림에 대한 기본적인 설명은 다음과 같습니다.
- 검색을 "제한"하려는 레코드 수와 동일한 정수를 만듭니다(이 경우 1,000개).
- 오프셋과 같은 정수를 만듭니다. 이 예에서는 0에서 시작해야 하는데, 당연히 첫 번째 레코드입니다.
- 사용자 정의 검색을 사용하여 엔터티 목록을 검색합니다.
- 한도를 $Limit로 정의하세요
- 오프셋을 $Offset으로 정의하세요

- 목록을 반복하고 원하는 프로세스를 수행합니다.
- 검색 작업에서 검색한 엔터티 수를 계산합니다.
- 검색된 엔터티 수가 정의한 제한과 같은지 확인하십시오.
- 네(참)라면 다시 해보세요. 더 많은 것이 있을 수 있습니다.
- 아니요(거짓)이면 목록의 끝에 도달한 것입니다.
꽤 쉽죠? 글쎄요, 안타깝게도 가장 중요한 것, 즉 검색에 정렬을 통합하는 것을 놓쳤어요.
이것이 왜 중요한지 설명해 드리겠습니다. 아래에서 위의 마이크로플로에서 정의한 "작은 사각형"을 검색한 결과를 볼 수 있습니다.

위의 그림이 100개의 작은 사각형이 있는 표라고 가정해 보겠습니다. 저는 오프셋 10으로 0개의 제한을 검색하고 있습니다. 강조된 사각형은 검색되고 처리되는 것입니다. 이 프로세스가 완료되면 오프셋을 이전 검색 번호(10)로 변경한 후 데이터베이스에서 다시 검색합니다.
이제 내 레코드 세트가 검색되었지만 정렬 순서를 정의하지 않았기 때문에 검색이 임의로 특정 순서 없이 목록을 반환합니다. 오프셋이 10이므로 레코드 10부터 시작하지만 불행히도 이미 처리된 레코드일 수 있습니다. 아래 이미지는 두 번째로 검색된 목록을 보여주고 강조 표시된 레코드는 우리가 처리할 레코드입니다.

이제 아래 이미지는 정렬이 적용된 검색을 보여줍니다. 정렬을 적용할 때 가능한 가장 고유한 속성을 사용하고자 합니다. 이렇게 하면 검색된 목록이 항상 동일하고 테이블의 모든 레코드를 확실히 처리할 수 있습니다.

이제 오프셋을 구현하는 것이 현명하지 않은 경우가 있습니다. 이 예를 상상해 보겠습니다. 작은 사각형은 흰색(처리되지 않음)이거나 파란색(처리됨)입니다. 처리되지 않은 모든 레코드를 검색하여 처리하고 싶습니다. 검색 작업에서 [Processed = false()]의 XPath 제약 조건을 적용합니다.

다시 말해서, 아래에 그림으로 표시된 것처럼 모두 처리되지 않은 100개의 레코드가 있는 테이블이 있습니다. 10개의 제한과 0의 오프셋을 사용하여 처음 XNUMX개의 레코드를 가져옵니다. 그런 다음 각 레코드를 처리합니다.

10개 레코드를 처리했고 이제 내 데이터 세트는 아래 이미지와 같습니다. 수정된 오프셋을 적용하지만 XPath 제약 조건을 계속 사용하면 내 프로세스는 결과 데이터 세트의 처음 XNUMX개 레코드를 건너뛰어 부분 업데이트만 발생합니다.

제 경험에 따르면 이 게시물에 제공된 예는 한계 및 오프셋 검색 및 처리의 가장 일반적인 예입니다. 속성 값이나 다른 이유에 따라 데이터가 처리될 수도 있고 그렇지 않을 수도 있는 다른 상황이 있습니다. 항상 가능한 한 정적인 목록이 되도록 정렬을 사용해야 합니다.

요약하자면, 대용량 데이터 세트를 검색할 때는 다음을 수행해야 합니다.
- 제한 및 오프셋 사용
- 캐시 메모리와 시스템 성능에 미치는 영향을 최소화하려면 제한을 3,000 이하로 설정해야 합니다.
- 검색 제약 조건으로 인해 레코드 세트가 변경되지 않는 경우 오프셋을 사용해야 합니다. 또한 변수여야 하며 처리를 시작하려는 목록의 위치로 설정해야 합니다.
- 반복적인 프로세스에서 검색을 정적으로 만들기 위해 가장 고유한 속성에 대한 정렬을 사용하세요.
당신이 만든 모든 프로세스와 마찬가지로 Mendix, 항상 그 안에서 내리는 선택과 행동이 데이터에 어떤 영향을 미치는지 신중하게 고려하세요. 이전 게시물이 이 주제에 대한 빛을 비추고 여러분 모두에게 행복한 모델링을 기원합니다!