暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DM8 在 SQL 语句中使用索引

原创 DM8官档 2023-06-02
645

如果 SQL 语句想使用某一个索引,则 SQL 语句的查询项和 WHERE 子句的过滤项中必须包含该索引的全部索引键。当同时包含了多个索引的索引键时,系统会选择一个最优的索引进行查询。例如:SQL 语句“SELECT A FROM T WHERE B=1; ”会使用建立在(A,B)列上的索引。

总体来说,最少的查找即可得到所需数据,即为最优索引。

下面用具体的示例进行介绍。

数据准备:

CREATE TABLE T2 (ID int,NAME varchar(20),DEPARTMENT varchar(20),SALARY INT);
CREATE CLUSTER INDEX S21 on T2(ID); //聚集索引
CREATE INDEX S22 on T2(NAME,DEPARTMENT);
CREATE INDEX S23 on T2(NAME);
CREATE INDEX S24 on T2(DEPARTMENT);
CREATE INDEX S25 on T2(SALARY);

例 1 使用聚集索引 S21

EXPLAIN SELECT SALARY FROM T2 WHERE ID=10;

1   #NSET2: [1, 1, 8]
2     #PRJT2: [1, 1, 8]; exp_num(1), is_atom(FALSE)
3       #CSEK2: [1, 1, 8]; scan_type(ASC), S21(T2), scan_range[10,10]

例 2 使用非聚集索引 S22

查询语句想使用索引 S22,则 SELECT 查询项和 WHERE 子句过滤项需包含 S22 的全部索引键 NAME 和 DEPARTMENT。

EXPLAIN SELECT DEPARTMENT FROM T2 WHERE NAME LIKE'%Zhang' AND DEPARTMENT='A部门';
1   #NSET2: [1, 1, 96]
2     #PRJT2: [1, 1, 96]; exp_num(1), is_atom(FALSE)
3       #SLCT2: [1, 1, 96]; (T2.DEPARTMENT = 'A部门' AND T2.NAME LIKE '%Zhang')
4         #SSCN: [1, 1, 96]; S22(T2)
或
EXPLAIN SELECT DEPARTMENT FROM T2 WHERE NAME='Zhang San';
1   #NSET2: [1, 1, 96]
2     #PRJT2: [1, 1, 96]; exp_num(1), is_atom(FALSE)
3       #SSEK2: [1, 1, 96]; scan_type(ASC), S22(T2), scan_range[('Zhang San',min),('Zhang San',max))

例 3 先使用非聚集索引 S23,再使用聚集索引

首先,在 SSEK 中使用 S23 非聚集索引进行扫描定位,得到 NAME;

其次,因为 SELECT * 中查询项太多,需要在 BLKUP2 中通过 S23 回到聚集索引上进行二次查找,得到*中的其它数据。

EXPLAIN SELECT * FROM T2 WHERE NAME='Zhang San';
1   #NSET2: [1, 1, 116]
2     #PRJT2: [1, 1, 116]; exp_num(5), is_atom(FALSE)
3       #BLKUP2: [1, 1, 116]; S23(T2)
4         #SSEK2: [1, 1, 116]; scan_type(ASC), S23(T2), scan_range['Zhang San','Zhang San']
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论