oracle rowed,oracle bitmap索引内部揭密,欢迎补充

位图(bitmap)索引是另外一种索引类型,它的组织形式与B树索引相同,也是一棵平衡树。与B树索引的区别在于叶子节点里存放索引条目的方式不同。从前面我们知道,B树索引的叶子节点里,对于表里的每个数据行,如果被索引列的值不为空的,则会为该记录行在叶子节点里维护一个对应的索引条目。

而位图索引则不是这样,其叶子节点里存放的索引条目如下图所示。

假设某个表T里所有的记录在列C1上只具有三个值:01、02和03。在表T的C1列上创建位图索引以后,则叶子节点的内容如图9-14所示。可以看到,位图索引只有三个索引条目,也就是每个C1列的值对应一个索引条目。位图索引条目上还包含表里第一条记录所对应的ROWID以及最后一条记录所对应的ROWID。索引条目的最后一部分则是由多个bit位所组成的bitmap,每个bit位就对应一条记录。

dd06a1abc3fb84da465ff4eff32374f6.gif

图1.JPG (28.68 KB, 下载次数: 12)

2008-6-10 16:37 上传

位图索引的结构

当发出where c1='01'这样的SQL语句时,oracle会去搜索01所在的索引条目,然后扫描该索引条目中的bitmap里所有的bit位。第一个bit位为1,则说明第一条记录上的C1值为01,于是返回第一条记录所在的ROWID(根据该索引条目里记录的start ROWID加上行号得到该记录所在的ROWID)。第二个bit位为0,则说明第二条记录上的C1值不为01,依此类推。另外,如果索引列为空,也会在位图索引里记录,也就是将对应的bit位设置为0即可。

如果索引列上不同值的个数比较少的时候,比如对于性别列(男或女)等,则使用位图索引会比较好,因为它对空间的占用非常少(因为都是用bit位来表示表里的数据行),从而在扫描索引的时候,扫描的索引块的个数也比较少。可以试想一下,如果在列的不同值非常多的列上,比如主键列上,创建位图索引,则产生的索引条目就等于表里记录的条数,同时每个索引条目里的bitmap里,只有一个1,其它都是0。这样还不如B树索引的效率高。

如果被索引的列经常被更新的话,则不适合使用位图索引。因为当更新位图所在的列时,由于要在不同的索引条目之间修改bit位,比如将第一条记录从01变为02,则必须将01所在的索引条目的第一个bit位改为0,再将02所在的索引条目的第一个bit位改为1。因此,在更新索引条目的过程中,会锁定位图索引里多个索引条目。也就是同时只能有一个用户能够更新表T,从而降低了并发性。

位图索引比较适合用在数据仓库系统里,不适合用在OLTP系统里。

[php]

SQL> create table t_bitmap_test as

2  select rownum as id,trunc(dbms_random.value(1,4)) as bitcol

3  from dba_objects where rownum<=20;

SQL> select * from t_bitmap_test;

ID     BITCOL

---------- ----------

1          3

2          2

3          1

4          3

5          3

6          1

7          1

8          2

9          3

10          2

11          3

12          1

13          1

14          3

15          2

16          2

17          3

18          2

19          1

20          3

SQL> connect hr/hr

已连接。

SQL> alter session set events '10608 trace name context forever, level 10';

会话已更改。

SQL> create bitmap index idx_t_bitmap_test on t_bitmap_test(bitcol);

索引已创建。

SQL> alter session set events '10608 trace name context off';

会话已更改。

SQL> select object_id from user_objects where object_name='IDX_T_BITMAP_TEST';

OBJECT_ID

----------

24499

SQL> alter session set events 'immediate trace name TREEDUMP level 24499';

会话已更改。

_______________

[/php]

10608事件用来跟踪创建bitmap索引的过程。

而TREEDUMP则用来转储索引的树状结构。

打开转储出来的文件:

*** SESSION ID

c58e339c7046a1ffce9c5508745874fa.gif7.13) 2008-06-10 14:33:46.000

qerbiARwo: bitmap size is 8168

qerbiIPI default pctfree=10

qerbiIPI length=0

qerbiAllocate pfree=127 space=8168

