一个关于索引的问题 我搞不清楚了

时间:2023-02-22 14:20:53
在一个优化器为COST的Oracle数据库中有表CELLSCHCTRL,结构如下:
 CREATE TABLE CELLSCHCTRL
(
  CITYID            VARCHAR2(10 BYTE),
  CITYNAME          VARCHAR2(16 BYTE),
  DEVICENAME        VARCHAR2(100 BYTE),
  BSCNAME           VARCHAR2(25 BYTE),
  CELLNAME          VARCHAR2(100 BYTE),
  OCCURDATE         DATE,
  LOGTIME           DATE,
  CELL_CI           VARCHAR2(15 BYTE),
  CELL_LAC          VARCHAR2(15 BYTE),
  DATASERVER_IP     VARCHAR2(20 BYTE),
  CELL_SCH_CTRL001  VARCHAR2(100 BYTE),
  CELL_SCH_CTRL002  NUMBER,
  CELL_SCH_CTRL003  NUMBER,
  CELL_SCH_CTRL004  NUMBER,
  CELL_SCH_CTRL005  NUMBER
)
--建立主键
ALTER TABLE CELLSCHCTRL ADD (
  CONSTRAINT CELLSCHCTRL_0901_PK
 PRIMARY KEY
 (CITYID, CITYNAME, BSCNAME, LOGTIME, CELL_CI, CELL_LAC)
--建立函数索引
CREATE INDEX IDX_CELLSCHCTRL_LOGTIME_DAY ON CELLSCHCTRL
(TO_CHAR("LOGTIME",'YYYY-MM-DD'))
--建立函数索引
CREATE INDEX IDX_CELLSCHCTRL_LOGTIME_HOUR ON CELLSCHCTRL
(TO_CHAR("LOGTIME",'YYYY-MM-DD HH24'))
--建立索引
CREATE INDEX IDX_CELLSCHCTRL_CELL_CI ON CELLSCHCTRL (CELL_CI)
--建立索引
CREATE INDEX IDX_CELLSCHCTRL_CELLNAME ON CELLSCHCTRL (CELLNAME)
该表经过分析后,下列哪些语句不能用到索引?为什么?
A、Select * from CELLSCHCTRL
where to_char(logtime,’yyyy-mm-dd hh24’) > ‘2009-6-1’
 
B、select * from CELLSCHCTRL  
where CITYID =’0431’ and  CELL_LAC = 19876   

C、select * from CELLSCHCTRL Where CELL_CI = 62589 

D、select  * from CELLSCHCTRL
Where OCCURDATE = to_date(‘2009-6-1’,’YYYY-MM-DD’)

E、Select * from CELLSCHCTRL
where logtime > to_date(‘2009-6-1’,’YYYY-MM-DD’)

F、select * from CELLSCHCTRL Where cellname like ‘%WUMao%’ 

G、select  * from CELLSCHCTRL Where cellname = ‘YIDONGSHUNIU’ORDER BY LOGTIME 

17 个解决方案

#1


D,E 函数参数不同

#2


恩  还有吗?
关键是我做这个题目 被人说错了很多
我的答案:
CDE不行   其它都可以

公司的人扫了一眼  说只看了前面四个 就都错了
我很不服气  
求大虾们帮我解答下   究竟那些不可以  如果不可以又是什么原因
尤其是前面四个问题
谢谢

#3


该表经过分析后,下列哪些语句不能用到索引?为什么? 

用不用到索引你自己可以去看执行计划, 是否使用索引与多个因素有关系,比如:表的数据量, 查询出来的记录数和总记录数的大概百分比, 查询条件的使用, 数据库初始化参数的设置等等因素有关。

所以这个问题估计没人能回复你一个准确的答案的,你自己可以去看执行计划也就知道是不是使用索引了。

#4


A B D E F

#5


你好  能解释下吗  

#6


引用 4 楼 shiyiwan 的回复:
A B D E F

你好  能解释下A  B  这两项不能用索引的原因吗?

#7


A,因为使用了 > 符号,在比较时候单个记录会依次比较,若换成 >= 会应用到索引.
B,虽然条件中两个字段都是主键的一部分,但是因为该表是多值联合主键,而oracle在给表建主键索引时,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但如果顺序不对或者其中某一列上应用了函数,也不会应用到索引。

解释A属个人理解,不一定正确。

#8


都不能
A to_char(logtime,’yyyy-mm-dd  hh24’) 没有建索引
B 联合主键,所以要写全了才走索引
C 同上
D 同1
E 同1
F 有like
G 有order 

#9


好的  谢谢你的解答  我再搜索下相关的资料 帖子我会尽快确定后立即结的。

#10


A 他建了函数索引
C 该列建了索引
G order by只会影响结果排序,查询还是会应用到索引
引用 7 楼 shiyiwan 的回复:
A,因为使用了 > 符号,在比较时候单个记录会依次比较,若换成 >= 会应用到索引. 
B,虽然条件中两个字段都是主键的一部分,但是因为该表是多值联合主键,而oracle在给表建主键索引时,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但如果顺序不对或者其中某一列上应用了函数,也不会应用到索引。 

解释A属个人理解,不一定正确。

#11


引用 10 楼 shiyiwan 的回复:
A 他建了函数索引 
C 该列建了索引 
G order by只会影响结果排序,查询还是会应用到索引 

引用 7 楼 shiyiwan 的回复:
A,因为使用了 > 符号,在比较时候单个记录会依次比较,若换成 >= 会应用到索引. 
B,虽然条件中两个字段都是主键的一部分,但是因为该表是多值联合主键,而oracle在给表建主键索引时,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但…

A 他建了函数索引 我试了一下 把Select * 改成 Select logtime(任意字段),索引走了 不知道为什么
C 该列建了索引  呵呵 刚才没看到
G 恩 order by不影响索引 ,和max,min一样

#12


A:这个索引也起作用,但速度不如>=快。
C:索引起作用。
G:如果LOGTIME字段是必填项,索引也可以起作用。

#13


引用 8 楼 Robin_Ares 的回复:
都不能
A to_char(logtime,’yyyy-mm-ddhh24’) 没有建索引
B 联合主键,所以要写全了才走索引
C 同上
D 同1
E 同1
F 有like
G 有order


呃不太会 帮顶

#14


晕哦
关于A,需要写成'YYYY-MM-DD'才走索引

#15


 测试了下 发现B和G走了索引。C也不走索引因为CELL_CI字段是varchar2类型 。CELL_CI = 62589 不会走索引,CELL_CI = ‘62589’ 这样会走索引。 

#16


引用 15 楼 muou2008 的回复:
测试了下 发现B和G走了索引。C也不走索引因为CELL_CI字段是varchar2类型 。CELL_CI = 62589 不会走索引,CELL_CI = ‘62589’ 这样会走索引。



支持经过测试的。

#17


请教楼上的几位仁兄  如何查看 语句是否 使用到了索引了呢?如果把这个方法教我了  以后此类的问题就难不倒我了

谢谢

#1


D,E 函数参数不同

#2


恩  还有吗?
关键是我做这个题目 被人说错了很多
我的答案:
CDE不行   其它都可以

公司的人扫了一眼  说只看了前面四个 就都错了
我很不服气  
求大虾们帮我解答下   究竟那些不可以  如果不可以又是什么原因
尤其是前面四个问题
谢谢

#3


该表经过分析后,下列哪些语句不能用到索引?为什么? 

用不用到索引你自己可以去看执行计划, 是否使用索引与多个因素有关系,比如:表的数据量, 查询出来的记录数和总记录数的大概百分比, 查询条件的使用, 数据库初始化参数的设置等等因素有关。

所以这个问题估计没人能回复你一个准确的答案的,你自己可以去看执行计划也就知道是不是使用索引了。

#4


A B D E F

#5


你好  能解释下吗  

#6


引用 4 楼 shiyiwan 的回复:
A B D E F

你好  能解释下A  B  这两项不能用索引的原因吗?

#7


A,因为使用了 > 符号,在比较时候单个记录会依次比较,若换成 >= 会应用到索引.
B,虽然条件中两个字段都是主键的一部分,但是因为该表是多值联合主键,而oracle在给表建主键索引时,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但如果顺序不对或者其中某一列上应用了函数,也不会应用到索引。

解释A属个人理解,不一定正确。

#8


都不能
A to_char(logtime,’yyyy-mm-dd  hh24’) 没有建索引
B 联合主键,所以要写全了才走索引
C 同上
D 同1
E 同1
F 有like
G 有order 

#9


好的  谢谢你的解答  我再搜索下相关的资料 帖子我会尽快确定后立即结的。

#10


A 他建了函数索引
C 该列建了索引
G order by只会影响结果排序,查询还是会应用到索引
引用 7 楼 shiyiwan 的回复:
A,因为使用了 > 符号,在比较时候单个记录会依次比较,若换成 >= 会应用到索引. 
B,虽然条件中两个字段都是主键的一部分,但是因为该表是多值联合主键,而oracle在给表建主键索引时,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但如果顺序不对或者其中某一列上应用了函数,也不会应用到索引。 

解释A属个人理解,不一定正确。

#11


引用 10 楼 shiyiwan 的回复:
A 他建了函数索引 
C 该列建了索引 
G order by只会影响结果排序,查询还是会应用到索引 

引用 7 楼 shiyiwan 的回复:
A,因为使用了 > 符号,在比较时候单个记录会依次比较,若换成 >= 会应用到索引. 
B,虽然条件中两个字段都是主键的一部分,但是因为该表是多值联合主键,而oracle在给表建主键索引时,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但…

A 他建了函数索引 我试了一下 把Select * 改成 Select logtime(任意字段),索引走了 不知道为什么
C 该列建了索引  呵呵 刚才没看到
G 恩 order by不影响索引 ,和max,min一样

#12


A:这个索引也起作用,但速度不如>=快。
C:索引起作用。
G:如果LOGTIME字段是必填项,索引也可以起作用。

#13


引用 8 楼 Robin_Ares 的回复:
都不能
A to_char(logtime,’yyyy-mm-ddhh24’) 没有建索引
B 联合主键,所以要写全了才走索引
C 同上
D 同1
E 同1
F 有like
G 有order


呃不太会 帮顶

#14


晕哦
关于A,需要写成'YYYY-MM-DD'才走索引

#15


 测试了下 发现B和G走了索引。C也不走索引因为CELL_CI字段是varchar2类型 。CELL_CI = 62589 不会走索引,CELL_CI = ‘62589’ 这样会走索引。 

#16


引用 15 楼 muou2008 的回复:
测试了下 发现B和G走了索引。C也不走索引因为CELL_CI字段是varchar2类型 。CELL_CI = 62589 不会走索引,CELL_CI = ‘62589’ 这样会走索引。



支持经过测试的。

#17


请教楼上的几位仁兄  如何查看 语句是否 使用到了索引了呢?如果把这个方法教我了  以后此类的问题就难不倒我了

谢谢