혹시, 글로벌에 직접 액세스 하시는 분들 중, Cache SQL에 나오는 비트맵 인덱스를 활용하시는 분 있으면 정보 공유 희망합니다.
우선, 인덱스를 생성하는 것하고 활용하는 것이 필요할 듯 한데, 조금씩 정보 공유해 나가면 뭔가 만들어 볼 수 있지 않을까 생각합니다. 어떤 자료든 미리 감사드립니다.
지방도시의 한 케세디비 매니아
비트맵 인덱스를 생성하는 코드는 %Library.Persistent 클래스에 %BuildIndices() 라는 메소드를 참고하시면 좋을듯 합니다. 아래 문서 설명내용 참조.
• classmethod %BuildIndices(idxlist As as %Status %List = "", autoPurge As %Boolean = 0, lockExtent As %Boolean = 0)
Rebuilds all entries for each index specified in the idxlist argument. If idxlist is empty then all indices that originate in the class are rebuilt. If autoPurge is true then the indices contained in idxlist will be purged before they are built. If lockExtent is true then an extent lock will be acquired before the indices are built. If the lock cannot be acquired then an error is returned. The lock is released after the index build is completed. Returns a %Status value indicating success or failure.
Returns a %Status value indicating success or failure.
아래는 User.Person 클래스의 SexIdx에 대해 생성된 코드입니다:
%BuildIndices(idxlist="",autoPurge=0,lockExtent=0) public { s $ZTrap="CatchError",locked=0,sc=1,sHandle=$c(0,0) for ptr=1:1:$listlength(idxlist) { if '$d(^oddCOM("User.Person","i",$list(idxlist,ptr))) { set sc=$$Error^%apiOBJ(5066,"User.Person::"_$list(idxlist,ptr)) continue } } if ('sc) { quit sc } i lockExtent { s sc=##class(User.Person).%LockExtent(0) i ('sc) { q sc } else { s locked=1 } } i autoPurge { s sc = ##class(User.Person).%PurgeIndices(idxlist) i ('sc) { quit sc }} if (idxlist="")||($listfind(idxlist,"SexIdx")) { set $Extract(sHandle,2)=$c(1) } If (($lf(idxlist,"$Person")) || ((idxlist="") && ('##class(User.Person).%BMEBuilt())))||(($Ascii(sHandle,2))&&'##class(User.Person).%BMEBuilt()) { s $Extract(sHandle,1)=$c(1) } Set id="" BSLoop Set id=$order(^User.PersonD(id)) Goto:id="" BSLoopDun Set bsv0N1=$Get(^User.PersonD(id)) Set pidchunk=id\64000+1,pidoffset=id#64000+1 If $Ascii(sHandle,1) { Set $bit(^User.PersonI("$Person",pidchunk),pidoffset)=1 } If $Ascii(sHandle,2) { Set $bit(^User.PersonI("SexIdx",$zu(28,$listget(bsv0N1,9),7,32768),pidchunk),pidoffset)=1 } Goto BSLoop BSLoopDun If $A(sHandle,1) Set subextent="" For Set subextent=$o(^oddMAP("User.Person","Z",subextent)) Quit:subextent="" Set:'$zobjclassmethod(subextent,"%BMEBuilt",.subbme) sc=$zobjclassmethod(subextent,"%BuildIndices",$listbuild(subbme)) i locked { d ##class(User.Person).%UnlockExtent(0) } QUIT 1