qerbiStart first start

qerbiRop: rid=00c01ce4.0000, new=Y , key: (2):  c1 04

qerbiCmpSz notfound pctfree=10

qerbiCmpSz adjblksize=7351 length=0

qerbiRop keysize=4 maxbm=3531

kdibcoinit(3116714): srid=00c01ce4.0000

qerbiRop: rid=00c01ce4.0001, new=Y , key: (2):  c1 03

kdibcoinit(3116698): srid=00c01ce4.0001

qerbiRop: rid=00c01ce4.0002, new=Y , key: (2):  c1 02

kdibcoinit(311661c): srid=00c01ce4.0002

qerbiRop: rid=00c01ce4.0003, new=N, key: (2):  c1 04

qerbiRop: rid=00c01ce4.0004, new=N, key: (2):  c1 04

qerbiRop: rid=00c01ce4.0005, new=N, key: (2):  c1 02

qerbiRop: rid=00c01ce4.0006, new=N, key: (2):  c1 02

qerbiRop: rid=00c01ce4.0007, new=N, key: (2):  c1 03

qerbiRop: rid=00c01ce4.0008, new=N, key: (2):  c1 04

qerbiRop: rid=00c01ce4.0009, new=N, key: (2):  c1 03

qerbiRop: rid=00c01ce4.000a, new=N, key: (2):  c1 04

qerbiRop: rid=00c01ce4.000b, new=N, key: (2):  c1 02

qerbiRop: rid=00c01ce4.000c, new=N, key: (2):  c1 02

qerbiRop: rid=00c01ce4.000d, new=N, key: (2):  c1 04

qerbiRop: rid=00c01ce4.000e, new=N, key: (2):  c1 03

qerbiRop: rid=00c01ce4.000f, new=N, key: (2):  c1 03

qerbiRop: rid=00c01ce4.0010, new=N, key: (2):  c1 04

qerbiRop: rid=00c01ce4.0011, new=N, key: (2):  c1 03

qerbiRop: rid=00c01ce4.0012, new=N, key: (2):  c1 02

qerbiRop: rid=00c01ce4.0013, new=N, key: (2):  c1 04

kdibcoend(3116714): erid=00c01ce4.0017status=3

qerbiCon: key: (2):  c1 04

srid=00c01ce4.0 erid=00c01ce4.17 bitmap: (4):  ca 19 25 09

kdibcoend(3116698): erid=00c01ce4.0017status=3

qerbiCon: key: (2):  c1 03

srid=00c01ce4.0 erid=00c01ce4.17 bitmap: (4):  ca 82 c2 02

kdibcoend(311661c): erid=00c01ce4.0017status=3

qerbiCon: key: (2):  c1 02

srid=00c01ce4.0 erid=00c01ce4.17 bitmap: (4):  ca 64 18 04

这一段是创建bitmap索引的过程。我们先把被索引的列的值换算成十六进制:

[php]

SQL> select dump(3),dump(2),dump(1) from dual;

DUMP(3)            DUMP(2)            DUMP(1)

------------------ ------------------ ------------------

Typ=2 Len=2: 193,4 Typ=2 Len=2: 193,3 Typ=2 Len=2: 193,2_______________[/php]

4、3、2对应的十六进制则是04、03、02。也就是上面转储部分显示的key部分的键值。

可以看到,oracle在创建bitmap索引时,先从第一条记录开始扫描,取出第一条记录的键值(bitcol=3),也就是“qerbiRop: rid=00c01ce4.0000, new=Y , key: (2):  c1 04”。new=Y说明这是一个新的键值,因此会对应到一个索引条目。扫描第二条记录时,发现bitcol=2,该键值也是一个新的键值,因此产生一个新的索引条目,对应“qerbiRop: rid=00c01ce4.0001, new=Y , key: (2):  c1 03”。扫描到第三条记录时,发现bitcol=1,该键值也是一个新的键值,因此产生第三个索引条目,对应“qerbiRop: rid=00c01ce4.0002, new=Y , key: (2):  c1 02”。

接下来扫描到的记录所对应的bitcol的值都是1、2、3中的一个,因此都不会产生新的索引条目,因此它们的new都为N。

