什么时候使用组合索引
答案:2 悬赏:80
解决时间 2021-03-21 19:58
- 提问者网友:涼初透
- 2021-03-20 20:15
什么时候使用组合索引
最佳答案
- 二级知识专家网友:茫然不知崩溃
- 2021-03-20 20:38
在Oracle中可以创建组合索引,即同时包含两个或两个以上列的索引。
在组合索引的使用方面,Oracle有以下特点:
1.当使用基于规则的优化器(RBO)时,只有当组合索引的前导列出现在SQL语句的where子句中时,才会使用到该索引;
2.在使用Oracle9i之前的基于成本的优化器(CBO)时, 只有当组合索引的前导列出现在SQL语句的where子句中时,才可能会使用到该索引,这取决于优化器计算的使用索引的成本和使用全表扫描的成本,Oracle会自动选择成本低的访问路径(请见下面的测试1和测试2);
3.从Oracle9i起,Oracle引入了一种新的索引扫描方式——索引跳跃扫描(index skip scan),这种扫描方式只有基于成本的优化器(CBO)才能使用。这样,当SQL语句的where子句中即使没有组合索引的前导列,并且索引跳跃扫描的成本低于其他扫描方式的成本时,Oracle就会使用该方式扫描组合索引(请见下面的测试3);
4.Oracle优化器有时会做出错误的选择,因为它再“聪明”,也不如我们SQL语句编写人员更清楚表中数据的分布,在这种情况下,通过使用提示(hint),我们可以帮助Oracle优化器作出更好的选择。
在组合索引的使用方面,Oracle有以下特点:
1.当使用基于规则的优化器(RBO)时,只有当组合索引的前导列出现在SQL语句的where子句中时,才会使用到该索引;
2.在使用Oracle9i之前的基于成本的优化器(CBO)时, 只有当组合索引的前导列出现在SQL语句的where子句中时,才可能会使用到该索引,这取决于优化器计算的使用索引的成本和使用全表扫描的成本,Oracle会自动选择成本低的访问路径(请见下面的测试1和测试2);
3.从Oracle9i起,Oracle引入了一种新的索引扫描方式——索引跳跃扫描(index skip scan),这种扫描方式只有基于成本的优化器(CBO)才能使用。这样,当SQL语句的where子句中即使没有组合索引的前导列,并且索引跳跃扫描的成本低于其他扫描方式的成本时,Oracle就会使用该方式扫描组合索引(请见下面的测试3);
4.Oracle优化器有时会做出错误的选择,因为它再“聪明”,也不如我们SQL语句编写人员更清楚表中数据的分布,在这种情况下,通过使用提示(hint),我们可以帮助Oracle优化器作出更好的选择。
全部回答
- 1楼网友:专属的偏见
- 2021-03-20 21:35
innodb按照主键进行聚集,如果没有定义主键,innodb会试着使用唯一的非空索引来代替。如果没有这种索引,innodb就会定义隐藏的主键然后在上面进行聚集。
所以,对于 聚集索引 来说,你创建主键的时候,自动就创建了主键的聚集索引。
而普通索引(非聚集索引)的语法,大多数数据库都是通用的:
create index syntax
create [unique|fulltext|spatial] index index_name
[index_type]
on tbl_name (index_col_name,...)
[index_type]
index_col_name:
col_name [(length)] [asc | desc]
index_type:
using {btree | hash | rtree}
[java] view plaincopy
-- 创建无索引的表格
create table testnopk (
id int not null,
name varchar(10)
);
-- 创建普通索引
create index idx_testnopk_name on testnopk (name);
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