2009-07-21 3 views
4

나는이 레코드에 대한 흉가 테이블을 가지고 있습니다. erlang - 튜플 내용을 qlc 및 mnesia와 어떻게 일치시킬 수 있습니까?

-record(peer, { 
    peer_key, %% key is the tuple {FileId, PeerId} 
    last_seen, 
    last_event, 
    uploaded = 0, 
    downloaded = 0, 
    left = 0, 
    ip_port, 
    key 
}). 

Peer_key

지금은 특정 FileID에있는 모든 동료에서 ip_port 필드를 추출해야, 튜플 {FileID에, 클라이언트 ID}입니다.

나는 실행 가능한 해결책을했다, 그러나 이것은 좋은 방법입니다 있는지 확실하지 않습니다 :

qlc:q([IpPort || #peer{peer_key={FileId,_}, ip_port=IpPort} <- mnesia:table(peer), FileId=:=RequiredFileId]) 

감사합니다.

답변

3

{FileId, PeerId}와 같은 튜플 기본 키를 사용하여 ordered_set 테이블 유형을 사용한 다음 {RequiredFileId, _}와 같은 튜플의 접두사를 부분적으로 바인딩하는 것은 해당 접두어가있는 키 범위 만 전체 테이블 스캔이 아니라 검사됩니다. qlc : info/1을 사용하여 쿼리 계획을 검사하고 발생하는 선택 사항이 키 접두사를 바인딩하는지 확인할 수 있습니다.

0

쿼리 시간은 모든 행을 스캔해야하므로 테이블 크기에 따라 선형 적으로 증가합니다. 실제 테이블 데이터를 벤치 마크하여 실제로 실행 가능한지 확인하십시오.

속도를 높여야하는 경우 파일 ID가있는 모든 피어를 빠르게 찾을 수 있어야합니다. 이것은 속성으로 [fileid, peerid]를 가진 bag-type의 테이블을 사용하여 수행 할 수 있습니다. 파일 ID가 주어지면 모든 동료 ID를 얻게됩니다. 이를 사용하여 조회 할 동료 테이블 키를 구성 할 수 있습니다.

물론 피어 테이블을 변경하는 모든 트랜잭션 내에서 해당 백 유형 테이블을 유지 관리해야합니다.

또 다른 옵션은 fileid를 반복하고 해당 열에 음각 지표를 추가하는 것입니다. 나는 단지 기억 상실증의 2 차 지표에 그다지 중요하지 않습니다.

관련 문제