oracle语句效率比较。

fihuang1 2010-05-24 11:26:34
oracle表t里一个时间字段dt为date类型。

我要查找某一天(2010-05-10)的数据,下面哪种方式效率高?
1.
select * from t where to_date(dt) = to_date('2010-05-10','yyyy-mm-dd')
2.
select * from t where dt between to_date('2010-05-10','yyyy-mm-dd') and to_date('2010-05-10','yyyy-mm-dd') + 1;
3.
select * from t where dt >= to_date('2010-05-10','yyyy-mm-dd') and dt < to_date('2010-05-10','yyyy-mm-dd') + 1;


谢谢大家。
...全文
220 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
t19830406 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fihuang1 的回复:]

引用 12 楼 iihero 的回复:

我难道眼花了?
select * from t where dt = to_date('2010-05-10','yyyy-mm-dd')
不需要在dt前头加to_date了。
dt是日期字段,建上索引,应该so快了。
dt虽然是date类型 但是它里面是有时分秒的 我只要年月日
[/Quote]
没有索引的话,都是全表扫描
fihuang1 2010-05-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 iihero 的回复:]

我难道眼花了?
select * from t where dt = to_date('2010-05-10','yyyy-mm-dd')
不需要在dt前头加to_date了。
dt是日期字段,建上索引,应该so快了。
[/Quote]dt虽然是date类型 但是它里面是有时分秒的 我只要年月日
huangdh12 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luoyoumou 的回复:]

-- 不解:dt已经为date类型的了,还用to_date()函数,就不会报错?
[/Quote]
对于时间字段 用天的话 可以用trunc
luoyoumou 2010-05-24
  • 打赏
  • 举报
回复
-- 提示:函数应尽量放在条件等式的右边,
-- 这样:如果dt字段有索引的话,就会用到此索引,这样效率才是最高的!
-- 例如:查询'2010-05-10'这一天的数据,查询语句如下所示:

select * from t
where dt >= to_date('2010-05-10','YYYY-MM-DD')
and dt < to_date('2010-05-11','YYYY-MM-DD');
luoyoumou 2010-05-24
  • 打赏
  • 举报
回复
-- 不解:dt已经为date类型的了,还用to_date()函数,就不会报错?
luoyoumou 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 adebayor 的回复:]
方便的话 自己看下执行计划吧
只看时间的话 在sqlplus中先set timing on;
再执行下 结果就一目了然了
[/Quote]

-- 效率都会很低,为什么左、右两边都要用to_date函数呢?那两边都不用(那样效率不是更高?),不是一回事吗?
Adebayor 2010-05-24
  • 打赏
  • 举报
回复
方便的话 自己看下执行计划吧
只看时间的话 在sqlplus中先set timing on;
再执行下 结果就一目了然了

Adebayor 2010-05-24
  • 打赏
  • 举报
回复
dt上有索引没?
个人感觉下面会好些
select * from t where to_char(dt,'yyyy-mm-dd') ='2010-05-10';
fihuang1 2010-05-24
  • 打赏
  • 举报
回复
怎么没人
我顶
iihero_ 2010-05-24
  • 打赏
  • 举报
回复
我难道眼花了?
select * from t where dt = to_date('2010-05-10','yyyy-mm-dd')
不需要在dt前头加to_date了。
dt是日期字段,建上索引,应该so快了。
CrazyPastor 2010-05-24
  • 打赏
  • 举报
回复
PLSQL如果你有这工具的下面自动提示查询时间。然后自己看一下就知道了
lzbbob1985 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luoyoumou 的回复:]
SQL code
-- 提示:函数应尽量放在条件等式的右边,
-- 这样:如果dt字段有索引的话,就会用到此索引,这样效率才是最高的!
-- 例如:查询'2010-05-10'这一天的数据,查询语句如下所示:

select * from t
where dt >= to_date('2010-05-10','YYYY-MM-DD')
and dt < to_date('2010-……
[/Quote]

顶这个
dingjun123 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 luoyoumou 的回复:]
-- 不解:dt已经为date类型的了,还用to_date()函数,就不会报错?
[/Quote]
为什么不可以??只要格式符合session的nls_date格式都行,这就是oracle的自动类型转换

如果经常有这种需求,你的dt肯定要建立索引的,所以不能对左值进行函数或防止它自动类型转换,右值转为date类型即可
心中的彩虹 2010-05-24
  • 打赏
  • 举报
回复
第一个

17,377

社区成员

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

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