oracle的SQL索引使用

oracle数据库:

1、select * from table where a=a and b=b and c=c and d=d;
这里我建立了一个a,b,c,d的复合索引,但如果使用:
select * from table where a=a and b=b;
进行查询时第一次很慢,第二次之后再查就快了,应该是使用了数据库的缓冲区进行的查询,那这个abcd的复合索引对于where a=a and b=b;就不起作用了么?如果有若干个SQL:
select * from table where a=a;
select * from table where a=a and b=b;
select * from table where a=a and b=b and c=c;
select * from table where a=a and b=b and c=c and d=d;
等等,总不能对每个where条件建立一个索引?

2、有没有SQL可以查询某个SQL执行时是否使用索引了?

谢谢!
where a=变量a;
where a=变量a and b=变量b;
where a=变量a and b=变量b and c=变量c;
where a=变量a and b=变量b and c=变量c and d=变量d;
这些都可以用abcd这个复合索引?
但从现在执行的时间来看,a=变量a这里是没有用到索引的,不知道有什么方法可以让它走索引么?
最新回答
浮生远离

2022-10-25 03:54:47

1,第一次查询慢,以后就快了,主要是因为第一次要进行磁盘操作,以后数据被cache到内存中了,不在操作磁盘,所以就快了。
2,对于你说的这四种查询,where条件中的a=a估计你是举例子这样写的吧。实际上应该是a=变量A。其他的b,c,d也是这样。那么这种语句都是可以利用你说的复合索引的。如果是RBO优化器,这四句都应该用索引。但是oracle现在推荐的CBO优化器不能保证你都走索引。
3,到底用没用索引,你可以从v$sqlaera中找到你的语句对应的hash_value,然后从v$sql_plan中找到语句的执行计划,通过执行计划确认你的语句是不是使用了索引。
具体语句你可以类似如下写法:

select hash_value,sql_text from v$sqlarea where upper(sql_text) like '%你需要查找的sql语句的特征片段%'

select * from v$sql_plan where hash_value = 上一句查到的hash_value
姐的智商都拿去卖萌了

2021-11-05 21:04:14

是不是利用了索引你可以看一下这个语句的查询计划,至于如何获取执行计划,查一下,很多的!假如真如你所说没有用到索引,可能是由于你的查询有话器配置参数有问题,或者统计信息已经过时,原因可能有很多,当然你可以使用很多的方法建议查询优化器使用索引,其中包括提示、存储提纲、sql计划基线等,如果还是不懂,去网上查吧,网络是个很好的学习环境。
恋初雪

2023-03-30 23:15:14

方法如下:
Oracle中建立索引,会提高查询速度: create index 索引名 on 表名(列名);
例如:
create index index_userid on tbl_detail(userid);
如何找数据库表的主键字段的名称?
SELECT * FROM user_constraints WHERE CONSTRAINT_TYPE='P' and table_name='AAA'; select * from dba_cons_columns where CONSTRAINT_NAME='SYS_AAA';
Oracle 在创建主键(可以不加constraint SYS_AAA),会为库表自动创建索引,
索引的列为主键列。 并且当库表某些列名或者库表名改变时候,
Oracle自动创建的索引SYS_AAA,中的索引列也会自动更新(类似于视图),并且SYS_AAA会与名字更改后的库表还是保持索引关系。 关键系统库表: desc dba_constraints desc dba_cons_columns
desc dba_indexes desc dba_ind_columns desc DBA_TAB_COLUMNS
例子1:更改库表的列名
ALTER TABLE AAA RENAME COLUMN ID TO AAA_ID; create table AAA ( ID NUMBER(8), NAME CHAR(20),
constraint SYS_AAA primary key(ID) );
//查找约束名字
select c.CONSTRAINT_NAME,c.table_name,cc.COLUMN_NAME from user_constraints c, user_cons_columns cc
where c.constraint_name=cc.constraint_name and c.table_name ='AAA' AND C.CONSTRAINT_TYPE='P';
//查找索引
select index_name,index_type,uniqueness from user_indexes where table_name='AAA'; INDEX_NAME INDEX_TYPE UNIQUENES
伤-蔓延

2023-03-30 04:28:11

....个人认为貌似和索引的关系不是很大.
因为,系统要解析新的SQL语句肯定要花时间的.
相关内容 我觉得可能要看下 Oracle DB 里面关于 硬解析和软解析的描述.