2011-05-03 4 views
5

나는 Azure가있는 새 초보자입니다! 목적은 RowKey에 저장된 시간 소인에 따라 행을 리턴하는 것입니다. 각 쿼리와 거래 비용이, 나는 성능을Azure 테이블 스토리지 - 쿼리간에 사용할 PartitionKey 및 RowKey 선택

을 거래/쿼리의 수를 최소화하면서 유지하려는 이들은 제안 된 파티션과 행 키 :

  • 파티션 키 : TextCache_ (계정 ID) _ (ParentMessageId)
  • 행 키 : (DateOfMessage) _ (의 MessageID)

전설 :

  • 통해 AccountId는 - 정수
  • ParentMessageId입니다 - 부모 messageId가 그 부모
  • DateOfMessage 경우, 빈 존재하는 경우 - 메시지가 생성 된 날짜 - 형식은 DateTime.Ticks 될 것입니다. ToString ("D19")
  • 의 MessageID - 메시지
난 다시 단일 쿼리에서 행과 어떤 childrows을 좀하고 싶습니다

> 또는 < DateOfMessage_MessageId의 고유 ID

제안 된 PartitionKeys 및 RowKeys를 통해 수행 할 수 있습니까?

즉 ..

var results = ctx.PartitionKey.StartsWith(TextCache_AccountId) 
    && ctx.RowKey > (TimeStamp)_MessageId 

둘째 (사이비 코드), I는 계좌 번호를 가지고, 오직이 하나의 쿼리를 통해 수행 할 수 있습니다, 처음 10 다시 돌아가려면이 경우

즉 .. (사이비 코드) 질문에 대한

var results = ( 
     ( 
     ctx.PartitionKey.StartsWith(TextCache_(AccountId1)) && 
      && ctx.RowKey > (TimeStamp1)_MessageId1) 
    ) 
     || 
     ( 
     ctx.PartitionKey.StartsWith(TextCache_(AccountId2)) && 
      && ctx.RowKey > (TimeStamp2)_MessageId2) 
    ) ... 
     ) 
     .Take(10) 

답변

5

짧은 대답은 '예,하지만 당신이 볼 필요가 몇 가지있다.

하늘빛 테이블 스토리지는 .StartsWith()과 직접적으로 동일하지 않습니다. 스토리지 라이브러리를 LINQ와 함께 사용하는 경우 .CompareTo() (> 및 <이 올바르게 변환되지 않음)을 사용할 수 있습니다. 이는 계정 1에 대한 검색을 실행하고 1000 개의 결과를 반환하도록 쿼리를 요청하면 계정 1에 대해 600 개의 결과 만있는 경우 마지막 400 개의 결과는 계정 10 (다음 계정 번호는 어휘 적으로)에 대한 것입니다. 따라서 결과를 어떻게 다루는 지에 대해 약간 똑똑해야합니다. 당신이 선도 0으로 계정 ID를 패딩 경우

당신이 (물론 여기 의사 코드)을 염두에 두어야 할 다른

ctx.PartionKey > "TextCache_0000000001" 
&& ctx.PartitionKey < "TextCache_0000000002" 
&& ctx.RowKey > "123465798" 

뭔가를 이런 식으로 뭔가를 할 수있는 것은 푸른 테이블에 쿼리에서 결과를 반환한다는 것입니다 PartitionKey 다음에 RowKey 주문. 따라서 ParentMessageId이없는 메시지는 ParentMessageId과 함께 메시지 앞에 표시됩니다. ParentMessageId로이 테이블을 쿼리하지 않으면이 속성으로 이동합니다.

TextCache_이 문자열 상수 인 경우 PartitionKey에 포함되면 아무 것도 추가하지 않습니다. 반환 할 때 실제로 이것이 의미가없는 한.

두 번째 쿼리가 실행되지만, 내가 작성한 쿼리가 생성되지 않을 것이라고 생각합니다. 처음 10 개의 행을 DateOfMessage 순서로 원한다면 작동하지 않습니다 (위의 정렬 순서에 관한 위의 내용 참조). 이 쿼리를 그대로 실행하고 계정 1에 11 개의 메시지가있는 경우 계정 2에 이전 메시지가 있는지 여부에 관계없이 계정 1과 관련된 처음 10 개의 메시지 만 반환합니다.

사용하는 트랜잭션의 수를 최소화하려는 것은 좋은 습관이지만 걱정하지 마십시오. 작업자/웹 역할을 실행하는 비용은 거래 비용을 줄여줍니다. 1,000,000 건의 거래가 발생하면 1 달러가 들며 이는 9 시간 동안 작은 인스턴스 하나를 실행하는 데 드는 비용보다 적습니다.

+0

knightpfhor에게 감사드립니다. 테이블 저장 장치에서 500 초/초의 속도로 스로틀 링을하는 것이 더 중요했습니다. AccountId의 패딩에 대해서는 생각하지 않았습니다. 확실히 필요합니다. 일부 테스트를 수행 할 것입니다 –

+0

전역 제한이 전역이 아닌, 파티션별로 스로틀 제한이 있음을 알아 두는 것이 중요합니다. – knightpfhor

+0

'TextCache_'에 대해서는이를 테이블 식별자로 추가했습니다. 두 테이블을 구별해야합니까? –

관련 문제