index()

阅读(2779) 标签: index,

本章介绍index()函数的多种用法。

T.index()

描述:

为序表的键建立索引表

语法:

T.index(n)

备注:

为序表T的键建立长为n的索引表,n0或序表重置键时将清除索引表;n省略则自动选长度。如果需要多次根据键来查找数据,在建立了索引表之后可以提高效率。

建立索引时假定记录的主键唯一,否则出错。仅按基本键做HASH表,不同时间键的记录排进同一HASH位置。

参数:

T

有键的序表。

n

索引长度。

选项:

@s

T的基本键是排号时则建立成多层树状索引,忽略n

@m

并行建立。

@n

为序表建立序号索引;序号索引用于外键序号化,要求事实表的外键值对应维表记录的序号,使用时序号键可省略;使用该选项时将忽略参数n 该选项不适用于序表中有时间键的情况。

返回值:

序表

示例:

 

A

 

1

=demo.query("select EID,NAME,SALARY from EMPLOYEE where EID<4")

 

2

=A1.keys(EID)

设置A1的键为EID

3

=A1.index(10)

为序表键建立长度为10的索引表。

4

=A1.index@m(100)

并行建立索引表。

建立多树状索引:

 

A

 

1

=3.new(k(~:2):id,~*~:num)

创建序表,其中id为排号类型。

2

=A1.keys(id)

设置A1的键为id

 

3

=A2.index@s()

A1的基本键为排号,使用@s选项,建立多层树状索引。

建立序号索引:

 

A

 

1

=connect("demo").query("SELECT * FROM CITIES")

返回序表:

2

=connect("demo").query("SELECT * FROM STATECAPITAL").keys(STATEID)

返回序表,并设置序表的键为EID

3

=A2.index@n()

A2表建立序号索引。

4

=A1.switch(STATEID,A3)

