函数索引与虚拟列的比较
来源:互联网 发布:淘宝宝贝价格设置技巧 编辑:程序博客网 时间:2024/06/08 13:29
在数据库开发过程中,经常遇到一个问题是时间字段精度问题。有时候在保存的时候要求时间精确到秒,但是在使用过程中可能只要精确到天。
例如:。如果要求找到2012年七月25号创建的用户。
1.错误sql:select * from t_cust_custbasedata t where t.fcreatetime = to_date('2012-07-25','yyyy-mm-dd') 数据库里面存储的时间有精度。
2.正确做法:但是明显是全表扫描,如果数据量大那么会非常影响性能。
3.错误优化方式:在创建时间列上添加索引create index IDX_DATABASE_FCREATETIME on dpcrm.t_cust_custbasedata(fcreatetime);。由于在fcreatetime使用了函数,所以还是不会使用普通索引。
4.添加函数索引:create index IDX_TRUNC_FCREATETIME on dpcrm.t_cust_custbasedata(TRUNC(fcreatetime));
结果很明显。
那么来看看索引的大小,还有原来表的大小
5.添加虚拟列
添加:
alter table dpcrm.t_cust_custbasedata
add (truncdate TIMESTAMP(6) generated always as (trunc(fcreatetime)) virtual)
收集统计信息:
begin
dbms_stats.gather_table_stats(OWNNAME => 'DPCRM',
TABNAME => 'T_CUST_CUSTBASEDATA',
cascade => true);
end;
这样就增加了一列名字为truncdate 到表后面,接下来的查询可以直接使用该列,避免了函数转换导致不走索引,但是很明显需要在该列上增加索引。最终的效果和函数索引一样。说明:虚拟列相当一个函数,在使用该列的时候实时返回值,所以不占用任何存储空间。
综上,在使用虚拟列实现函数索引功能意义并不是很大,oracle官方引入虚拟列主要是优化分区,详见
Using Virtual Column-Based Partitioning
- 函数索引与虚拟列的比较
- 虚拟列上的索引
- select *与select 无索引列以及select 有索引列的比较
- hive的虚拟列函数
- 索引类型之虚拟列
- 给含有空值的列创建虚拟索引
- 唯一索引与主键索引的比较
- 唯一索引与主键索引的比较
- 唯一索引与主键索引的比较
- 唯一索引与主键索引的比较
- 唯一索引与主键索引的比较
- oracle 合并列的函数,比较实用
- MySQL5.7 虚拟列实现表达式索引
- MySQL5.7 虚拟列实现表达式索引
- MySQL5.7 虚拟列实现表达式索引
- SQL联合索引 与 单一列的索引
- SQL联合索引 与 单一列的索引
- SQL联合索引 与 单一列的索引
- ReactiveCocoa - iOS开发的新框架
- app 逆向工程 相关工具
- gcc-4.7 for linux
- OXOOOOOO7B
- Ext.data.proxy.LocalStorage和SessionStorage
- 函数索引与虚拟列的比较
- 关于网卡驱动和网卡速率问题,你肯定也遇到过
- java 配置log4j在控制台显示sql语句
- IEEE754浮点数转换
- jquery插件Ajaxfileupload上传Excel文件
- 检测远程端口是否打开
- j2ee页面静态化方案encache web cache框架详解1
- Spring控制器注解Controller
- eclipse中一些常见svn图标的含义