在一个优化器为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
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
关键是我做这个题目 被人说错了很多
我的答案:
CDE不行 其它都可以公司的人扫了一眼 说只看了前面四个 就都错了
我很不服气
求大虾们帮我解答下 究竟那些不可以 如果不可以又是什么原因
尤其是前面四个问题
谢谢
B,虽然条件中两个字段都是主键的一部分,但是因为该表是多值联合主键,而oracle在给表建主键索引时,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但如果顺序不对或者其中某一列上应用了函数,也不会应用到索引。解释A属个人理解,不一定正确。
A to_char(logtime,’yyyy-mm-dd hh24’) 没有建索引
B 联合主键,所以要写全了才走索引
C 同上
D 同1
E 同1
F 有like
G 有order
C 该列建了索引
G order by只会影响结果排序,查询还是会应用到索引
C 该列建了索引 呵呵 刚才没看到
G 恩 order by不影响索引 ,和max,min一样
C:索引起作用。
G:如果LOGTIME字段是必填项,索引也可以起作用。
关于A,需要写成'YYYY-MM-DD'才走索引