然后扫描完表里的所有记录以后,开始创建bitmap索引条目,也就是下面的部分:

qerbiCon: key: (2):  c1 04

srid=00c01ce4.0 erid=00c01ce4.17 bitmap: (4):  ca 19 25 09

kdibcoend(3116698): erid=00c01ce4.0017status=3

qerbiCon: key: (2):  c1 03

srid=00c01ce4.0 erid=00c01ce4.17 bitmap: (4):  ca 82 c2 02

kdibcoend(311661c): erid=00c01ce4.0017status=3

qerbiCon: key: (2):  c1 02

srid=00c01ce4.0 erid=00c01ce4.17 bitmap: (4):  ca 64 18 04

这里的srid表示start rowid,erid表示end rowid。

可以看到总共产生了3个索引条目,其key分别为:04、03、02。

这3个索引条目的start rowid和end rowid的格式分两部分,中间用点隔开,点左边的表示文件号(从左边第一个字节开始的4个字节表示)和数据块号(从左边第五个字节开始的4个字节表示),点右边表示数据块里的行号。这里的显示可以看到,这20条记录都位于相同的数据块里。这里的00c0表示文件号:

[php]

SQL> select sys.pkg_number_trans.f_hex_to_dec('c')/4 file# FROM dual;

FILE#

----------

3

SQL> select sys.pkg_number_trans.f_hex_to_dec('1ce4') as blk# FROM dual;

BLK#

----------------------

7396_______________[/php]

因此这20条记录在3号数据文件的7396号数据块里。我们可以使用dbms_rowid来验证。

[php]

SQL> select distinct dbms_rowid.rowid_relative_fno(rowid) as file#,

2  dbms_rowid.rowid_block_number(rowid) as block#

3  from t_bitmap_test;

FILE#     BLOCK#

---------- ----------

3    7396_______________[/php]

可以看到,完全符合。

每个索引条目的“bitmap : (4)”部分表示的也就是前面说到的bit位了,由1、0组成。

按照前面bitmap的理论,这20条记录所对应的三个索引条目的bitmap的样子应该为:

[php]

Key_value    start_rowid    end_rowid      理论上的bitmap         转储文件的bitmap

1          00c01ce4.0    00c01ce4.0017   00100110000110000010  ca 64 18 04

2          00c01ce4.0    00c01ce4.0017   01000001010000110100  ca 82 c2 02

3          00c01ce4.0    00c01ce4.0017   10011000101001001001  ca 19 25 09_______________[/php]

转储文件里的bitmap如何对应到bit位呢 ?首先第一个字节的ca可以不考虑,暂时不知道第一个字节是什么意思。只考虑后三个字节。比如对于key_value=3来说,19,25,09对应的二进制为:

[php]

SQL> col c1 format a10

SQL> col c2 format a10

SQL> col c3 format a10

SQL> select sys.pkg_number_trans.f_hex_to_bin(19) as c1,

2  sys.pkg_number_trans.f_hex_to_bin(25) as c2,

3  sys.pkg_number_trans.f_hex_to_bin(09) as c3 from dual;

C1         C2         C3

---------- ---------- ----------

11001      100101     1001_______________[/php]

其中不足8位的前面用0补齐,因此,C1=00011001,C2=00100101,C3=00001001

在二进制里,每个应该倒过来,从右到左排列,因此为:

[php]

C3         C2        C1

00001001   00100101   00011001_______________[/php]

然后将它们组织为一个由多个bit位组成的bitmap的话,仍然从右到左,依次取出每个bit位,于是我们有:100110001010010010010000。我们可以把这个bit串与理论上的bitmap比较一下:

100110001010010010010000

10011000101001001001

很明显,除了最后多出来的4个0以外,其余部分完全一致。而最后多出的0并不影响这个索引条目的使用。

类似的,我们可以使用相同的方法来依次验证另外两个键值,都是符合理论值的。

数据都在一个数据块里的情况比较容易理解。如果被索引的数据分布在多个数据块里呢?

经常会有人问到,只记录start rowid和end rowid,如果被索引的记录分布在多个数据块里,那么oracle如何根据start rowed来找到bitmap里的bit=1所对应的记录的rowid呢?