CITIES表作为事实表,STATECAPITAL作为维表,将CITIES表中的STATEID键值切换为STATECAPITAL的指引记录,计算过程中会使用外键STATEID的索引表,此时表达式中可以省略序号键STATEID,等同于A1.switch(STATEID,A3:#)

 

相关概念:

r.key()

T.index(n)

描述:

为内表的键建立索引表

语法:

T.index(n)

备注:

为内表T的键创建索引长度为n的索引表,n0或内表重置键时将清除索引表;n省略则自动选长度。如果需要多次根据键来查找数据,在建立了索引表之后可以提高效率。

建立索引时假定记录的主键唯一,否则出错。仅按基本键做HASH表,不同时间键的记录排进同一HASH位置

参数:

T

主键唯一的内表。

n

索引长度。

选项:

@m

并行建立。

@n

可用序号键建立索引。

@s

T的基本键是排号类型时建立成多层树状索引,忽略参数n

返回值:

内表

示例:

为内表的键建立索引:

 

A

 

1

=file("ei.ctx")

 

2

=A1.create@y(#EID,NAME,DEPT)

创建组表基表,EID为键。

3

=demo.cursor("select EID,NAME,DEPT from employee")

 

4

=A2.append@i(A3)

A3游标中的数据追加到组表中。

5

=A4.memory()

用组表的实表生成内表,内表继承实表的键。

6

=A5.index(10)

为内表的键建立长度为10的索引。

为内表建立多层树状索引:

 

A

 

1

=3.new(k(~:2):id,~*~:num)

创建序表。

2

=A1.keys(id)

设置序表的键为id

3

=A2.memory()

将序表转化为内表,继承序表的键:

4

=A3.index@s()

内表的键为排号类型,使用@s选项,为内表创建多层树状索引。

为内表建立序号索引

 

A

 

1

=to(100).new(~*2:c1,rand():c2)

创建序表:

2

=A1.memory()

用序表生成内表。

3

=A2.index@n()

使用@n选项,为内表的序号键建立索引,此时内表中只有序号键,没有基本键。

4

=A3.find(6)

查询内表中键值为6的记录,即序号键的键值为6的记录,返回结果如下:

 

 

T.index(f:h,w;C,…;F,…)

描述:

为实表创建索引文件

语法:

T.index(f:h,w;C,…;F,…)

备注:

将实表T中满足条件w的记录按列 C,…作为键创建索引文件对象f 索引不会跟随组表更新(包括reset)。

FT的字段名,有F时可以提升查询速度,使用索引取数的时候,只能取出索引字段C和字段FF省略可取出所有字段。

创建索引文件时必须存在列C和索引文件对象f

h时且无@w选项时,创建长度为hhash索引文件;有@w选项时创建全文索引文件;参数h@w选项缺省则创建排序索引文件;创建hash索引与全文索引时,要求参数F省略。

T是附表时,参数C不允许是从主表继承的字段。

参数:

T

实表。

f

索引文件对象。

w

筛选条件,可省略,缺省读取全集。

C

建立索引的字段。

h

hash索引长度,可省略。

F

实表的字段名,可省略。

选项:

@2

只有参数f时可使用,用于加载索引文件至内存,可以提高查询性能。

@3

只有参数f时可使用,用于加载索引文件至内存,相对于@2性能更高但占用内存也更多。

@0

只有参数f时,释放索引文件占用的内存。

@w

按列C建立全文索引文件,使用@w时只能有一个C,并且CString类型。

只支持like("*X*")式检索,X可以是字母/数字/常见字符组成的串,也可以是汉字,X是字母/数字/常见字符组成的串时长度必须大于2

索引串为字母时大小写不敏感。

使用@w时,h解释为每个索引串匹配的最大记录数,h缺省则不限制。

返回值:

实表

示例:

创建排序索引文件:

 

A

 

1

=demo.query("select EID,NAME,BIRTHDAY,DEPT,GENDER,HIREDATE,SALARY from employee ")

返回序表。

2

=file("empi.ctx")

 

3

=A2.create@y(#EID,NAME,BIRTHDAY,DEPT,GENDER,HIREDATE,SALARY)

创建组表。

4

=A3.append@i(A1)

A1序表中的数据追加到组表中。

5

=file("index_dzdpx")

索引文件对象。

6

=A3.index(A5,DEPT=="HR";EID;DEPT)

给组表A3 中满足条件DEPT=="HR"EIDDEPT字段数据创建排序索引文件index_dzdpx,索引字段为EID

7

=file("index_px")

索引文件对象。

8

=A3.index(A7;EID,NAME)

给组表A3创建索引文件index_px,索引字段为EIDNAME,参数F省略,可读取所有字段。

9

=A3.icursor(EID,NAME,DEPT,SALARY;EID<20;A7,A5)

通过索引文件查询组表中EID<20EIDNAMEDEPTSALARY字段的数据:

创建hash索引文件:

 

A

 

1

=file("empi.ctx").open()

打开组表文件。

2

=file("index_hs")

索引文件对象。

3

=A1.index(A2:10;DEPT,GENDER)

为组表empi.ctx创建长度为10hash索引文件,索引字段为DEPT,GENDER

4

=A1.icursor(NAME,DEPT,GENDER,SALARY;[["HR","M"]].contain(DEPT,GENDER);A2)

通过索引文件index_hs查询组表中DEPTHRGENDERMNAMEDEPTGENDERSALARY字段的数据,返回游标中的数据内容如下:

创建全文索引文件:

 

A

 

1

=file("empi.ctx").open()

打开组表文件。

2

=file("index_qw")

索引文件对象。

3

=A1.index@w(A2;NAME)

使用@w选项,为组表empi.ctx创建全文索引文件,索引字段为NAME

4

=A1.icursor(EID,NAME,BIRTHDAY;like(NAME,"*ann*");A2)

通过索引文件index_qw查询组表中NAME值中含有字串“ann”的记录,将记录中的EIDNAMEBIRTHDAY字段的数据返回到游标中,数据内容如下:

5

=file("index_qw1")

 

6

=A1.index@w(A5:5;NAME)

使用@w建立的全文索引文件,索引串大小写不敏感;参数h5,表示每个索引串匹配的最大记录数。

7

=A1.icursor(EID,NAME,BIRTHDAY;like(NAME,"*ANN*");A5)

返回游标的数据内容如下:

主动加载组表的索引文件:

 

A

 

1

=file("empi.ctx").open()

打开组表文件。

2

=A1.index@2(file("index_qw"))

加载组表的索引文件到内存。

3

=A1.icursor(EID,NAME,BIRTHDAY;like(NAME,"A*");file("index_qw"))

使用已经加载到内存中的索引文件进行组表数据查询。

4

=A1.index@0(file("index_qw"))

释放索引文件占用的内存。

5

>A1.close()

关闭组表。

 

T.index(I:h,w;C,…)

描述:

为内表建立非主键索引。

语法:

T.index(I:h,w;C,…)

备注:

将内表T中满足条件w的记录按列 C,…作为键创建索引I,其中w可以省略,有h时创建长度为hhash索引,h0时用缺省自动计算出HASH表长度。

为内表T建立的非主键索引,在生成游标时可用,可以建立多个。

参数:

T

内表。

I

索引名称。

w

筛选条件,缺省读取全集。

C

建立索引的字段。

h

索引长度。

返回值:

内表

示例:

 

A

 

1

=demo.cursor("select * from SCORES ")

 

2

=file("SCORES_ClassTwo.ctx")

创建组表文件。

3

=A2.create@y(#CLASS,#STUDENTID,SUBJECT,SCORE)

创建组表的基表,其中CLASS,#STUDENTID为组表的键。

4

=A3.append@i(A1)

A1游标中的数据追加到基表中。

5

=A4.memory()

生成内表。

6

=A5.index(index1:10,CLASS =="Class one";SCORE)

对内表建立非主键索引。