1、可以把那些null值设置成一个特殊的值,比如"N/A"
2、where nvl(col,0) =0在col字段上创建一个函数索引。create index ind_col ontable(nvl(col,0))
这样就能用索引了。
3、输入代码:CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN_NAME)。
4、给一个表里有的可空字段增加一个默认值alter table 表名 add constraint itemname defult(0) for 对应表字段。itemname 为自定义的名称。
5、给表增加字段,aleter table 表名 add itemname int null item name,为字段名
6、更新表字段类型,ALTER TABLE 表名 ALTER COLUMN 字段名,新的类型。
Oracle中我们经常使用Date字段类型记录日期和时间,有的时候还在这个字段上建立索引。然后通过Java程序访问数据库的时候,我们很自然的类似这样使用:select * from table where endDate>? and endDate<?,然后通过PreparedStatement预编译,再通过setTimestamp传入由java.util.Date转成java.sql.Timestamp的参数(因为java.sql.Date只有日期,java.sql.Time只有时间,所以我们只能用java.sql.Timestamp类型)。我们会认为这样应该走索引区间扫描,效率应该是非常高的。
而事实上,Oracle会把sql解释成如下这样来执行:select * from table where TO_TIMESTAMP(endDate)>? and TO_TIMESTAMP(endDate)<?为什么?因为传入的参数是timestamp类型,Oracle从9.2版本以后支持这种类型,所以Oracle做了这样的转换,结果就是这个SQL执行变成了全表扫描。我们做的试验,加了一个index hint,强制走时间索引字段,结果效率也不高,sql执行变成了全索引扫描,和全表扫描没多大区别。结果效率还是低。
不光直接使用JDBC会是这样,Spring,iBatis在处理传入参数是java.util.Date类型的时候,都会使用setTimestamp设定参数,所以都需要注意。
解决办法(四种解决办法,推荐方案一):
1.sql修改成这样:select * from table where endDate>to_date(?,’yyyymmddhh24miss’) and endDate<to_date(?,’yyyymmddhh24miss’)然后将传入参数格式化成对应格式的字符串在传入,这样由Oracle将字符串转成Date类型,就很顺利的走索引区间扫描,效率最高。
2.在建立数据库连接的时候增加一个属性oracle.jdbc.V8Compatible=true,代码如下:
Properties prop=new Properties()
prop.setProperty(“user”,”****”)
prop.setProperty(“password”,”****”)
prop.setProperty(“oracle.jdbc.V8Compatible”,”true”)
Connection connection = DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:test”, prop)
连接池也根据各自的配置方式增加这个属性即可。目前看来这个属性参数是处理时间映射关系的,但是还不确定它是否会带来其他的问题,所以要慎重使用。
3.修改数据库列类型为timestamp类型。
4.依据网上资料,Oracle 11g修改了驱动 api,使用方式可能也会有改变。因为无法试验,所以也不确定具体细节。
如何在ORACLE数据库的字段上建立索引CREATE INDEX命令语法:
CREATE INDEX
CREATE [unique] INDEX [user.]index
ON [user.]table (column [ASC | DESC] [,column
[ASC | DESC] ] ... )
[CLUSTER [scheam.]cluster]
[INITRANS n]
[MAXTRANS n]
[PCTFREE n]
[STORAGE storage]
[TABLESPACE tablespace]
[NO SORT]
Advanced
其中:
schema ORACLE模式,缺省即为当前帐户
index 索引名
table 创建索引的基表名
column 基表中的列名,一个索引最多有16列,long列、long raw
列不能建索引列
DESC、ASC 缺省为ASC即升序排序
CLUSTER 指定一个聚簇(Hash cluster不能建索引)
INITRANS、MAXTRANS 指定初始和最大事务入口数
Tablespace 表空间名
STORAGE 存储参数,同create table 中的storage.
PCTFREE 索引数据块空闲空间的百分比(不能指定pctused)
NOSORT 不(能)排序(存储时就已按升序,所以指出不再排序)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)