은행 계좌에서 그래프 데이터베이스로 간단한 거래를 상상해보십시오.Azure CosmosDB 그래프 통과 성능 문제
- + $ 1000현금 입력 :이 같은 행사로.
- - $ 10VISA에서 책 구입하기.
- + $ 100오래된 자전거 판매용 현금.
- - $ 50 012식료품 구매시 현금. 그래프 구조에
우리는 거래로 노드를 정의 할 수있는 특성을 가진 :
- ID - 트랜잭션 ID
- 시간 - 트랜잭션이 일어 났을 때의 타임 스탬프 .
- 델타 - 트랜잭션에 대한 이유 - 트랜잭션
- 설명에 (+/-) 사용의 금액.
가장자리는 이전의 트랜잭션을 가리킬 것입니다. 우리는 다른 계정 (계정 간 전송), 소유자 등을 가리키는 다른 모서리를 가질 수 있지만 단순성을 위해이 구조를 갖습니다. 이제
g.addV('transactions').property('id','1').property('time',0).property('delta',1000).property('description','cash input')
g.addV('transactions').property('id','2').property('time',1).property('delta,-10).property('description','for buying a book by VISA')
g.V('2').addE('previous').to(g.V('1'))
g.addV('transactions').property('id','3').property('time',2).property('delta',100).property('description','cash for selling an old bike.')
g.V('3').addE('previous').to(g.V('2'))
g.addV('transactions').property('id','4').property('time',3).property('delta',-50).property('description','cash for buying groceries')
g.V('4').addE('previous').to(g.V('3'))
는 다음과 같이, 특정 날짜까지, 또는 처음으로, 우리가 최신의 거래에서
이전 가장자리를 통과 할이 계정의 현재 목록을 얻을 수 있습니다 :
g.V('4').emit().repeat(out('previous')).until(has('time',0)).properties('delta').value().sum()
==>4 좋은 빠른 전부입니다 1040
거래. 그러나 트랜잭션의 경우 약 8 분이 걸리며 더 복잡한 작업이나 더 많은 데이터의 경우 더 오래 걸립니다.
제 테스트의 경우 그래프 API와 처리량 2000 RU/s로 Azure Cosmos-DB를 설정했습니다.
저는 그래프 데이터베이스와 쿼리에 대해 상당히 익숙하지 않기 때문에이 작업을 더 빠르고 더 잘 수행 할 수있는 방법과이를 최적화하는 방법에 대해 알고 있습니다. 어쩌면 그래프 데이터베이스조차도이 작업에 적합한 도구가 아닐까요?
여기에서 달성하고자하는 것은 트랜잭션에 대한 합리적인 빠른 쿼리, 여러 계정으로 분기 할 수있는 쿼리 및 더 많은 이벤트입니다.
이 작업을 어떻게 개선 할 수 있습니까?
안녕하세요. 답변 해 주셔서 감사합니다. 실제로 이것은 해결책 일 수 있지만 이러한 솔루션으로는 제대로 작동하지 않는 더 복잡한 쿼리가 있습니다. 결과를 캐싱하는 것은 우리가 고려하고있는 것이지만, 우선 제한을 결정하고 싶습니다. OLTP 쿼리에서 합리적인 수의 홉이 무엇이라고 말하는가? 이 순회 속도를 향상시키기 위해 할 수있는 일이 있습니까? – ifxdev
Cosmos-DB에서 어떻게 처리되는지 모르겠지만 각 홉이 새 백엔드 쿼리를 트리거하므로 빠르게 추가됩니다. 만약 내가 숫자를 버리면, 나는 50 이하로 유지 될 것이라고 말하고 싶다. (매우 낮은 브랜치 팩터는 유스 케이스의 경우이다.) 그러나 그것은 단지 야생의 추측이며, 스스로를 더 잘 시험해야합니다. –