●日期类型如何索引?●

牧牛人软件 2005-08-05 07:02:10
因为我们习惯的日期格式是:YYYY-MM-DD,所以我这样来查询 WHERE to_char(ACCDATE,'YYYY-MM-DD') ='2005-08-01',尽管ACCDATE有索引,但是极慢!


有人告诉我这样做:
=============================================

你可以创建一个function based index.

针对 to_char(ACCDATE,'YYYY-MM-DD') 创建index.

要求:
query_rewrite_enabled = true;
compatible 好像要大于8.1.5.0.0
建索引的表一定要分析
============================================

我不明白。
...全文
1261 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
牧牛人软件 2005-08-06
  • 打赏
  • 举报
回复
alter session set nls_date_format='YYYY-MM-DD';

1。是针对整个数据库的用户,还是一个用户,因为我不想影响其他用户的使用。
2。set nls_date_format设置后ACCDATE='2005-08-01'能精确查到吗?注意ACCDATE有分秒的。
牧牛人软件 2005-08-06
  • 打赏
  • 举报
回复
谢谢各位的解答!

但是我有个困难在其中,因为我做了一个SQL TOOLS通用工具是用以帮助非专业人员编制SQL的,做成的SQL如:select a,b from table where dat=:Var0 and amt=:Var1。

用户输入日期、金额后,将:Var0、:Var1替换,
做成 WHERE ACCDATE>=to_date('2005-08-01','yyyy-mm-dd')
AND ACCDATE<to_date('2005-08-02','yyyy-mm-dd')
就不太通用。

njhart2003() :那是指创建一个基于函数的索引,如何建立?
njhart2003 2005-08-06
  • 打赏
  • 举报
回复
一种方法就是按照楼上的方法建一个函数索引,....

另一种是修改数据,如果用户只对日期有兴趣,对具体钟点时刻不感兴趣的话,那就修改一下数据,如
update tabname set ACCDATE=trunc(ACCDATE);
然后建一个普通索引,create index idx_name on tbname(ACCDATE);
组装做成的SQL:select a,b from table where dat=to_date(:Var0,'yyyy-mm-dd') and amt=:Var1。

bzszp 2005-08-06
  • 打赏
  • 举报
回复
基于函数的索引
create index idx_name on tbname(to_date(col,'yyyy-mm-dd'));
liuyi8903 2005-08-06
  • 打赏
  • 举报
回复
bzszp的方法就是创建基于函数的索引的方法了。
dinya2003 2005-08-05
  • 打赏
  • 举报
回复
to_char(ACCDATE,'YYYY-MM-DD') ='2005-08-01' 你可以查看一下执行计划, 看是否使用了索引, 经过了计算可能就不使用索引了,

你可以这么做:WHERE ACCDATE=TO_DATE('2005-08-01','YYYY-MM-DD')
liuyi8903 2005-08-05
  • 打赏
  • 举报
回复
既然你们习惯的日期格式是:YYYY-MM-DD
那么你就个性一下日期格式的参数。

alter session set nls_date_format='YYYY-MM-DD';

然后在查询时:

select * from tname where date=to_date('2004-09-09','YYYY-MM-DD');

然后在创建索引:
create index i_date on tname(date);

没有必要用函数索引了。
njhart2003 2005-08-05
  • 打赏
  • 举报
回复
那是指创建一个基于函数的索引,
你也可以就用你原来的那个索引,在查询时注意要不要加函数,如
WHERE ACCDATE>=to_date('2005-08-01','yyyy-mm-dd')
AND ACCDATE<to_date('2005-08-02','yyyy-mm-dd')

这样就可以把索引用上了。

17,380

社区成员

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

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