发新话题
打印

Cache的另一大独特技术-位图索引技术

Cache的另一大独特技术-位图索引技术

http://www.intersystems.cn/cache/test/mapping.html

欢迎下载,安装,然后测试。自己体验一下数据迁移到cache数据库后是否可以变快。

天行健,君子以自强不息;地势坤,君子以厚德载物yaocong@intersystems.cn
VENI, VIDI, VICI

TOP

Cache的另一大独特技术-位图索引技术

效果不错.

这段代码中,实现了计数统计功能,如果用SQL count(*) 也能有这样的速度吗?希望介绍更多关于bitmap方面的内容。

ClassMethod CountNum(Indexname As %String, Columname As %String) As %Integer
{

 if Indexname="IndexAge"
 {
  s tempString="^Signup.PersonnelI('"_Indexname_"',"_Columname_","
 } else
 {
  s tempString="^Signup.PersonnelI('"_Indexname_"',' "_Columname_"',"
 }
 s Com1="s %ifexist=$data("_tempString_"1))"
 s Com1=$TRANSLATE(Com1,"'","""")
 Xecute Com1
 if %ifexist=0
 {
  quit 0
 }

 s Num=0
 s i=1
 d
 {
  s Com1="s %tempnum=$bitcount("_tempString_i_"),1)"
  s Com1=$TRANSLATE(Com1,"'","""")
  Xecute Com1
  s Num= Num+%tempnum
  s i=i+1
  s Com1="s %ifexist=$data("_tempString_i_"))"
  s Com1=$TRANSLATE(Com1,"'","""")
  Xecute Com1
 } while %ifexist'=0
 quit Num
}

TOP

Cache的另一大独特技术-位图索引技术

其实,^Signup.PersonnelI("$Personnel",1)里面存的就是所有记录位串,如果id为6号的记录不存在,则第6位为0,否则为1。所以,$bitcount(^Signup.PersonnelI("$Personnel",1))就是Count(*),速度当然一样快。

另外,这个例子只是演示使用Bitmap index的内部机制——对位串的操作(使用Global访问),其实,你只要使用SQL语句,如Select count(*) from ...where  Occupation='教师' 就会使用Bitmap index,不需要你自己去操作Global!可以通过SQL语句的执行计划确认使用了Bitmap index

TOP

Cache的另一大独特技术-位图索引技术

谢谢.

TOP

发新话题