2012-05-19 4 views
1

내가 그러나 내가 쉽게 두 가지를 허용 최적의 솔루션 알아 내려고 노력하고있어 개체의 수백만을 저장하는 윈도우 Azure 테이블 스토리지를 사용하고 있습니다 :윈도우 Azure 페이징 대형 데이터 집합 솔루션

1)에 대한 검색을 엔티티는 해당 엔티티를 검색하고 해당 엔티티의 양쪽 엔티티 중 적어도 (pageSize) 엔티티의 수를 지정합니다.

2) 해당 엔티티의 양 쪽 엔티티가 (pageSize) 이전 링크가 표시되면 시작 또는 끝에 도달 할 때까지 계속됩니다.

3) 순서가 나는 각 컨테이너는 시스템에서 고유로에 PartitionKey는 사용자가 제공 한 제목이 될 것이라고 결정했습니다

시간의 역순이다. 새로운 날짜 (-

패드 (새 날짜 (100000000 * 86400000) .getTime() : 대신 C#을의 자바 스크립트로 변환

http://blog.smarx.com/posts/using-numbers-as-keys-in-windows-azure

은 다음과 같습니다 RowKey 스티브 마르크스의 lexiographical 알고리즘) .getTime(), 19) + "_"+ uuid()

uuid()는 guid를 반환하는 javascript 함수이며 pad는 길이가 19 자까지 0을 추가합니다.

PK         RK 
TEST 0008638662595845431_ecf134e4-b10d-47e8-91f2-4de9c4d64388 
TEST 0008638662595845432_ae7bb505-8594-43bc-80b7-6bd34bb9541b 
TEST 0008638662595845433_d527d215-03a5-4e46-8a54-10027b8e23f8 
TEST 0008638662595845434_a2ebc3f4-67fe-43e2-becd-eaa41a4132e2 

이 패턴은 위의 소수점 숫자 3을 만족 목록의 맨 위에 삽입마다 새로운 개체 수 있습니다 : 그래서 시스템의 레코드는 다음과 같이 보인다.

시스템에서 새 레코드를 추가하는 좋은 방법은 RowKey의 전반부, 즉 0008638662595845431_ 부분을 살펴보고 더 크거나 작게 비교하는 메커니즘을 만들 것이라고 생각했습니다. 이미 발견 된 항목. 즉 내가 지금처럼 쿼리를 할 것 즉시 0008638662595845431 전에 행 얻을 :

var tableService = azure.createTableService(); 
var minPossibleDateTimeNumber = pad(new Date(-100000000*86400000).getTime() - new Date().getTime(), 19); 

tableService.getTable('testTable', function (error) { 
    if (error === null) { 
     var query = azure.TableQuery 
      .select() 
      .from('testTable') 
      .where('PartitionKey eq ?', 'TEST') 
      .and('RowKey gt ?', minPossibleDateTimeNumber + '_') 
      .and('RowKey lt ?', '0008638662595845431_') 
      .and('Deleted eq ?', 'false'); 

을 반환 결과가 1000보다 큰과 푸른 나에게 연속 토큰을 제공하는 경우를 다음 나는 마지막 항목을 기억하고 생각 RowKey 즉 숫자 부분 0008638662595845431입니다. 이제 다음 쿼리는 시작 값 등으로 기억 된 값을 갖게됩니다.

Windows Azure Node.Js SDK를 사용하고 있으며 언어는 javascript입니다.

누구나이 접근법에 잡았다 고 볼 수 있습니까?

답변

1

이것이 효과적이고 효율적으로 작동하는 방법, 특히 이전 페이지의 행을 얻는 방법을 알 수 없습니다.

효율적인 "키"의 접두사는 시간 소인을 기준으로하는 것이 아니라 연속적으로 증가 또는 감소하는 값이어야합니다. 시간 소인 생성 값은 구멍뿐만 아니라 중복을 가지므로 매핑 페이지 크기를 행 계수에 비효율적으로 그리고 최악의 경우 결정하기가 어렵습니다.

또한이 잠재적 인 알고리즘은 단일 파티션 키에 종속되어 테이블 확장 성을 파괴합니다.

여기서 도전 과제는 순차적으로 증가하는 키를 생성하는 방법입니다.한 가지 해결책은 SQL 데이터베이스를 사용하고 단일 행에서 원자 업데이트를 수행하여 순차적으로 증가 또는 감소 값이 생성되도록하는 것입니다. UPDATE ... SET X = X + 1 및 X를 반환합니다. 아마도 저장 프로 시저를 사용합니다.

따라서 키는 연속적으로 생성 된 숫자가 0으로 채워질 수 있습니다. 숫자의 첫 번째 N 자릿수가 파티션 키이고 나머지 M 자릿수가 행 키라고 말하는 것과 같이 나눕니다.

For example 
PKey RKey 
00001 10321 
00001 10322 
…. 
00954 98912 

이제 행이 순차적이므로 페이지 크기에 대한 정확한 키 범위로 쿼리를 작성할 수 있습니다.

경고. 직렬 키를 생성하고 테이블 스토리지에 기록하는 사이에 발생하는 작은 위험이 있습니다. 어떤 경우에는 테이블에 구멍이있을 수 있습니다. 그러나 페이징 알고리즘은 페이지 크기를 필요한 것보다 약간 크게 지정하거나 조정 된 범위로 다시 시도하여 이러한 인스턴스를 쉽게 감지하고 해결할 수 있어야합니다.

+0

감사합니다. lucifure, 올바른 순차 키가 트릭을 수행합니다. 순차적 키를 관리하기 위해 DB를 지불해야하는 것보다리스 BLOB 메커니즘을 찾고 있습니다 ... 건배 –