表数据200万,使用一个字段查询,该字段上有索引,客户说没有使用索引。
1.要表结构
create table STAT_SALE
(
OIDD NUMBER(20) not null,
CODE VARCHAR2(20) not null,
SHOPCODE VARCHAR2(20) not null,
SHOPNAME VARCHAR2(50) not null,
GOODSCODE VARCHAR2(20) not null,
GOODSNAME VARCHAR2(100),
...
create index U_STATSALE_GOODSCODE on STAT_SALE (GOODSCODE) ...
2.要查询语句
select * from stat_sale a where a.goodscode=290957
聪明的你现在应该可以看出没有使用索引的原因了。
愚蠢的我没有发现。
3.执行
select count(*) from stat_sale;
select num_rows from user_tables where table_name = 'STAT_SALE';
2086984 和 null
分析是没有analyze的原因
3.analyze
analyze table STAT_SALE estimate statistics sample 5000 rows;
analyze index U_STATSALE_GOODSCODE compute statistics;
analyze table stat_sale estimate statistics sample 5000 rows for all columns;
4.再执行上述语句看执行计划
仍然没有使用索引 。
faint.
此时才发现,类型是varchar2,而=后面是数字,发生了类型转换,没有使用索引。
数字加上''后,使用了索引。