创建一个表:

[php]

SQL> create table t_bitmap_2(id number,bitcol char(2000));

insert into t_bitmap_2 values(1,'A');

insert into t_bitmap_2 values(2,'A');

insert into t_bitmap_2 values(3,'A');

insert into t_bitmap_2 values(4,'B');

insert into t_bitmap_2 values(5,'A');

insert into t_bitmap_2 values(6,'A');

insert into t_bitmap_2 values(7,'B');

insert into t_bitmap_2 values(8,'A');

insert into t_bitmap_2 values(9,'A');

insert into t_bitmap_2 values(9,'A');

insert into t_bitmap_2 values(10,'B');

insert into t_bitmap_2 values(11,'B');

insert into t_bitmap_2 values(12,'B');

insert into t_bitmap_2 values(13,'B');

insert into t_bitmap_2 values(14,'B');

insert into t_bitmap_2 values(15,'B');

COMMIT;_______________[/php]

获得这15条记录所在的数据块号:

[php]

SQL> select distinct dbms_rowid.rowid_relative_fno(rowid) as file#,

2  dbms_rowid.rowid_block_number(rowid) as block#

3  from t_bitmap_2;

FILE#     BLOCK#

---------- ----------

3       7428

3       7429

3       7430

3       7431

3       7432

3       7433_______________[/php]

可以知道,这15条记录分布在6个数据块里。

然后跟踪对于bitcol列上的bitmap索引的创建过程:

[php]

alter session set events '10608 trace name context forever, level 10';

create bitmap index idx_t_bitmap_2 on t_bitmap_2(bitcol);

alter session set events '10608 trace name context off';_______________[/php]

从转储出来的文件可以看到,最终形成了两个索引条目:

……

qerbiCon: key: (2000):

41 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

……

srid=00c01d04.0 erid=00c01d08.7 bitmap: (11):  c8 06 c0 44 f8 b3 01 07 f8 56 06

……

qerbiCon: key: (2000):

42 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

……

srid=00c01d04.0 erid=00c01d09.7 bitmap: (12):  00 f8 56 06 f8 56 07 c0 a1 01 c0 44

*** 2008-06-10 11:21:08.000

很明显,这里的两个索引条目的start rowed和end rowed是不相同的。

键值为A的索引条目为:

srid=00c01d04.0 erid=00c01d08.7 bitmap: (11):  c8 06 c0 44 f8 b3 01 07 f8 56 06

其数据块从1d04到1d08,也就是:

[php]

SQL> select sys.pkg_number_trans.f_hex_to_dec('1d04') as s_blk#,

2  sys.pkg_number_trans.f_hex_to_dec('1d08') as e_blk#

3  from dual;

S_BLK#     E_BLK#

---------- ----------

7428    7432_______________[/php]

而键值B的索引条目为:

srid=00c01d04.0 erid=00c01d09.7 bitmap: (12):  00 f8 56 06 f8 56 07 c0 a1 01 c0 44

其数据块从1d04到1d09,也就是:

[php]

SQL> select sys.pkg_number_trans.f_hex_to_dec('1d04') as s_blk#,

2  sys.pkg_number_trans.f_hex_to_dec('1d09') as e_blk#

3  from dual;

S_BLK#     E_BLK#

---------- ----------

7428       7433_______________[/php]

这个时候,

[php]

SQL> select substr(bitcol,1,1) as bitcol,dbms_rowid.rowid_block_number(rowid) as block# from t_bitmap_2;

BI     BLOCK#

-- ----------

B        7428

A        7428

A        7428

A        7429

B        7429

B        7429

B        7430

B        7430

B        7430

A        7431

A        7431

A        7431

B        7432

A        7432

A        7432

B        7433_______________[/php]

这时,oracle放了很多的bit来对应这15条记录,但是oracle如何根据这些bit位来找对应的rowid就猜不出了。还希望各位牛人继续补充。

[本帖最后由 hanson 于 2008-6-10 17:26 编辑]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

asp.mvc 4项目发布文件目录结构_Spring Boot项目搭建与启动

