注册
组合索引在 DM 中的使用情况
专栏/金的探索记录/ 文章详情 /

组合索引在 DM 中的使用情况

2021/01/20 2103 0 0
摘要 在实际工作中,为了提高表查询的效率,我们会在表上创建各种索引。但是,有时候我们虽然创建了组合索引,查询效率并没有提高,这是为什么呢?本文将带大家一探究竟。

在实际工作中,为了提高表查询的效率,我们会在表上创建各种索引。但是,有时候我们虽然创建了组合索引,查询效率并没有提高,这是为什么呢?本文将带大家一探究竟。

实验背景:

  • 确认数据库版本:

DM Database Server x64V7.1.6.46-Build(2018.02.08-89107)ENT

  • 创建测试用表并录入测试数据

表结构如下:

create table TEST(id int primary key, student_name varchar(20),math int,english int,science int)

并录入 10000 条测试数据。

  • 创建索引
create index "index_test" on "SYSDBA"."TEST"("MATH" ASC,"ENGLISH" ASC,"SCIENCE" ASC) STORAGE(ON "MAIN");

这个组合索引中,列的顺序为 MATH,ENGLISH,SCIENCE。

实验考虑以下四种情况:

一. 3 个字段都是等值查询,例如:

select * from "SYSDBA"."TEST" where MATH = 60 and SCIENCE = 60 and ENGLISH = 60;

查询执行计划如下:

1.png

这里是直接从索引中调取的结果。

二. MATH 不等值,ENGLISH 和 SCIENCE 两列等值,例如:

select * from "SYSDBA"."TEST" where MATH not in 60 and ENGLISH = 60 and SCIENCE=60;

通过执行计划可以看出并没有调用到索引。

2.png

三. MATH 和 ENGLISH 等值,第三列 SCIENCE 不等值,例如:

select * from "SYSDBA"."TEST" where MATH = 60 and ENGLISH =60 and SCIENCE not in 60;

执行计划有调用到 index_test 索引查询出 MATH=60 and ENGLISH=60 的所有值,再从里面选择出 science<>60 的值。

3.png

四、MATH 等值,后面两列不等值,例如:

select * from "SYSDBA"."TEST" where MATH = 60 and ENGLISH not in 60 and SCIENCE not in 60;

4.png

从执行计划来看也是没有利用到索引的。

通过这几种情况,我们可以得到组合索引的几个特点:

  1. 如果查询中经常会利用多个字段进行组合定位,我们可以在这几个字段上建立组合索引。

  2. 在做等值查询的时候,组合索引中各个列的顺序是无关紧要的,这个从实验结果一可以看出,列的顺序变化之后还能是正常的调用索引。

  3. 在做非等值查询的时候,需保证等值列在前,非等值列在后。从实验结果二和三的差别就可以看出来,这就要求我们在创建组合索引时关注列的顺序,需要按照实际查询的需求来建立索引。

  4. 查询时只能利用一个非等值字段,这就解释了为什么实验四中并没有调用到组合索引。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服