orcale 函数 索引问题

gxw19820801 2011-07-06 02:01:31
项目中 有个大数据 180万左右 要根据日期查询 比较慢 ,因此我建了一个 函数索引


create index inport_tim_index on POUND_BILL (to_char(INPORT_TIM),'yyyy-mm-dd'));


然后 用语句

select count(*) from POUND_BILL where (to_char("INPORT_TIM",'yyyy-mm-dd'))='2011-03-02'
查询 结果查询速度 加索引和没加索引没有区别 ,请问是什么原因

还有 我使用的是toad 我想看看sql执行索引了没有
...全文
193 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
hudingchen 2011-07-07
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 luoyoumou 的回复:]

-- *03) 日期字段的where 条件不要用 between ... and ...
-- 其原因,请看:
http://topic.csdn.net/u/20110324/09/12bf9066-57c8-4cdf-8481-d9efad646c5c.html
[/Quote]

你这个有点误导人了~~,between..and 就是等价 >= <=,你偏要和>= <比较,俩个本来不等价,between没有错,是使用的人用错了方法
luoyoumou 2011-07-07
  • 打赏
  • 举报
回复
-- 给你看 1700多万数据的大表上的两个SQL语句:
hll@SZTYORA> select count(*) from mobilefrends;

COUNT(*)
----------
17200235

已用时间: 00: 00: 01.40

执行计划
----------------------------------------------------------
Plan hash value: 3731074549

----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 12411 (3)| 00:02:29 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | INDEX FAST FULL SCAN| MOBILEFRENDS_CDATE_IDX | 16M| 12411 (3)| 00:02:29 |
----------------------------------------------------------------------------------------


统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

hll@SZTYORA> select count(*) from mobilefrends
2 where cdate>=trunc(sysdate-1) and cdate<trunc(sysdate);

COUNT(*)
----------
7481

已用时间: 00: 00: 00.34

执行计划
----------------------------------------------------------
Plan hash value: 2668176725

---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8 | 3 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 8 | | |
|* 2 | FILTER | | | | | |
|* 3 | INDEX RANGE SCAN| MOBILEFRENDS_CDATE_IDX | 51 | 408 | 3 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter(TRUNC(SYSDATE@!-1)<TRUNC(SYSDATE@!))
3 - access("CDATE">=TRUNC(SYSDATE@!-1) AND "CDATE"<TRUNC(SYSDATE@!))


统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed

hll@SZTYORA> select count(*) from mobilefrends
2 where to_char(cdate,'yyyy-mm-dd') = to_char(sysdate-1,'yyyy-mm-dd');

COUNT(*)
----------
7481

已用时间: 00: 01: 25.87

执行计划
----------------------------------------------------------
Plan hash value: 3731074549

------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8 | 14371 (16)| 00:02:53 |
| 1 | SORT AGGREGATE | | 1 | 8 | | |
|* 2 | INDEX FAST FULL SCAN| MOBILEFRENDS_CDATE_IDX | 169K| 1324K| 14371 (16)| 00:02:53 |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - filter(TO_CHAR(INTERNAL_FUNCTION("CDATE"),'yyyy-mm-dd')=TO_CHAR(SYSDATE@!-1,'yyyy
-mm-dd'))


统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
0 consistent gets
0 physical reads
0 redo size
0 bytes sent via SQL*Net to client
0 bytes received via SQL*Net from client
0 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
luoyoumou 2011-07-07
  • 打赏
  • 举报
回复
-- 日期字段的查询问题:
-- *01) 日期字段,我从来不会创建函数索引!
-- *02) 我会在日期字段创建普通的索引,然后在where 条件中保持字段的原型:
-- 例如:如果我要查询一张表(有 date_colum 日期字段,且在此字段有相应的索引),2011年5月1号的数据
-- 我会习惯用:
where date_column>=to_date('2011-05-01')
and date_column <to_date('2011-05-02');

-- *03) 日期字段的where 条件不要用 between ... and ...
-- 其原因,请看:
http://topic.csdn.net/u/20110324/09/12bf9066-57c8-4cdf-8481-d9efad646c5c.html
gxw19820801 2011-07-07
  • 打赏
  • 举报
回复
一般索引可以使用 ,就是函数索引 不好用啊
amdgaming 2011-07-06
  • 打赏
  • 举报
回复

不要建 函数索引 就一般 索引 试试


qchisgood 2011-07-06
  • 打赏
  • 举报
回复
很好,学习了
HDSHAOWH 2011-07-06
  • 打赏
  • 举报
回复
估计是转换索引失效了
老黎 2011-07-06
  • 打赏
  • 举报
回复
很好,学习了
hudingchen 2011-07-06
  • 打赏
  • 举报
回复
可以不使用函数索引,这么写看看:

SELECT COUNT(*)
FROM POUND_BILL
WHERE INPORT_TIM BETWEEN TRUNC(SYSDATE) AND TRUNC(SYSDATE) + 0.99999
gxw19820801 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hanzs 的回复:]

可以使用hint强制走索引,再分析下计划,比较两种方式的计划有什么差别

也许oracle认为count(*)走索引与不走索引的cost是差不多的
[/Quote]

ok了 强行走索引 速度很快

不知道为什么 orcale 不自动走索引
hanzs 2011-07-06
  • 打赏
  • 举报
回复
可以使用hint强制走索引,再分析下计划,比较两种方式的计划有什么差别

也许oracle认为count(*)走索引与不走索引的cost是差不多的
gxw19820801 2011-07-06
  • 打赏
  • 举报
回复
索引 直接就没执行 ,为什么
zehui11 2011-07-06
  • 打赏
  • 举报
回复
做下表分析,然后执行看看执行计划
老黎 2011-07-06
  • 打赏
  • 举报
回复
这个要关注
gxw19820801 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hanzs 的回复:]

toad没用过,应该有查看执行计划之类的菜单的,找找看

pl/sql中直接在查询窗口中按F5就可以显示执行计划了

实在不行sqlplus中执行explain plan for select 。。。
[/Quote] 谢谢
hanzs 2011-07-06
  • 打赏
  • 举报
回复
toad没用过,应该有查看执行计划之类的菜单的,找找看

pl/sql中直接在查询窗口中按F5就可以显示执行计划了

实在不行sqlplus中执行explain plan for select 。。。

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