Spring Boot简介Spring Boot是由Pivotal团队提供的全新框架&#xff0c;其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。通过这种方式&#xff0c;Spring Boot致力于在蓬勃发…

windows7系统适合哪个python_Python3.6.4在Windows7系统下安装配置教程

Python3.64在Windows7系统下安装配置教程 工具/原料 Windows7系统 python3.6.4版本 方法/步骤 1 双击应用程序打开如图所示的界面这里是应用程序向导界面 这里建议勾选底部的自动写入path&#xff0c;然后点击自定义选项&#xff08;如图&#xff09;&#xff08;当然你也可以选…

php软删除代码,PHP laeavel软删除以及软删除还原 易错点

PHP laeavel软删除以及软删除还原 易错点PHP laeavel软删除以及软删除还原 易错点首先 数据库字段添加deleted_at字段然后在模型层中引入 SoftDeletes类 并引用use Illuminate\Database\Eloquent\SoftDeletes;控制器正常执行删除代码//软删除public function del(int $id){//$r…

为何控件删除不了_过不好又离不了的婚姻,不如这样去处理

你是否常常感慨&#xff0c;走过了那么长的路&#xff0c;看遍了那么多的繁花&#xff0c;听过了那么多的道理&#xff0c;却依然过不好这一生&#xff1f;明明已经很用心的去生活了&#xff0c;明明已经尽了最大的努力了&#xff0c;生活依然如同一团乱麻&#xff0c;处理不好…

单基因gsea_10个细胞系仅1个表达你的基因

遇到了粉丝的一个超级好的问题&#xff1a;感兴趣的一个基因A&#xff0c;研究它在10种乳腺癌细胞系中的表达情况&#xff0c;跑了western和qpcr 。 发现它只在一种乳腺癌细胞系中表达&#xff0c;其他9种都不表达。 结果是一致的&#xff0c;确认自己的实验没有问题&#xff…

oracle修改成olap模式,的Oracle OLAP Java实现 - 正确源加入

为此&#xff0c;我使用的是默认的模式/例如从Oracle OLAP下载部分GLOBAL 。这是从Oracle OLAP的Java引导代码的修改后的版本&#xff1a;MdmCube unitsCube (MdmCube)mdmDBSchema.getTopLevelObject("PRICE_CUBE_AWJ");MdmBaseMeasure mdmUnits (MdmBaseMeasure)uni…

c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...

我们使用的电子计算机绝大部分都是冯诺依曼结构的机器&#xff0c;遵循“存储程序”的概念。数据处理以存储为前提&#xff0c;在编程中数据如何“存得进去&#xff0c;取得出来”&#xff0c;并且符合空间、时间效率的要求&#xff0c;在考虑数据结构和算法时&#xff0c;都要…

linux 找不到php命令,bash scp:未找到命令的解决方法

scp命令用于通过ssh在两台服务器之间传输文件。大多数scp用户在系统中已经可以使用scp命令&#xff0c;但它仍然显示“bash:scp:command not found”。因此注意&#xff0c;scp命令必须在本地和远程系统上都可用才可以避免这个问题。安装SCP命令包scp命令来自Red Hat系统上的op…

Redis数据库——键过期时间

一.设置键的生存时间或者过期时间 我们可以在Redis客户端输入命令&#xff0c;可以以秒或者毫秒精度为数据库中的某个键设置生存时间&#xff0c;在指定秒数或者毫秒数之后&#xff0c;服务器会自动删除生存时间为0的键。 1.1 设置过期时间 Redis有四个不同的命令可以用于设置键…

linux 系统配额管理功能,Linux磁盘配额管理

前言&#xff1a;磁盘配额是一种磁盘空间的管理机制&#xff0c;使用磁盘配额可限制用户或组在某个特定文件系统中所能使用的最大空间。Linux系统是多用户任务操作系统&#xff0c;在使用系统时&#xff0c;会出现多用户共同使用一个磁盘的情况&#xff0c;如果其中少数几个用户…

python中的with open读取表格文件_python 使用 with open() as 读写文件

读文件: 要以读文件的模式打开一个文件对象&#xff0c;使用Python内置的open()函数&#xff0c;传入文件名和标示符&#xff1a; >>> f open(E:\python\python\test.txt, r) 标示符r表示读&#xff0c;这样&#xff0c;我们就成功地打开了一个文件。 如果文件不存在…

