对剑破冰山中的避免对列运算有点问题

[复制链接]
查看11 | 回复7 | 2014-2-19 11:55:14 | 显示全部楼层 |阅读模式
在书中作者提出要避免对列运算,好处是可以避免索引无法使用,提高语句效率。
看完后,我明白这么改是要利用索引从而减少逻辑读。但我觉得他举得例子,是用日期列作索引,
有点是为讲解这个知识点而构造的演示环境,我对这个知识点在实际中的应用还没碰到过,所以现在
感觉理解不深刻,所以想请各位讲解下对这的理解。
还有他的改写我也不太明白,log_time 是带着小时和分秒的,而且log_time是唯一的值,现在直接拿lod_time和to_date('2010-08-05','yyyy-mm-dd')比,这样写可以吗?
为什么不能直接写成log_time=to_date('2010-08-05','yyyy-mm-dd'),现在在公司不能实验,所以如果上面我说错了,请见谅。
以下我贴上书中内容。
如下两条等价sql,前者对列进行了trunc,而后者没有。
select * from ljb_test where trunc(log_time) = to_date('2010-08-05','yyyy-mm-dd');
select * from ljb_test where log_time>=to_date('2010-08-05','yyyy-mm-dd')
and log_time111.JPG (121.9 KB, 下载次数: 1)
下载附件
1
2012-11-20 10:54 上传



222.JPG (92.56 KB, 下载次数: 3)
下载附件
2
2012-11-20 10:54 上传



回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
log_time=to_date('2010-08-05','yyyy-mm-dd')的含义是log_time必须为2010-08-05 00:00:00
而如果那一天的08:30:00、13:25:33等时间,就不满足这个等式了
而原需求是找出log_time为当天的记录,即从2010-08-05 00:00:00 到2010-08-05 23:59:59都算,所以才出现了log_time>=to_date('2010-08-05','yyyy-mm-dd') and log_time<to_date('2010-08-05','yyyy-mm-dd')+1; 的写法
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
谢谢版主回答了疑问。那对这个知识点避免对列运算有什么体会吗。
谢谢。
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
找当天的数据啊,就这么做
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
不然走不了索引得全表扫描,而且表上的列还用函数进行计算,都消耗成本的
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
也就是说在实际中如果此列有索引,那就要避免对它进行运算。是吧
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
zhangwenczu 发表于 2012-11-20 11:11
也就是说在实际中如果此列有索引,那就要避免对它进行运算。是吧

是的,连+,-啥的,都要避免
回复

使用道具 举报

千问 | 2014-2-19 11:55:14 | 显示全部楼层
谢谢版主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行