精华内容
下载资源
问答
  • 【单选题】表达式2*3**2//8%7的计算结果是( )【单选题】以下选项,不属于Python保留字的是( )【单选题】dict是一个字典变量,能够输出数字5的选项是( ) dict={"food":{"cake":1,"egg"...

    【单选题】表达式2*3**2//8%7的计算结果是( )

    【单选题】以下选项中,不属于Python保留字的是( )

    【单选题】dict是一个字典变量,能够输出数字5的选项是( ) dict={"food":{"cake":1,"egg":5},"cake":2,"egg":3}

    【判断题】用摆式仪测试摆值同一处平行测定不少于3次,3个测点间距2~5m。( )

    【单选题】以下关于文件操作方法的描述中,错误的选项是( )

    【单选题】Python提供三种基本的数字类型,他们是( )

    【单选题】在本实验中为什么不使用草酸钠,而使用草酸来制备草酸亚铁?

    【填空题】1. 程序 py101.py 的功能是,接收键盘输入的 4 个数字,数字之间使用空格分隔,对应的变量名是 x0,y0,x1,y1 。计算两点 (x0,y0) 和( x1,y1 )之间的距离并输出这个距离,保留 2 位小数。 例如:键盘输入: 0 1 3 5 屏幕输出: 5.00 # 请在 _____ 处使用一行代码或表达式替换 # 注意:请不要修改其他已给出的代码 ntxt = input ( " 请输入 4 个数字(空格分隔): " ) ______(1)____________ x0 = eval (nls[ 0 ]) y0 = eval (nls[ 1 ]) x1 = eval (nls[ 2 ]) y1 = eval (nls[ 3 ]) r = pow ( pow (x1-x0, 2 )+ pow (y1-y0, 2 ), ___(2)_____ ) print ( "{:.2f}" .format(r))

    【填空题】在函数内部可以通过关键字( ) 来定义全局变量

    【单选题】E- A 这个音程是几度

    【多选题】本实验中涉及多重平衡,分别是

    【填空题】2. 程序 py102.py 的功能是:以 789 为随机数种子,随机生成 10 个在 100 到 999 (含)之间的随机数,以逗号分隔,打印输出。 在横线上书写代码,完善 py102.py 。 # 请在 ________ 处使用一行代码 # 注意:请不要修改其他已给出的代码 import random ______(1)____________ for i in range ( __(2)______ ): print (_____(3)________, end = "," )

    【填空题】( )是目前比较常用的Python扩展库管理工具

    【单选题】下面代码的输出结果是( ) x=10 y=3 print(x%y,x**y)

    【单选题】以下代码的输出结果是( ) for s in "HelloWorld":

    if s=="W":

    continue

    print(s,end="")

    【单选题】列表变量lst=[1,-34,"33.1",True,4+2j,0O17],lst索引的取值范围是( )

    【单选题】下面代码的输出结果是( ) lst = list(range(2,15,3)) print(9 in lst)

    【单选题】以下选项中,不是Python打开文件模式的是( )

    【单选题】下面代码的输出结果是( ) x=12.34+0j print(type(x))

    【填空题】假设有列表 a=["name’,’age’,’sex’] 和 ["Dong’,38,’Male’], 请使用一个语句将这两个列表的内容转换为字典,并且以列表 a 中的元素为“键”,以列表 b 中的元素为“值”,这个语句可以写成( )

    【单选题】以下代码的输出结果是( ) t=True def above_zero(t): return t!=0 above_zero(t)

    【单选题】哪个音一共只有2个音名

    【单选题】倾析法洗涤的目的是

    【单选题】下列是全音关系的是

    【单选题】晴朗的天空是蓝色的,这是哪种散射的结果

    【单选题】关于Python的lambda函数,以下选项中描述错误的是( )

    【填空题】3. 程序 py103.py 的功能是:计算列表 a 中元素与列表 b 中元素逐项乘积的累加和,请写代码替换横线,补充完善如下代码,使得程序能够合理运行。 # 请在 ________ 处使用一行代码 # 注意:请不要修改其他已给出的代码 a = [[ 1 , 2 , 3 ],[ 4 , 5 , 6 ],[ 7 , 8 , 9 ]] b = [ 3 , 6 , 9 ] ______(1)_________ for c in a: for j in range(3) : ____(2)________ print (s)

    【填空题】假设列表对象 aList 的值为 [3,4,5,6,7,9,11,13,15,17], 那么切片 aList[3:7] 得到的值是:( )

    【单选题】B的等音是

    【单选题】水的折射率是

    【单选题】减压抽滤时,下述操作不正确的是

    【单选题】下面是单拍子的是

    【单选题】程序运行时,键盘输入数字5,以下代码的运行结果是( ) try: n=input("请输入一个整数:") def pow2(n): return n*n pow2(n) except: print("程序执行错误")

    【单选题】以下关于Python字符串的描述中,错误的是( )

    【单选题】以下代码的输出结果是( ) lst=[4,2,9,1] lst.insert(2,3) print(lst)

    【单选题】色彩的主观三属性是:

    【单选题】以下代码的输出结果是( ) judge(age):

    if 12<= age <= 17:

    print("中学生")

    elif age <12 :

    print("小学生")

    elif age <= 28:

    print("大学生")

    else:

    print("是学生吗")

    judge()

    【单选题】关于Python的文件处理,以下选项中错误的是( )

    【单选题】文件text.txt的内容是一段文本:hiereryone,该文件与程序代码在同一目录下,代码的输出结果是( ) f=open("exam.txt")

    print(f)

    f.close()

    【单选题】溶解硫酸亚铁铵时,需添加硫酸,是因为

    【单选题】以下选项,能打印随机列表元素最大值的是( )

    【填空题】如果函数中没有 return 语句或者 return 语句不带任何返回值,那么该函数的返回值为( )

    【单选题】vlist=list(range(1,6))

    【单选题】以下关于Python分支的描述中,错误的选项是( )

    【填空题】包含 ( ) 语句的函数可以用来创建生成器

    【单选题】下面代码的输出结果是( ) x=0o17 print(x)

    【单选题】以下是关于Python函数的描述,错误的是( )

    【单选题】以下不属于Python文件操作方法的是( )

    【单选题】程序运行时,键盘输入数字5,以下代码的输出结果是( ) n=eval(input("请输入一个整数:"))

    s=100

    if n>=5:

    n-=10

    s=4

    if n<5:

    n-=10

    s=3

    print(s)

    【单选题】以下选项中,不能建立字典的是( )

    展开全文
  • 下列关于文件索引结构的叙述,哪些是正确的? 正确答案: A B C 你的答案: B C (错误) 系统为每个文件建立一张索引表 采用索引结构会引入存储开销 从文件控制块可以找到索引表或索引表的...

    下列关于文件索引结构的叙述中,哪些是正确的?

    正确答案: A B C   你的答案: B C (错误)

    系统为每个文件建立一张索引表
    采用索引结构会引入存储开销
    从文件控制块中可以找到索引表或索引表的地址
    采用索引结构,逻辑上连续的文件存放在连续的物理块中


    索引结构指一个文件的信息存放在若干不连续的物理块中,系统为每个文件建立一个专用的数据结构——索引表,并将这些块的块号存放在索引表中。有点是保留了链接结构的优点,同时解决了其缺点,即能顺序存取,又能随机存取,满足了文件动态增长,插入删除的需求,也能充分利用外存空间。缺点是索引表本身带来的系统开销。


    为了提高文件的检索效率,可以采用索引方法组织文件。采用索引这种结构,逻辑上连续的文件可以存放在若干不连续的物理块中,但对于每个文件,在存储介质中除存储文件本身外,还要求系统另外建立一张索引表,索引表记录了文件信息所在的逻辑块号和与之对应的物理块号。索引表也以文件的形式存储在存储介质中,索引表的物理地址则由文件说明信息项给出。


        在很多情况下,有的文件很大,文件索引表也就较大。如果索引表的大小超过了一个物理块,可以采用间接索引(多重索引),也就是在索引表所指的物理块中存放的不是文件信息,而是装有这些信息的物理块地址。这样,如果一个物理块可装下n个物理块地址,则经过一级间接索引,可寻址的文件长度将变为n×n块。如果文件长度还大于n×n块,还可以进行类似的扩充,即二级间接索引。


        不过,大多数文件不需要进行多重索引,也就是说,这些文件所占用的物理块的所有块号可以放在一个物理块内。如果对这些文件也采用多重索引,则显然会降低文件的存取速度。因此,在实际系统中,总是把索引表的头几项设计成直接寻址方式,也就是这几项所指的物理块中存放的是文件信息;而索引表的后几项设计成多重索引,也就是间接寻址方式。在文件较短时,就可利用直接寻址方式找到物理块号而节省存取时间。


        索引结构既适用于顺序存取,也适用于随机存取,并且访问速度快,文件长度可以动态变化。索引结构的缺点是由于使用了索引表而增加了存储空间的开销。另外,在存取文件时需要至少访问存储器两次以上,其中,一次是访问索引表,另一次是根据索引表提供的物理块号访问文件信息。由于文件在存储设备的访问速度较慢,因此,如果把索引表放在存储设备上,势必大大降低文件的存取速度。一种改进的方法是,当对某个文件进行操作之前,系统预先把索引表放入内存,这样,文件的存取就可直接在内存通过索引表确定物理地址块号,而访问存储设备的动作只需要一次。当文件被打开时,为提高访问速度将索引表读入内存,故又需要占用额外的内存空间。


    展开全文
  • 索引: 语法: CREATE INDEX test1_id_index ON test1 (id); 索引的名字test1_id_index可以自由选择,但我们最好选择一个能让我们想起该索引用途的名字。 为了移除一个索引,可以使用DROP INDEX命令。索引可以随时...

    索引

    语法:

    CREATE INDEX test1_id_index ON test1 (id);
    

    索引的名字test1_id_index可以自由选择,但我们最好选择一个能让我们想起该索引用途的名字。

    为了移除一个索引,可以使用DROP INDEX命令。索引可以随时被创建或删除。

    在一个大表上创建一个索引会耗费很长的时间。默认情况下,PostgreSQL允许在索引创建时并行地进行读(SELECT命令),但写(INSERT、UPDATE和DELETE)则会被阻塞直到索引创建完成。在生产环境中这通常是不可接受的。在创建索引时允许并行的写是可能的, PostgreSQL支持构建索引时不阻塞写入。这种方法通过 指定CREATE INDEX的CONCURRENTLY选项 实现。

    一个索引被创建后,系统必须保持它与表同步。这增加了数据操作的负担。因此哪些很少或从不在查询中使用的索引应该被移除。


    索引类型

    PostgreSQL提供了多种索引类型: B-tree、Hash、GiST、SP-GiST 、GIN 和 BRIN。每一种索引类型使用了 一种不同的算法来适应不同类型的查询。默认情况下, CREATE INDEX命令创建适合于大部分情况的B-tree 索引。
    B-tree索引

    支持的操作符:

    <
    <=
    =
    >=
    >
    BETWEEN
    IN
    IS NULL
    IS NOT NULL
    LIKE (字符开头)
    ILIKE(非字母字符开头)
    

    Hash索引
    Hash索引只能处理简单等值比较。不论何时当一个索引列涉及到一个使用了=操作符的比较时,查询规划器将考虑使用一个Hash索引。下面的命令将创建一个Hash索引:

    CREATE INDEX name ON table USING HASH (column);
    

    GiST索引
    GiST表示通用搜索树。它是一种平衡的树结构的访问方法,它作为一种模板可用来实现任意索引模式。B 树、R 树和很多其他索引模式都可以在GiST中实现。
    GiST索引并不是一种单独的索引,而是可以用于实现很多不同索引策略的基础设施。(需要安装扩展 create extension btree_gist;)
    多用于支持二维几何数据类型的索引化查询
    支持的操作符:

    在这里插入图片描述

    GiST索引也有能力优化“最近邻”搜索,例如:

    SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;
    

    它将找到离给定目标点最近的10个位置。能够支持这种查询的能力同样取决于被使用的特定操作符类

    与Btree索引比较的优缺点:

    优点:

    Gist索引适用于多维数据类型和集合数据类型,和Btree索引类似,同样适用于其他的数据类型。和Btree索引相比,Gist多字段索引在查询条件中包含索引字段的任何子集都会使用索引扫描。

    缺点:

    Gist索引创建耗时较长,占用空间也比较大。

    SP-GiST索引
    和GiST相似,SP-GiST索引为支持多种搜索提供了一种基础结构。SP-GiST 允许实现众多不同的非平衡的基于磁盘的数据结构,例如四叉树、k-d树和radix树。
    支持的操作符:
    在这里插入图片描述
    GIN 索引
    GIN意思是通用倒排索引。GIN被设计为处理被索引项为组合值的情况,并且这种索引所处理的查询需要搜索出现在组合项中的元素值。例如,项可以是文档,并且查询可以是搜索包含指定词的文档。

    我们使用词项来表示要被索引的一个组合值,并且用词键来表示一个元素值。GIN总是存储和搜索键,而不是项值本身。

    一个GIN存储一个(键,位置列表)对的集合,这里一个posting list是键在其中出现的一个行 ID 的集合。相同的行 ID 可以出现在多个位置列表中,因为一个项可以包含多于一个键。每个键值只被存储一次,因此对于同一个键出现多次的情况,一个GIN索引是非常紧凑的。

    支持的操作符:
    在这里插入图片描述
    BRIN 索引
    BRIN表示块范围索引。 BRIN是为处理这样的表而设计的:表的规模非常大,并且其中某些列与它们在表中的物理位置存在某种自然关联。一个块范围是一组在表中物理上相邻的页面,对于每一个块范围在 索引中存储了一些摘要信息。例如,一个存储商店销售订单的表可能有一个日期 列记录每个订单产生的时间,并且很多时候较早的订单项也将出现在表中较早的 地方。一个存储 ZIP 代码列的表中一个城市的所有代码可能自然地聚在一起。

    如果索引中存储的摘要信息与查询条件一致,BRIN 索引可以通过常规的位图索引扫描满足查询,并且将会返回每个范围中所有页面 中的所有元组。查询执行器负责再次检查这些元组并且抛弃掉那些不匹配查询条 件的元组 — 换句话说,这些索引是有损的。由于一个BRIN 索引很小,扫描这种索引虽然比使用顺序扫描多出了一点点开销,但是可能会避 免扫描表中很多已知不包含匹配元组的部分。

    一个BRIN索引将存储的特定数据以及该索引将能 满足的特定查询,都依赖于为该索引的每一列所选择的操作符类。具有一种 线性排序顺序的数据类型的操作符类可以存储在每个块范围内的最小和最大 值,例如几何类型可能会存储在块范围内的所有对象的外包盒。

    块范围的尺寸在索引创建时由pages_per_range存储参数决定。 索引项的数量将等于该关系的尺寸(以页面计)除以为 pages_per_range选择的值。因此,该值越小,索引会变得越大 (因为需要存储更多索引项),但是与此同时存储的摘要数据可以更加精确并 且在索引扫描期间可以跳过更多数据块。
    支持的操作符:
    在这里插入图片描述


    多列索引

    一个索引可以定义在表的多个列上。例如,我们有这样一个表:

    CREATE TABLE test2 (
      major int,
      minor int,
      name varchar
    );
    

    (即将我们的/dev目录保存在数据库中)而且我们经常会做如下形式的查询:

    SELECT name FROM test2 WHERE major = constant AND minor = constant;
    

    那么我们可以在major和minor上定义一个索引:

    CREATE INDEX test2_mm_idx ON test2 (major, minor);
    

    目前,只有 B-tree、GiST、GIN 和 BRIN 索引类型支持多列索引,最多可以指定32个列(该限制可以在源代码文件pg_config_manual.h中修改,但是修改后需要重新编译PostgreSQL)。

    一个B-tree索引可以用于条件中涉及到任意索引列子集的查询,但是当先导列(即最左边的那些列)上有约束条件时索引最为有效。确切的规则是:在先导列上的等值约束,加上第一个无等值约束的列上的不等值约束,将被用于限制索引被扫描的部分。在这些列右边的列上的约束将在索引中被检查,这样它们适当节约了对表的访问,但它们并未减小索引被扫描的部分。例如,在(a, b, c)上有一个索引并且给定一个查询条件WHERE a = 5 AND b >= 42 AND c < 77,对索引的扫描将从第一个具有a = 5和b = 42的项开始向上进行,直到最后一个具有a = 5的项。在扫描过程中,具有c >= 77的索引项将被跳过,但是它们还是会被扫描到。这个索引在原则上可以被用于在b和/或c上有约束而在a上没有约束的查询,但是整个索引都不得不被扫描,因此在大部分情况下规划器宁可使用一个顺序的表扫描来替代索引。

    一个多列GiST索引可以用于条件中涉及到任意索引列子集的查询。在其余列上的条件将限制由索引返回的项,但是第一列上的条件是决定索引上扫描量的最重要因素。当第一列中具有很少的可区分值时,一个GiST索引将会相对比较低效,即便在其他列上有很多可区分值。

    一个GIN索引可以用于条件中涉及到任意索引列子集的查询。与B-tree和GiST不同,GIN的搜索效率与查询条件中使用哪些索引列无关。

    多列 BRIN 索引可以被用于涉及该索引被索引列的任意子集的查询条件。和 GIN 相似且不同于 B-树 或者 GiST,索引搜索效率与查询条件使用哪个索引列无关。在单个表上使用多个 BRIN 索引来取代一个多列 BRIN 索引的唯一原因是为了使用不同的pages_per_range存储参数。

    当然,要使索引起作用,查询条件中的列必须要使用适合于索引类型的操作符,使用其他操作符的子句将不会被考虑使用索引。

    多列索引应该较少地使用。在绝大多数情况下,单列索引就足够了且能节约时间和空间。具有超过三个列的索引不太有用,除非该表的使用是极端程式化的。


    索引和ORDER BY

    除了简单地查找查询要返回的行外,一个索引可能还需要将它们以指定的顺序传递。这使得查询中的ORDER BY不需要独立的排序步骤。在PostgreSQL当前支持的索引类型中,只有B-tree可以产生排序后的输出,其他索引类型会把行以一种没有指定的且与实现相关的顺序返回。

    规划器会考虑以两种方式来满足一个ORDER BY说明:扫描一个符合说明的可用索引,或者先以物理顺序扫描表然后再显式排序。对于一个需要扫描表的大部分的查询,一个显式的排序很可能比使用一个索引更快,因为其顺序访问模式使得它所需要的磁盘I/O更少。只有在少数行需要被取出时,索引才会更有用。一种重要的特殊情况是ORDER BY与LIMIT n联合使用:一个显式的排序将会处理所有的数据来确定最前面的n行,但如果有一个符合ORDER BY的索引,前n行将会被直接获取且根本不需要扫描剩下的数据。

    默认情况下,B-tree索引将它的项以升序方式存储,并将空值放在最后(表TID被处理为其它相等条目之间的分线器列)。这意味着对列x上索引的一次前向扫描将产生满足ORDER BY x(或者更长的形式:ORDER BY x ASC NULLS LAST)的结果。索引也可以被后向扫描,产生满足ORDER BY x DESC(ORDER BY x DESC NULLS FIRST, NULLS FIRST是ORDER BY DESC的默认情况)。

    我们可以在创建B-tree索引时通过ASC、DESC、NULLS FIRST和NULLS LAST选项来改变索引的排序,例如:

    CREATE INDEX test2_info_nulls_low ON test2 (info NULLS FIRST);
    CREATE INDEX test3_desc_index ON test3 (id DESC NULLS LAST);
    

    一个以升序存储且将空值前置的索引可以根据扫描方向来支持ORDER BY x ASC NULLS FIRST或 ORDER BY x DESC NULLS LAST。


    唯一索引

    索引也可以被用来强制列值的唯一性,或者是多个列组合值的唯一性。

    CREATE UNIQUE INDEX name ON table (column [, ...]);
    

    当前,只有B-tree能够被声明为唯一。

    当一个索引被声明为唯一时,索引中不允许多个表行具有相同的索引值。空值被视为不相同。一个多列唯一索引将会拒绝在所有索引列上具有相同组合值的表行。

    PostgreSQL会自动为定义了一个唯一约束或主键的表创建一个唯一索引。该索引包含组成主键或唯一约束的所有列(可能是一个多列索引),它也是用于强制这些约束的机制。
    注意
    不需要手工在唯一列上创建索引,如果那样做也只是重复了自动创建的索引而已。


    表达式索引

    一个索引列并不一定是底层表的一个列,也可以是从表的一列或多列计算而来的一个函数或者标量表达式。这种特性对于根据计算结果快速获取表中内容是有用的。

    例如,一种进行大小写不敏感比较的常用方法是使用lower函数:

    SELECT * FROM test1 WHERE lower(col1) = 'value';
    

    这种查询可以利用一个建立在lower(col1)函数结果之上的索引:

    CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
    

    表达式索引还允许控制唯一索引的范围。例如,此唯一索引可防止在double precision类型列中存储重复的整数值:

    CREATE UNIQUE INDEX test1_uniq_int ON tests ((floor(double_col)))
    

    如果我们将该索引声明为UNIQUE,它将阻止创建在col1值上只有大小写不同的行。

    另外一个例子,如果我们经常进行如下的查询:

    SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';
    

    那么值得创建一个这样的索引:

    CREATE INDEX people_names ON people ((first_name || ' ' || last_name));
    

    正如第二个例子所示,CREATE INDEX命令的语法通常要求在被索引的表达式周围书写圆括号。而如第一个例子所示,当表达式只是一个函数调用时可以省略掉圆括号。

    索引表达式的维护代价较为昂贵,因为在每一个行被插入或更新时都得为它重新计算相应的表达式。然而,索引表达式在进行索引搜索时却不需要重新计算,因为它们的结果已经被存储在索引中了。在上面两个例子中,系统将会发现查询的条件是WHERE indexedcolumn = ‘constant’,因此查询的速度将等同于其他简单索引查询。因此,表达式索引对于检索速度远比插入和更新速度重要的情况非常有用。


    部分索引

    一个部分索引是建立在表的一个子集上,而该子集则由一个条件表达式(被称为部分索引的谓词)定义。而索引中只包含那些符合该谓词的表行的项。部分索引是一种专门的特性,但在很多种情况下它们也很有用。

    使用部分索引的一个主要原因是避免索引公值。由于搜索一个公值的查询(一个在所有表行中占比超过一定百分比的值)不会使用索引,所以完全没有理由将这些行保留在索引中。这可以减小索引的尺寸,同时也将加速使用索引的查询。它也将加速很多表更新操作,因为这种索引并不需要在所有情况下都被更新。

    如果我们有一个表包含已上账和未上账的订单,其中未上账的订单在整个表中占据一小部分且它们是最经常被访问的行。我们可以通过只在未上账的行上创建一个索引来提高性能。创建索引的命令如下:

    CREATE INDEX orders_unbilled_index ON orders (order_nr)
        WHERE billed is not true;
    

    使用该索引的一个可能查询是:

    SELECT * FROM orders WHERE billed is not true AND order_nr < 10000;
    

    然而,索引也可以用于完全不涉及order_nr的查询,例如:

    SELECT * FROM orders WHERE billed is not true AND amount > 5000.00;
    

    这并不如在amount列上部分索引有效,因为系统必须扫描整个索引。然而,如果有相对较少的未上账订单,使用这个部分索引来查找未上账订单将会更好。

    注意这个查询将不会使用该索引:

    SELECT * FROM orders WHERE order_nr = 3501;
    

    订单3501可能在已上账订单或未上账订单中。

    假设我们有一个描述测试结果的表。我们希望保证其中对于一个给定的主题和目标组合只有一个“成功”项,但其中可能会有任意多个“不成功”项。实现它的方式是:

    CREATE TABLE tests (
        subject text,
        target text,
        success boolean,
        ...
    );
    
    CREATE UNIQUE INDEX tests_success_constraint ON tests (subject, target)
        WHERE success;
    

    当有少数成功测试和很多不成功测试时这是一种特别有效的方法。

    通过使用部分索引子句只处理空列值,该索引只允许索引列中有一个空值,并且用一个表达式索引子句来索引 true 来替代 null:

    CREATE UNIQUE INDEX tests_target_one_null ON tests ((target IS NULL)) WHERE target IS NULL;
    

    最后,一个部分索引也可以被用来重载系统的查询规划选择。同样,具有特殊分布的数据集可能导致系统在它并不需要索引的时候选择使用索引。在此种情况下可以被建立,这样它将不会被那些无关的查询所用。通常,PostgreSQL会对索引使用做出合理的选择(例如,它会在检索公值时避开索引,这样前面的例子只能节约索引尺寸,它并非是避免索引使用所必需的),非常不正确的规划选择则需要作为故障报告。

    记住建立一个部分索引意味着我们知道的至少和查询规划器所知的一样多,尤其是我们知道什么时候一个索引会是有益的。构建这些知识需要经验和对于PostgreSQL中索引工作方式的理解。在大部分情况下,一个部分索引相对于一个普通索引的优势很小。


    索引和排序规则

    一个索引在每一个索引列上只能支持一种排序规则。如果需要多种排序规则,你可能需要多个索引。

    考虑这些语句:

    CREATE TABLE test1c (
        id integer,
        content varchar COLLATE "x"
    );
    
    CREATE INDEX test1c_content_index ON test1c (content);
    

    该索引自动使用下层列的排序规则。因此一个如下形式的查询:

    SELECT * FROM test1c WHERE content > constant;
    

    可以使用该索引,因为比较会默认使用列的排序规则。但是,这个索引无法加速涉及到某些其他排序规则的查询。因此对于下面形式的查询:

    SELECT * FROM test1c WHERE content > constant COLLATE "y";
    

    可以创建一个额外的支持"y"排序规则的索引,例如:

    CREATE INDEX test1c_content_y_index ON test1c (content COLLATE "y");
    
    展开全文
  • 一旦建立了索引,在用户表建立、更改和删除数据库时, Oracle就自动地维护索引。创建索引时,下列准则将帮助用户做出决定:  1) 索引应该在SQL语句的"where"或"and"部分涉及的表列(也称谓词...

    索引是由Oracle维护的可选结构,为数据提供快速的访问。准确地判断在什么地方需要使用索引是困难的,使用索引有利于调节检索速度。 当建立一个索引时,必须指定用于跟踪的表名以及一个或多个表列。一旦建立了索引,在用户表中建立、更改和删除数据库时, Oracle就自动地维护索引。创建索引时,下列准则将帮助用户做出决定:

      1) 索引应该在SQL语句的"where"或"and"部分涉及的表列(也称谓词)被建立。假如

      personnel表的"firstname"表列作为查询结果显示,而不是作为谓词部分,则不论其值是什么,该表列不会被索引。

      2)用户应该索引具有一定范围的表列,索引时有一个大致的原则:如果表中列的值占该表中行的2 0 %以内,这个表列就可以作为候选索引表列。假设一个表有36 000行且表中一个表列的值平均分布(大约每12000行),那么该表列不适合于一个索引。然而,如果同一个表中的其他表列中列值的行在1 0 0 0~1 5 0 0之间(占3 %~4 % ),则该表列可用作索引。

      3)如果在S Q L语句谓词中多个表列被一起连续引用,则应该考虑将这些表列一起放在一个索引内, O r a c l e将维护单个表列的索引(建立在单一表列上)或复合索引(建立在多个表列上)。复合索引称并置索引。

      1 主关键字的约束

      关系数据库理论指出,在表中能唯一标识表的每个数据行的一个或多个表列是对象的主关键字。由于数据字典中定义的主关键字能确保表中数据行之间的唯一性,因此,在O r a c l e 8 i数据库中建立表索引关键字有助于应用调节。另外,这也减轻了开发者为了实现唯一性检查,而需要各自编程的要求。

      提示使用主关键字索引条目比不使用主关键字索引检索得快。

      假设表p e r s o n把它的i d表列作为主关键字,用下列代码设置约束:

    alter table person add constraint person_pk primary key (id) using index storage (initial 1m next 1m

    pctincrease 0) tablespace prd_indexes ;

      处理下列S Q L语句时:

    select last_name ,first_name ,salary from person where id = 289 ;

      在查找一个已确定的“ i d”表列值时, O r a c l e将直接找到p e r s o n _ p k。如果其未找到正确的索引条目,O r a c l e知道该行不存在。主关键字索引具有下列两个独特之处:

      1.1因为索引是唯一的, 所以O r a c l e知道只有一个条目具有设定值。如果查找到了所期望的条目,则立即终止查找。

      1.2一旦遇到一个大于设定值的条目,索引的顺序搜索可被终止;

      2 ORDER BY中用索引

      ORDER BY 子句只在两种严格的条件下使用索引.

      ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.

      ORDER BY中所有的列必须定义为非空.

      WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列.

      例如:

      表DEPT包含以下列:

    DEPT_CODE PK

    NOT NULL

    DEPT_DESC NOT NULL

    DEPT_TYPE NULL

      非唯一性的索引(DEPT_TYPE)

      低效: (索引不被使用)

    SELECT DEPT_CODE

    FROM DEPT

    ORDER BY DEPT_TYPE

    EXPLAIN PLAN:

    SORT ORDER BY

    TABLE ACCESS FULL

      高效: (使用索引)

    SELECT DEPT_CODE

    FROM DEPT

    WHERE DEPT_TYPE > 0

    EXPLAIN PLAN:

    TABLE ACCESS BY ROWID ON EMP

    INDEX RANGE SCAN ON DEPT_IDX

      3 避免改变索引列的类型.

      当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.

    假设 EMPNO是一个数值类型的索引列.

    SELECT …

    FROM EMP

    WHERE EMPNO = ‘123'

      实际上,经过ORACLE类型转换, 语句转化为:

    SELECT …

    FROM EMP

    WHERE EMPNO = TO_NUMBER(‘123')

      幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变.

      现在,假设EMP_TYPE是一个字符类型的索引列.

    SELECT …

    FROM EMP

    WHERE EMP_TYPE = 123

      这个语句被ORACLE转换为:

    SELECT …

    FROM EMP

    WHERE TO_NUMBER(EMP_TYPE)=123

      因为内部发生的类型转换, 这个索引将不会被用到! 为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型.

      4 需要当心的WHERE子句

      某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子.

      在下面的例子里, ‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中.

      不使用索引:

    SELECT ACCOUNT_NAME

    FROM TRANSACTION

    WHERE AMOUNT !=0;

      使用索引:

    SELECT ACCOUNT_NAME

    FROM TRANSACTION

    WHERE AMOUNT >0;

      下面的例子中, ‘||'是字符连接函数. 就象其他函数那样, 停用了索引. 不使用索引:

    SELECT ACCOUNT_NAME,AMOUNT

    FROM TRANSACTION

    WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA';

      使用索引:

    SELECT ACCOUNT_NAME,AMOUNT

    FROM TRANSACTION

    WHERE ACCOUNT_NAME = ‘AMEX'

    AND ACCOUNT_TYPE=' A';

      下面的例子中, ‘+'是数学函数. 就象其他数学函数那样, 停用了索引.

      不使用索引:

    SELECT ACCOUNT_NAME, AMOUNT

    FROM TRANSACTION

    WHERE AMOUNT + 3000 >5000;

      使用索引:

    SELECT ACCOUNT_NAME, AMOUNT

    FROM TRANSACTION

    WHERE AMOUNT > 2000 ;

      下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描.

      不使用索引:

    SELECT ACCOUNT_NAME, AMOUNT

    FROM TRANSACTION

    WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME);

      使用索引:

    SELECT ACCOUNT_NAME, AMOUNT

    FROM TRANSACTION

    WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%');

      如果一定要对使用函数的列启用索引, ORACLE新的功能: 基于函数的索引(Function-Based Index) 也许是一个较好的

      方案.

    CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/

    SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL'; /*将使用索引*/

      5 怎样监控无用的索引

      Oracle 9i以上,可以监控索引的使用情况,如果一段时间内没有使用的索引,一般就是无用的索引

      语法为:

      开始监控:alter index index_name monitoring usage;

      检查使用状态:select * from v$object_usage;

      停止监控:alter index index_name nomonitoring usage;

      当然,如果想监控整个用户下的索引,可以采用如下的脚本:

    set heading off

    set echo off

    set feedback off

    set pages 10000

    spool start_index_monitor.sql

    SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'

    FROM dba_indexes

    WHERE owner = USER;

    spool off

    set heading on

    set echo on

    set feedback on

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

    set heading off

    set echo off

    set feedback off

    set pages 10000

    spool stop_index_monitor.sql

    SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'

    FROM dba_indexes

    WHERE owner = USER;

    spool off

    set heading on

    set echo on

    set feedback on

    一.索引介绍 

    1.1 索引的创建语法: 

    CREATE UNIUQE | BITMAP INDEX <schema>.<index_name> 

          ON <schema>.<table_name> 

               (<column_name> | <expression> ASC | DESC, 

                <column_name> | <expression> ASC | DESC,...) 

         TABLESPACE <tablespace_name> 

         STORAGE <storage_settings> 

         LOGGING | NOLOGGING 

        COMPUTE STATISTICS 

         NOCOMPRESS | COMPRESS<nn> 

         NOSORT | REVERSE 

         PARTITION | GLOBAL PARTITION<partition_setting> 

    相关说明 

    1) UNIQUE | BITMAP:指定UNIQUE为唯一值索引,BITMAP为位图索引,省略为B-Tree索引。 

    2)<column_name> | <expression> ASC | DESC:可以对多列进行联合索引,当为expression时即“基于函数的索引” 

    3)TABLESPACE:指定存放索引的表空间(索引和原表不在一个表空间时效率更高) 

    4)STORAGE:可进一步设置表空间的存储参数 

    5)LOGGING | NOLOGGING:是否对索引产生重做日志(对大表尽量使用NOLOGGING来减少占用空间并提高效率) 

    6)COMPUTE STATISTICS:创建新索引时收集统计信息 

    7)NOCOMPRESS | COMPRESS<nn>:是否使用“键压缩”(使用键压缩可以删除一个键列中出现的重复值) 

    8)NOSORT | REVERSE:NOSORT表示与表中相同的顺序创建索引,REVERSE表示相反顺序存储索引值 

    9)PARTITION | NOPARTITION:可以在分区表和未分区表上对创建的索引进行分区 

    1.2 索引特点: 

    第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 

    第二,可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 

    第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 

    第四,在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 

    第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 

    1.3 索引不足: 

    第一,创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 

    第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 

    第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 

    1.4 应该建索引列的特点: 

    1)在经常需要搜索的列上,可以加快搜索的速度; 

    2)在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 

    3)在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度; 

    4)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的; 

    5)在经常需要排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 

    6)在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。 

    1.5 不应该建索引列的特点: 

    第一,对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提高查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 

    第二,对于那些只有很少数据值的列也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。 

    第三,对于那些定义为blob数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 

    第四,当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。 

    1.6 限制索引 

    限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题: 

       1.6.1  使用不等于操作符(<>、!=)      

       下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。     

       select cust_Id,cust_name from customers where  cust_rating <> 'aa';        

    把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的优化器(更智能)时,将会使用索引。        

      select cust_Id,cust_name from customers where cust_rating < 'aa' or cust_rating > 'aa'; 

      特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。 

       1.6.2 使用IS NULL 或IS NOT NULL 

       使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成 NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引,关于位图索引在稍后在详细讨论)。 

       1.6.3 使用函数 

       如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。 下面的查询不会使用索引(只要它不是基于函数的索引) 

    select empno,ename,deptno from emp  where  trunc(hiredate)='01-MAY-81'; 

       把上面的语句改成下面的语句,这样就可以通过索引进行查找。 

    select empno,ename,deptno from emp where  hiredate<(to_date('01-MAY-81')+0.9999); 

      1.6.4 比较不匹配的数据类型       

    也是比较难于发现的性能问题之一。 注意下面查询的例子,account_number是一个VARCHAR2类型,在account_number字段上有索引。 

    下面的语句将执行全表扫描: 

    select bank_name,address,city,state,zip from banks where account_number = 990354; 

      Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引: 

    select bank_name,address,city,state,zip from banks where account_number ='990354'; 

    特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一次“全表扫描”。 

    1.7 查询索引 

    查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。 

    1.8 组合索引 

    当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。在 Oracle9i引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。比如:表emp有一个组合索引键,该索引包含了empno、 ename和deptno。在Oracle9i之前除非在where之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。 

       特别注意:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引! 

    1.9 ORACLE ROWID 

    通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。ROWID其实就是直接指向单独行的线路图。如果想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。 

    1.10 选择性 

       使用USER_INDEXES视图,该视图中显示了一个distinct_keys列。比较一下唯一键的数量和表中的行数,就可以判断索引的选择性。选择性越高,索引返回的数据就越少。 

    1.11 群集因子(Clustering Factor) 

      Clustering Factor位于USER_INDEXES视图中。该列反映了数据相对于已建索引的列是否显得有序。如果Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目,表中的数据就越有序。如果它的值接近于表中的行数,则表中的数据就不是很有序。 

    1.12 二元高度(Binary height) 

      索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用。在对一个索引进行分析后,可以通过查询DBA_INDEXES的B- level列查看它的二元高度。二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。索引上如果有大量被删除的行,它的二元高度也会增加。更新索引列也类似于删除操作,因为它增加了已删除键的数目。重建索引可能会降低二元高度。 

    1.13 快速全局扫描 

      从Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)这个选项。这个选项允许Oracle执行一个全局索引扫描操作。快速全局扫描读取B-树索引上所有树叶块。初始化文件中的 DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。 

    1.14 跳跃式扫描 

      从Oracle9i开始,索引跳跃式扫描特性可以允许优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。 

    下面的比较他们的区别: 

    SQL> set timing on 

    SQL> create index TT_index on TT(teamid,areacode); 

    索引已创建。 

    已用时间:  00: 02: 03.93 

    SQL> select count(areacode) from tt; 

    COUNT(AREACODE) 

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

    7230369 

    已用时间:  00: 00: 08.31 

    SQL> select /*+ index(tt TT_index )*/ count(areacode) from tt; 

    COUNT(AREACODE) 

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

    7230369 

    已用时间:  00: 00: 07.37 

    1.15 索引的类型 

    B-树索引    位图索引   HASH索引     索引编排表  

    反转键索引 基于函数的索引  分区索引   本地和全局索引 

    二. 索引分类 

    Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。下面就将简单的讨论每个索引选项。 

    下面讨论的索引类型: 

    B树索引(默认类型) 

    位图索引 

    HASH索引 

    索引组织表索引 

    反转键(reverse key)索引 

    基于函数的索引 

    分区索引(本地和全局索引) 

    位图连接索引 

    2.1  B树索引 (默认类型) 

    B树索引在Oracle中是一个通用索引。在创建索引时它就是默认的索引类型。B树索引可以是一个列的(简单)索引,也可以是组合/复合(多个列)的索引。B树索引最多可以包括32列。 

    在下图的例子中,B树索引位于雇员表的last_name列上。这个索引的二元高度为3;接下来,Oracle会穿过两个树枝块(branch block),到达包含有ROWID的树叶块。在每个树枝块中,树枝行包含链中下一个块的ID号。 

    树叶块包含了索引值、ROWID,以及指向前一个和后一个树叶块的指针。Oracle可以从两个方向遍历这个二叉树。B树索引保存了在索引列上有值的每个数据行的ROWID值。Oracle不会对索引列上包含NULL值的行进行索引。如果索引是多个列的组合索引,而其中列上包含NULL值,这一行就会处于包含NULL值的索引列中,且将被处理为空(视为NULL)。 

                             

    技巧:索引列的值都存储在索引中。因此,可以建立一个组合(复合)索引,这些索引可以直接满足查询,而不用访问表。这就不用从表中检索数据,从而减少了I/O量。 

    B-tree 特点: 

      适合与大量的增、删、改(OLTP) 

    不能用包含OR操作符的查询; 

    适合高基数的列(唯一值多) 

    典型的树状结构; 

    每个结点都是数据块; 

    大多都是物理上一层、两层或三层不定,逻辑上三层; 

    叶子块数据是排序的,从左向右递增; 

    在分支块和根块中放的是索引的范围; 

    2.2  位图索引 

    位图索引非常适合于决策支持系统(Decision Support System,DSS)和数据仓库,它们不应该用于通过事务处理应用程序访问的表。它们可以使用较少到中等基数(不同值的数量)的列访问非常大的表。尽管位图索引最多可达30个列,但通常它们都只用于少量的列。 

    例如,您的表可能包含一个称为Sex的列,它有两个可能值:男和女。这个基数只为2,如果用户频繁地根据Sex列的值查询该表,这就是位图索引的基列。当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力。如果有多个可用的位图索引,Oracle就可以合并从每个位图索引得到的结果集,快速删除不必要的数据。 

    Bitmapt 特点: 

    适合与决策支持系统; 

    做UPDATE代价非常高; 

    非常适合OR操作符的查询; 

    基数比较少的时候才能建位图索引; 

    技巧:对于有较低基数的列需要使用位图索引。性别列就是这样一个例子,它有两个可能值:男或女(基数仅为2)。位图对于低基数(少量的不同值)列来说非常快,这是因为索引的尺寸相对于B树索引来说小了很多。因为这些索引是低基数的B树索引,所以非常小,因此您可以经常检索表中超过半数的行,并且仍使用位图索引。 

    当大多数条目不会向位图添加新的值时,位图索引在批处理(单用户)操作中加载表(插入操作)方面通常要比B树做得好。当多个会话同时向表中插入行时不应该使用位图索引,在大多数事务处理应用程序中都会发生这种情况。 

    示例 

    下面来看一个示例表PARTICIPANT,该表包含了来自个人的调查数据。列Age_Code、Income_Level、Education_Level和Marital_Status都包括了各自的位图索引。下图显示了每个直方图中的数据平衡情况,以及对访问每个位图索引的查询的执行路径。图中的执行路径显示了有多少个位图索引被合并,可以看出性能得到了显著的提高。 

                          

    如上图图所示,优化器依次使用4个单独的位图索引,这些索引的列在WHERE子句中被引用。每个位图记录指针(例如0或1),用于指示表中的哪些行包含位图中的已知值。有了这些信息后,Oracle就执行BITMAP AND操作以查找将从所有4个位图中返回哪些行。该值然后被转换为ROWID值,并且查询继续完成剩余的处理工作。注意,所有4个列都有非常低的基数,使用索引可以非常快速地返回匹配的行。 

    技巧:在一个查询中合并多个位图索引后,可以使性能显著提高。位图索引使用固定长度的数据类型要比可变长度的数据类型好。较大尺寸的块也会提高对位图索引的存储和读取性能。 

    下面的查询可显示索引类型。 

    SQL> select index_name, index_type from user_indexes; 

    INDEX_NAME         INDEX_TYPE 

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

    TT_INDEX            NORMAL 

    IX_CUSTADDR_TP    NORMAL 

    B树索引作为NORMAL列出;而位图索引的类型值为BITMAP。 

    技巧:如果要查询位图索引列表,可以在USER _INDEXES视图中查询index_type列。 

    建议不要在一些联机事务处理(OLTP)应用程序中使用位图索引。B树索引的索引值中包含ROWID,这样Oracle就可以在行级别上锁定索引。位图索引存储为压缩的索引值,其中包含了一定范围的ROWID,因此Oracle必须针对一个给定值锁定所有范围内的ROWID。这种锁定类型可能在某些DML语句中造成死锁。SELECT语句不会受到这种锁定问题的影响。 

    位图索引的使用限制: 

    基于规则的优化器不会考虑位图索引。 

    当执行ALTER TABLE语句并修改包含有位图索引的列时,会使位图索引失效。 

    位图索引不包含任何列数据,并且不能用于任何类型的完整性检查。 

    位图索引不能被声明为唯一索引。 

    位图索引的最大长度为30。 

    技巧:不要在繁重的OLTP环境中使用位图索引 

    2.3  HASH索引 

    使用HASH索引必须要使用HASH集群。建立一个集群或HASH集群的同时,也就定义了一个集群键。这个键告诉Oracle如何在集群上存储表。在存储数据时,所有与这个集群键相关的行都被存储在一个数据库块上。如果数据都存储在同一个数据库块上,并且将HASH索引作为WHERE子句中的确切匹配,Oracle就可以通过执行一个HASH函数和I/O来访问数据——而通过使用一个二元高度为4的B树索引来访问数据,则需要在检索数据时使用4个I/O。如下图所示,其中的查询是一个等价查询,用于匹配HASH列和确切的值。Oracle可以快速使用该值,基于HASH函数确定行的物理存储位置。 

    HASH索引可能是访问数据库中数据的最快方法,但它也有自身的缺点。集群键上不同值的数目必须在创建HASH集群之前就要知道。需要在创建HASH集群的时候指定这个值。低估了集群键的不同值的数字可能会造成集群的冲突(两个集群的键值拥有相同的HASH值)。这种冲突是非常消耗资源的。冲突会造成用来存储额外行的缓冲溢出,然后造成额外的I/O。如果不同HASH值的数目已经被低估,您就必须在重建这个集群之后改变这个值。 

    ALTER CLUSTER命令不能改变HASH键的数目。HASH集群还可能浪费空间。如果无法确定需要多少空间来维护某个集群键上的所有行,就可能造成空间的浪费。如果不能为集群的未来增长分配好附加的空间,HASH集群可能就不是最好的选择。如果应用程序经常在集群表上进行全表扫描,HASH集群可能也不是最好的选择。由于需要为未来的增长分配好集群的剩余空间量,全表扫描可能非常消耗资源。 

    在实现HASH集群之前一定要小心。您需要全面地观察应用程序,保证在实现这个选项之前已经了解关于表和数据的大量信息。通常,HASH对于一些包含有序值的静态数据非常有效。 

    技巧:HASH索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。 

                             

    2.4  索引组织表 

    索引组织表会把表的存储结构改成B树结构,以表的主键进行排序。这种特殊的表和其他类型的表一样,可以在表上执行所有的DML和DDL语句。由于表的特殊结构,ROWID并没有被关联到表的行上。 

    对于一些涉及精确匹配和范围搜索的语句,索引组织表提供了一种基于键的快速数据访问机制。基于主键值的UPDATE和DELETE语句的性能也同样得以提高,这是因为行在物理上有序。由于键列的值在表和索引中都没有重复,存储所需要的空间也随之减少。 

    如果不会频繁地根据主键列查询数据,则需要在索引组织表中的其他列上创建二级索引。不会频繁根据主键查询表的应用程序不会了解到使用索引组织表的全部优点。对于总是通过对主键的精确匹配或范围扫描进行访问的表,就需要考虑使用索引组织表。 

    技巧:可以在索引组织表上建立二级索引。 

    2.5  反转键索引 

    当载入一些有序数据时,索引肯定会碰到与I/O相关的一些瓶颈。在数据载入期间,某部分索引和磁盘肯定会比其他部分使用频繁得多。为了解决这个问题,可以把索引表空间存放在能够把文件物理分割在多个磁盘上的磁盘体系结构上。 

    为了解决这个问题,Oracle还提供了一种反转键索引的方法。如果数据以反转键索引存储,这些数据的值就会与原先存储的数值相反。这样,数据1234、1235和1236就被存储成4321、5321和6321。结果就是索引会为每次新插入的行更新不同的索引块。 

    技巧:如果您的磁盘容量有限,同时还要执行大量的有序载入,就可以使用反转键索引。 

    不可以将反转键索引与位图索引或索引组织表结合使用。因为不能对位图索引和索引组织表进行反转键处理。 

    2.6  基于函数的索引 

    可以在表中创建基于函数的索引。如果没有基于函数的索引,任何在列上执行了函数的查询都不能使用这个列的索引。例如,下面的查询就不能使用JOB列上的索引,除非它是基于函数的索引: 

    select * from emp where UPPER(job) = 'MGR'; 

    下面的查询使用JOB列上的索引,但是它将不会返回JOB列具有Mgr或mgr值的行: 

    select * from emp where job = 'MGR'; 

    可以创建这样的索引,允许索引访问支持基于函数的列或数据。可以对列表达式UPPER(job)创建索引,而不是直接在JOB列上建立索引,如: 

    create index EMP$UPPER_JOB on emp(UPPER(job)); 

    尽管基于函数的索引非常有用,但在建立它们之前必须先考虑下面一些问题: 

    能限制在这个列上使用的函数吗?如果能,能限制所有在这个列上执行的所有函数吗 

    是否有足够应付额外索引的存储空间? 

    在每列上增加的索引数量会对针对该表执行的DML语句的性能带来何种影响? 

    基于函数的索引非常有用,但在实现时必须小心。在表上创建的索引越多,INSERT、UPDATE和DELETE语句的执行就会花费越多的时间。 

    注意:对于优化器所使用的基于函数的索引来说,必须把初始参数QUERY _REWRITE _ ENABLED设定为TRUE。

    示例: 

    select  count(*) from  sample where ratio(balance,limit) >.5; 

    Elapsed time: 20.1 minutes 

    create index ratio_idx1 on sample (ratio(balance, limit)); 

    select  count(*) from  sample where ratio(balance,limit) >.5; 

    Elapsed time: 7 seconds!!! 

    2.7  分区索引 

    分区索引就是简单地把一个索引分成多个片断。通过把一个索引分成多个片断,可以访问更小的片断(也更快),并且可以把这些片断分别存放在不同的磁盘驱动器上(避免I/O问题)。B树和位图索引都可以被分区,而HASH索引不可以被分区。可以有好几种分区方法:表被分区而索引未被分区;表未被分区而索引被分区;表和索引都被分区。不管采用哪种方法,都必须使用基于成本的优化器。分区能够提供更多可以提高性能和可维护性的可能性 

    有两种类型的分区索引:本地分区索引和全局分区索引。每个类型都有两个子类型,有前缀索引和无前缀索引。表各列上的索引可以有各种类型索引的组合。如果使用了位图索引,就必须是本地索引。把索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性和可靠性。 

    在使用分区后的表和索引时,Oracle还支持并行查询和并行DML。这样就可以同时执行多个进程,从而加快处理这条语句。 

    2.7.1.本地分区索引(通常使用的索引) 

    可以使用与表相同的分区键和范围界限来对本地索引分区。每个本地索引的分区只包含了它所关联的表分区的键和ROWID。本地索引可以是B树或位图索引。如果是B树索引,它可以是唯一或不唯一的索引。 

    这种类型的索引支持分区独立性,这就意味着对于单独的分区,可以进行增加、截取、删除、分割、脱机等处理,而不用同时删除或重建索引。Oracle自动维护这些本地索引。本地索引分区还可以被单独重建,而其他分区不会受到影响。 

    2.7.1.1 有前缀的索引 

    有前缀的索引包含了来自分区键的键,并把它们作为索引的前导。例如,让我们再次回顾participant表。在创建该表后,使用survey_id和survey_date这两个列进行范围分区,然后在survey_id列上建立一个有前缀的本地索引,如下图所示。这个索引的所有分区都被等价划分,就是说索引的分区都使用表的相同范围界限来创建。 

                     

    技巧:本地的有前缀索引可以让Oracle快速剔除一些不必要的分区。也就是说没有包含WHERE条件子句中任何值的分区将不会被访问,这样也提高了语句的性能。 

    2.7.1.2 无前缀的索引 

    无前缀的索引并没有把分区键的前导列作为索引的前导列。若使用有同样分区键(survey_id和survey_date)的相同分区表,建立在survey_date列上的索引就是一个本地的无前缀索引,如下图所示。可以在表的任一列上创建本地无前缀索引,但索引的每个分区只包含表的相应分区的键值。 

                             

    如果要把无前缀的索引设为唯一索引,这个索引就必须包含分区键的子集。在这个例子中,我们必须把包含survey和(或)survey_id的列进行组合(只要survey_id不是索引的第一列,它就是一个有前缀的索引)。 

    技巧:对于一个唯一的无前缀索引,它必须包含分区键的子集。 

    2.7.2. 全局分区索引 

    全局分区索引在一个索引分区中包含来自多个表分区的键。一个全局分区索引的分区键是分区表中不同的或指定一个范围的值。在创建全局分区索引时,必须定义分区键的范围和值。全局索引只能是B树索引。Oracle在默认情况下不会维护全局分区索引。如果一个分区被截取、增加、分割、删除等,就必须重建全局分区索引,除非在修改表时指定ALTER TABLE命令的UPDATE GLOBAL INDEXES子句。 

    2.7.2.1 有前缀的索引 

    通常,全局有前缀索引在底层表中没有经过对等分区。没有什么因素能限制索引的对等分区,但Oracle在生成查询计划或执行分区维护操作时,并不会充分利用对等分区。如果索引被对等分区,就必须把它创建为一个本地索引,这样Oracle可以维护这个索引,并使用它来删除不必要的分区,如下图所示。在该图的3个索引分区中,每个分区都包含指向多个表分区中行的索引条目。 

             

                           

             分区的、全局有前缀索引 

    技巧:如果一个全局索引将被对等分区,就必须把它创建为一个本地索引,这样Oracle可以维护这个索引,并使用它来删除不必要的分区。 

    2.7.2.2 无前缀的索引 

    Oracle不支持无前缀的全局索引。 

    2.8  位图连接索引 

    位图连接索引是基于两个表的连接的位图索引,在数据仓库环境中使用这种索引改进连接维度表和事实表的查询的性能。创建位图连接索引时,标准方法是连接索引中常用的维度表和事实表。当用户在一次查询中结合查询事实表和维度表时,就不需要执行连接,因为在位图连接索引中已经有可用的连接结果。通过压缩位图连接索引中的ROWID进一步改进性能,并且减少访问数据所需的I/O数量。 

    创建位图连接索引时,指定涉及的两个表。相应的语法应该遵循如下模式: 

    create bitmap index FACT_DIM_COL_IDX on FACT(DIM.Descr_Col) from FACT, DIM 

    where FACT.JoinCol = DIM.JoinCol; 

    位图连接的语法比较特别,其中包含FROM子句和WHERE子句,并且引用两个单独的表。索引列通常是维度表中的描述列——就是说,如果维度是CUSTOMER,并且它的主键是CUSTOMER_ID,则通常索引Customer_Name这样的列。如果事实表名为SALES,可以使用如下的命令创建索引: 

    create bitmap index SALES_CUST_NAME_IDX 

    on  SALES(CUSTOMER.Customer_Name)  from SALES, CUSTOMER 

    where  SALES.Customer_ID=CUSTOMER.Customer_ID; 

    如果用户接下来使用指定Customer_Name列值的WHERE子句查询SALES和CUSTOMER表,优化器就可以使用位图连接索引快速返回匹配连接条件和Customer_Name条件的行。 

    位图连接索引的使用一般会受到限制: 

    1)只可以索引维度表中的列。 

    2)用于连接的列必须是维度表中的主键或唯一约束;如果是复合主键,则必须使用连接中的每一列。 

    3)不可以对索引组织表创建位图连接索引,并且适用于常规位图索引的限制也适用于位图连接索引。 

    展开全文
  • 题目:下面关于Java的Vector、ArrayList、LinkedList的表述正确的是____(多选) A、这三个类都实现了java.util.List 接口,但只有Vector是线程安全的 B、ArrayList与Vector在从指定位置用index检索一个元素的时候...
  • OBs,或Large Objects字段,是Oracle用于处理存储非字符数据推荐的一种字段类型,例如mp3,video,图片,和long字符串数据。二进制大对象,或BLOBs,字符大对象,或CLOBs,能够存储TB的数据。 LOB列有许多相关...
  • 下面有关Ext2和ext3文件系统的描述错误的是? ext2/ext3文件系统使用索引节点来记录文件信息,包含了一个文件的长度、创建及修改时间、权限、所属关系、磁盘的位置等信息 ext3增加了日志功能,即使...
  • 关于数据库主键和外键,索引

    千次阅读 2018-06-28 18:18:29
    关系型数据库的一条记录有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯一的,学号就是一个主键 ...
  • 【多选题】下列运算符的使用正确的有哪些( )【多选题】以下选项,... print(len(s))【多选题】以下的布尔代数运算正确的是( )【单选题】关于 Python 语句 P = –P,以下选项中描述正确的是________【单选题】下列不...
  • Oracle中索引的创建和使用

    万次阅读 2016-09-07 13:38:39
    1、通过创建唯一性索引,可以保证数据库表每一行数据的唯一性。 2、可以大大加快数据的检索速度,这也是创建索引的最主要的原因。 3、可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 4...
  • Hive索引

    千次阅读 2019-08-20 10:52:27
    Hive索引和关系型数据库索引又有些不同。例如:Hive没有关系型数据库键的概念。   在Hive有逻辑分区,而建立索引也是成为分区的另一种选择。建立索引可以帮助裁掉一张表的一些数据块,这样能够减少...
  • SQL Server索引优化——重复索引

    千次阅读 2019-02-20 18:06:00
    在写完《SQLServer索引优化——无用索引索引缺失》系列后,就想着写点关于发现重复索引的内容,刚好在Kimberly的博文发现了这篇,就偷懒了,直接将其翻译过来。 一直以来,对重复索引都有许多困惑,我想的最多...
  • Lucene倒排索引简述 之索引

    千次阅读 2018-09-27 09:57:42
    Lucene倒排索引的核心内容,索引表,你对这部分真的熟悉了吗?那你知道FST用什么地方吗?FST又存储了什么内容呢?有什么功能呢?关于Burst-Trie,你知道Lucene是如何采用它的思想来加速Lucene搜索性能的吗?
  • 今天看SQL方面的书,看到关于索引方面的讲解不太详细,弄的一头雾水,似懂非懂,特别是聚集索引和非聚集索引。深知索引对提高数据库查询速度的重要性,所以就花了半个下午的时间在网上Google了一些这方面的文章看...
  • 大数据技术原理与应用第4讲:分布式数据库HBase

    万次阅读 多人点赞 2019-05-17 22:21:54
    2下列对HBase数据模型的描述错误的是A.HBase执行更新操作时,会删除数据旧的版本,并生成一个新的版本 B.每个HBase表都由若干行组成,每个行由行键(row key)来标识 C.HBase列族支持动态扩展,可以很轻松地添加一...
  • 一、索引创建方式 前台方式 缺省情况下,当为一个集合创建索引时,这个操作将阻塞其他的所有操作。即该集合上的无法正常读写,直到索引创建完毕 任意基于所有数据库申请读或写锁都将等待直到前台完成索引创建操作 ...
  • MySQL 面试题

    万次阅读 多人点赞 2019-09-02 16:03:33
    索引。 锁。 事务和隔离级别。 因为 MySQL 还会有部分内容和运维相关度比较高,所以本文我们分成两部分【开发】【运维】两部分。 对于【开发】部分,我们需要掌握。 对于【运维】部分,更多考验开发的知识储备情况...
  • 1.堆组织表(HOT)和索引组织表(IOT)有什么区别? myisam使用的堆组织表(Heap Organize Table, HOT),没有聚集索引的概念,使用B-tree索引的存储格式,显示都是随机顺序。 innodb表是索引组织表(Index Organized Table,...
  • 一文搞懂MySQL索引(清晰明了)

    万次阅读 多人点赞 2021-02-02 17:30:43
    索引是对数据库表一列或多列的值进行排序的一种结构。MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 MySQL常用的索引结构(索引底层的数据结构)有:B-TREE ,B+TREE ,...
  • (一)深入浅出理解索引结构 实际上,您可以把索引理解为一种...下面,我们举例来说明一下聚集索引和非聚集索引的区别: 其实,我们的汉语字典的正文本身就是一个聚集索引。比如,我们要查“安”字,就会很自然...
  • mysql模拟题三

    千次阅读 2014-03-05 15:00:33
    一、单选题(共34分)  1、mysql唯一索引的... 2、下面关于索引描述中错误的一项是(C)(1分)  A.索引可以提高数据查询的速度  B.索引可以降低数据的插入速度  C.innodb存储引擎支持全文索引  D.删除索引的
  • 索引文档 通过使用 index API ,文档可以被 索引 —— 存储和使文档可被搜索 。 但是首先,我们要确定文档的位置。正如我们刚刚讨论的,一个文档的 _index 、 _type 和 _id 唯一标识一个文档。 我们可以...
  • 聚集索引和非聚集索引的区别

    千次阅读 2020-11-30 09:45:00
    作者:riemannriemann.blog.csdn.net/article/details/90324846一、深入浅出理解索引结构 实际上,可以把索引理解为一种特殊的目录。微软的S...
  • 以下我面试经常问的2道题..尤其针对觉得自己SQL SERVER 还不错的同志.....1. 什么是聚合索引(clustered index) / 什么是非聚合索引(nonclustered index)? 2. 聚合索引和非聚合索引有什么区别? 深入浅出理解索引结...
  • ElasticSearch--索引与类型

    万次阅读 2020-12-27 14:10:23
    版本变化 其他网址 ElasticSearch 索引与类型的前生今世 - 程序印象
  • 为时间字段加索引

    千次阅读 2020-03-24 18:29:58
    文章目录为时间字段加索引(待更进)一、问题1、描述:日期不一致2、原因:时区不同3、解决方法: 时区修改二、datetime和varchar类型效率比较1、背景2、开始三、时间字段加索引1、聚集索引2、非聚集索引3、时间字段...
  • 在Oracle中索引的使用

    万次阅读 2016-04-22 23:44:53
    一旦建立了索引,在用户表建立、更改和删除数据库时, Oracle就自动地维护索引。创建索引时,下列准则将帮助用户做出决定:  1) 索引应该在SQL语句的"where"或"and"部分涉及的表列(也称谓词
  • NoSQL 数据库索引 总结

    千次阅读 2017-06-03 16:49:14
    - 索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了;聚簇索引能提高多行检索的速度,而非聚簇索引对于单行的检索很快。 - 1.普通索引 - 这是最基本的索引...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 143,215
精华内容 57,286
关键字:

下面关于索引描述中错误的是