实用必备xp框架模块_Xposed框架安装、使用以及插件开发

Xposed框架&#xff1a;是一款可以在不修改APK的情况下影响程序运行&#xff08;修改系统&#xff09;的框架服务&#xff0c;基于它可以制作出许多功能强大的模块&#xff0c;且在功能不冲突的情况下同时运作。对原生Launcher替换图标等应用或功能均基于此框架。1、安装xposed…

3D动作绑定_3D动漫制作软件,你知道几个?

最近小编收到很多私信&#xff0c;都是问小编3D动画是靠什么软件制作而成的&#xff1f;小编经过长时间的查询&#xff0c;今天就给大家来讲一讲3D动画到底是靠什么软件制作而成的。首先&#xff0c;先给大家来讲讲3D动画在国内的制作。动画制作是个庞大的工业流程&#xff0c;…

linux set权限,Linux 特殊权限set_uid(示例代码)

特殊权限set_uid默认情况下 , 在新安装好的Linux系统下 , 仅有一个命令是拥有set_uid特殊权限的 .拥有s权限的命令(文件) : 为了确保非所有者用户 , 在使用该命令时,临时拥有所有者的身份 ; 给一个文件设置set_uid特殊权限,前提是该文件是一个可执行的二进制文件(一般都是给命令…

python中如何编写代码输入多个数据并把它们放在一个列表中去_10分钟学习函数式Python...

在这篇10分钟的文章中&#xff0c;您将学习Python中的函数式范型。您还将学习列表推导式。目录函数式范式Python的map函数是如何运行的Python中的lambda表达式Python中的reduce函数filter函数Python中的高阶函数带有函数的部分应用函数编程不是Python化列表推导式任何可迭代对象…

c++ mqtt客户端_MQTT详解及百度物接入连接手机测试(含源码) 秦子帅

MQTT简介MQTT定义MQTT(Message Queuing Telemetry Transport&#xff0c;消息队列遥测传输)是IBM开发的一个即时通讯协议&#xff0c;有可能成为物联网的重要组成部分。该协议支持所有平台&#xff0c;几乎可以把所有联网物品和外部连接起来&#xff0c;被用来当做传感器和制动…

antix linux安装教程,antiX 19.1 发布,轻量级的桌面Linux发行版

antiX是一种轻量级的桌面Linux发行版&#xff0c;以IceWM作为默认窗口管理器&#xff0c;已升级到版本19.1。尽管主要是一个错误修复版本&#xff0c;但新版本还将IceWM更新到版本1.6.3&#xff1a;提供了antiX-19.1错误修复/升级ISO映像。所有新ISO映像都是antiX 19 SysVInit系…

electron增加导航按钮_Electron发布6.0 Released版本

简介在第5版发布仅3个月后&#xff0c;流行的基于JavaScript的跨平台桌面应用程序构建平台达到了第6版&#xff0c;并使用了Chromium 76&#xff0c;Node 12.4和V8 7.6。6.0.0发行说明突破性变化升级到Chromium 76.0.3809.88&#xff0c;Node.js 12.4.0和V87.6.303.22修复了net…

linux u盘刻录软件,Deepin Linux下刻录Windows安装U盘:WoeUSB的介绍和应用

WoeUSB是用于GNULinux的Microsoft Windows USB安装介质工具&#xff0c;用它可以在Deepin等Linux系统下刻录Windows安装U盘。介绍1、特征&#xff1a;支持旧版PC/UEFI引导。支持FAT32和NTFS文件系统。支持使用物理安装光盘或磁盘映像作为源。2、支持的Windows安装映像&#xff…

曲线积分与曲面积分总结_高数下册||知识点总结

知识点总结— 期末来临&#xff0c;你准备好了吗 —高等数学学下一转眼又一学期即将结束期末考试也悄悄地临近了大家都准备好了吗我们为大家带来了高等数学(下)的复习资料来吧&#xff0c;展示&#xff01;1向量代数与空间解析几何首先我们看到的是向量代数与空间解析几何的重点…