聚集索引:数据和索引信息是存放到一起的,表的数据行都存放在索引树的叶子节点上。
非聚集索引:叶子节点存放的实际上是存放数据库的指针,需要先查询一遍,得到索引文件,根据索引获取数据。
因此聚集索引中获取数据通常比非聚集索引快,但是更新的代价更大。
操作符说明:
SQL优化案例
-------------------------------------------------------------------------------------------------------------------------
函数索引:
SQL> EXPLAIN select * from ZHANGXIAOJIANG.EMPLOYEES where to_char(HIRE_DATE,'yyyy-mm-dd') ='2022-12-16';
1 #NSET2: [3, 500, 355]
2 #PRJT2: [3, 500, 355]; exp_num(10), is_atom(FALSE)
3 #SLCT2: [3, 500, 355]; exp11 = '2022-12-16'
4 #CSCN2: [3, 20000, 355]; INDEX33555620(EMPLOYEES); btr_scan(1)
已用时间: 1.152(毫秒). 执行号:0.
SQL> create index idx_func_emp on ZHANGXIAOJIANG.EMPLOYEES(to_char(HIRE_DATE,'yyyy-mm-dd'));
操作已执行
已用时间: 279.993(毫秒). 执行号:19509.
SQL> EXPLAIN select * from ZHANGXIAOJIANG.EMPLOYEES where to_char(HIRE_DATE,'yyyy-mm-dd') ='2022-12-16';
1 #NSET2: [1, 500, 355]
2 #PRJT2: [1, 500, 355]; exp_num(10), is_atom(FALSE)
3 #BLKUP2: [1, 500, 355]; idx_func_emp(EMPLOYEES)
4 #SSEK2: [1, 500, 355]; scan_type(ASC), idx_func_emp(EMPLOYEES), scan_range['2022-12-16','2022-12-16'], is_global(0)
已用时间: 1.512(毫秒). 执行号:0.
复合索引:
SQL> explain SELECT *
FROM zhangxiaojiang.EMPLOYEES
WHERE SALARY = 15000 and EMPLOYEE_ID > 9395;2 3
1 #NSET2: [3, 248, 355]
2 #PRJT2: [3, 248, 355]; exp_num(10), is_atom(FALSE)
3 #SLCT2: [3, 248, 355]; (EMPLOYEES.SALARY = var1 AND EMPLOYEES.EMPLOYEE_ID > var2) SLCT_PUSHDOWN(TRUE)
4 #CSCN2: [3, 20000, 355]; INDEX33555620(EMPLOYEES) NEED_SLCT(TRUE); btr_scan(1)
已用时间: 1.755(毫秒). 执行号:0.
SQL> create index emp_salary_id ON ZHANGXIAOJIANG.EMPLOYEES(SALARY,EMPLOYEE_ID);
操作已执行
已用时间: 84.182(毫秒). 执行号:19511.
SQL> explain SELECT *
FROM zhangxiaojiang.EMPLOYEES
WHERE SALARY = 15000 and EMPLOYEE_ID > 9395;2 3
1 #NSET2: [1, 248, 355]
2 #PRJT2: [1, 248, 355]; exp_num(10), is_atom(FALSE)
3 #BLKUP2: [1, 248, 355]; emp_salary_id(EMPLOYEES)
4 #SSEK2: [1, 248, 355]; scan_type(ASC), emp_salary_id(EMPLOYEES), scan_range((exp_cast(15000),exp_cast(9395)),(exp_cast(15000),max)), is_global(0)
已用时间: 1.491(毫秒). 执行号:0.
SQL>
创建位图索引: 位图索引适用于低基数列(即列中不同值的数量较少),例如性别、状态
SQL> EXPLAIN select * from ZHANGXIAOJIANG.PROJECTS where status='Planning' and BUDGET > 3600000;
1 #NSET2: [3, 1405, 224]
2 #PRJT2: [3, 1405, 224]; exp_num(8), is_atom(FALSE)
3 #SLCT2: [3, 1405, 224]; (PROJECTS.STATUS = 'Planning' AND PROJECTS.BUDGET > var1) SLCT_PUSHDOWN(TRUE)
4 #CSCN2: [3, 20000, 224]; INDEX33555622(PROJECTS) NEED_SLCT(TRUE); btr_scan(1)
已用时间: 0.796(毫秒). 执行号:0.
SQL> CREATE BITMAP INDEX ZHANGXIAOJIANG.IDX_PRO ON ZHANGXIAOJIANG.PROJECTS(status);
操作已执行
已用时间: 444.573(毫秒). 执行号:19513.
SQL> EXPLAIN select * from ZHANGXIAOJIANG.PROJECTS where status='Planning' and BUDGET > 3600000;
1 #NSET2: [2, 1405, 224]
2 #PRJT2: [2, 1405, 224]; exp_num(8), is_atom(FALSE)
3 #SLCT2: [2, 1405, 224]; PROJECTS.BUDGET > var1
4 #BLKUP2: [2, 1497, 224]; INDEX33555622(PROJECTS)
5 #BMCVT: [2, 1497, 224]
6 #BMSEK: [2, 1497, 224]; scan_type(ASC), INDEX33555688(BM$_33555687), scan_range[('Planning',null2),('Planning',max))
已用时间: 1.194(毫秒). 执行号:0.
SQL>
想更多了解达梦数据库,请关注达梦云适配中心。
达梦社区地址:https://eco.dameng.com
01-31
1081

07-15
4920
