Source code
{ Property prop1; Property prop2; Property prop3; Index idx3 On (prop3, prop1, prop2) [ Type = bitmap ]; ClassMethod Fill(total = 5000000)
{
d ..%KillExtent()
f i=1:1:total s ^mp.testD(i)=$lb("","name","prop2",$r(30))
s ^mp.testD=total
d ..%BuildIndices()
} ClassMethod Query()
{
s N=5
&sql(SELECT count(*) into :count FROM mp.test WHERE prop1='name' AND prop2='prop2' AND prop3>='1' AND prop3<='30')
w "count=",count,!!
s sql=##class(%SQL.Statement).%New()
d sql.%Prepare("SELECT %ID,prop3 FROM mp.test WHERE %ID IN ("_
" SELECT * FROM ("_
" SELECT TOP ALL %ID FROM mp.test WHERE prop1='name' AND prop2='prop2' AND prop3>='1' AND prop3<='30' ORDER BY prop3 DESC"_
" ) WHERE %VID BETWEEN ? AND ?"_
") ORDER BY prop3 DESC")
w "first 5 [1:5]",!
s rset=sql.%Execute(1,5)
s time=$zh
d rset.%Display()
w !,$zh-time," secs",!!
w $$$FormatText("last 5 [%1:%2]",count-N+1,count),!
s rset=sql.%Execute(count-N+1,count)
s time=$zh
d rset.%Display()
w !,$zh-time," secs"
}
}
USER>d ##class(mp.test).Fill(5000000)
USER>d ##class(mp.test).Query()
count=3833346
first 5 [1:5]
ID prop3
3 3
4 3
24 3
30 3
97 3
5 Rows(s) Affected
.000328 secs
last 5 [3833342:3833346]
ID prop3
4999798 1
4999817 1
4999836 1
4999866 1
4999947 1
5 Rows(s) Affected
2.884304 secs
PS: for those who put a minus. May I ask why?
- Log in to post comments