date字段上建立了索引,但是sql语句中使用的where条件如下:
WHERE to_char(start_time,’yyyy-mm-hh hh24:mi:ss’) > ‘2009-08-01 00:00:00′ AND to_char(start_time,’yyyy-mm-hh hh24:mi:ss’) < '2009-08-31 23:59:59';
因为使用了to_char函数,造成了索引没有使用。正确的写法如下:
WHERE start_time > to_date(‘2009-08-01 00:00:00′ ,’yyyy-mm-hh hh24:mi:ss’) AND start_time < to_date('2009-08-31 23:59:59', ,'yyyy-mm-hh hh24:mi:ss');
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以下内容引自itpub论坛:
问题:
环境:AIX 4.3.3,oracle9.2RAC,表mytab共有数据15万条左右上。
在日期型字段(mydate)上建了一个索引(create index idx1 on mytab(mydate)),
可是SQL(select mydate from mytab where to_char(mydate,’yyyymmdd’)=’20040310’)根本不使用这个索引。
后来在该字段上建了一个函数索引:to_char(mydate,’yyyymmdd’)之后,该sql可以使用这个索引了,但是一旦加上order by mydate(select mydate from mytab where to_char(mydate,’yyyymmdd’)=’20040310′ order by mydate)之后,oracle又不使用索引了。真是非常困惑。
把数据倒到Redhat AS3+oracle10上,现象也很费解。建索引:create index idx1 on mytab(to_char(mydate,’yyyymmdd’)),SQL(select mydate from mytab where to_char(mydate,’yyyymmdd’)=’20040310’)和SQL(select mydate from mytab where to_char(mydate,’yyyymmdd’)=’20040310′ order by mydate)都能使用该索引。
那位大虾能解释上述现象啊?
答复:
我觉得你用to_char转换索引字段不可取
where to_char(mydate,’yyyymmdd’)=’20040310’)
可以转换
where mydate >= to_date(‘20040310′,’yyyymmdd’)
and mydate < to_date('20040311','yyyymmdd')
原帖地址:http://www.itpub.net/thread-208701-1-1.html
我们在编程实践中经常会需要进行数组的复制,不但要复制数组的基本结构,还要复制其中的数据,遇到这种情况该怎么处理呢?不用愁,java给我们提供了一个System.arraycopy() 方法来解决这个问题。 More …
选择风险
近期我们在产品前台重构中引入了RIA特性。虽然Ajax比其他RIA技术对于开发人员技术水平的要求较高,开发代价更大,但由于产品特性需要我们仍然采用了Ajax技术,并在众多框架中选择了Prototype(1.5.1)和Ext(1.0.1a)组合。在企业级应用开发中做出这样的抉择是需要承担一定的风险的。
如期而至的问题
不出所料,重构工作开展不过两个星期,客户端浏览器的性能问题便凸现出来,使重构进程陷入僵持状态。暂时撇开客户端代码运行速度不说,IE(6 sp2)和Fx(2.0.0.4)浏览器出现了不同程度的JavaScript内存泄露,使得客户端浏览器在浏览系统页面一段时间后会消耗大量客户端资源以至浏览器的浏览速度低下甚至瘫痪。使框架问题还是我们编写的客户端代码存在问题呢?我们首先带着这个问题展开了一系列的测试。
经过初步观察,在系统主界面中每打开一个包含了Ext.Grid(以下简称grid)控件的Ext.TabPanelItem(以下简称tab),浏览器(IE、Fx)占用的内存资源就会飙升1-4M,且关闭Ext.TabPanelItem后内存并不会被回收。如此,每次开启10个Ext.TabPanleItem再将之关闭,反复数次之后,浏览器所占用的资源已经高达数百兆。浏览器内存占用提高的问题暂不考虑,因为tab中嵌入了iframe(由于系统页面结构的特殊性和接口问题,没有利用ajax请求向tab中装载页面内容),而iframe中的页面加载了Prototype和Ext的js文件(总共大约600K),假设框架加载需要分配1-4M的内存空间也是合理的。但关闭tab后内存不被回收,且开启新tab时浏览器内存占用继续增长,则可以肯定地判断为内存泄露。是何种原因导致了内存泄露呢?
IE/Fx的bug,iframe惹祸
经过进一步的观察,我们发现IE和Fx的内存泄露现象存在着差异,而浏览器瘫痪的时机也有着很大不同。
具体表现如下:
IE:每开启一个tab,IE的内存占用量即提高1-4M。关闭tab,内存占用量不会下降。继续操作,直至浏览器瘫痪,内存占用量仍不下降。
Fx:每开启一个tab,Fx的内存占用量提高1-4M。关闭tab,内存占用量不会下降。但连续关闭几个tab后,浏览器陷入假死状态,cpu占用率达到50%,数秒后恢复正常。tab全部关闭后,继续操作,随着tab的添加Fx的内存占用量又逐渐增加。
解决办法
综上,可以得到这样的结论,IE下确实存在着内存泄露问题,而Fx下并非内存泄露导致浏览器假死。
随后,我在Ext的官方网站论坛上找到了关于iframe与tab混用时会发生Memory leak的帖子。Ext核心开发人员Jack的回答是,TabPanelItem在关闭时并不会对自定义到tab中的元素做特殊处理,这部分工作必须在控件外来完成。另一方面,相关资料称IE在iframe元素的回收方面存在着bug,在通常情况下应该将该元素的src属性值修改为”abort:blank”,并手工将其从DOM树上移除,然后把脚本中引用它的变量置空并调用CollectGarbage()就可以避免iframe不能正常回收所造成的内存泄露。
按照上述方法,在tab的close事件中添加了iframe的销毁代码,IE的内存泄露问题得以解决。
但是,Fx的问题仍然无法得到解决,即关闭tab后CPU占用率激增并持续数秒。无奈之下我测试了Linux下的Firefox以及Windows版本的Firefox 3 alpha,并未出现此问题。初步断定,着个问题应该是Firefox 2.0.0.4在DOM元素回收性能方面的BUG。至于在Fx下关闭tab并不会立即释放内存也得到了官方解释,Fx会缓存一部分页面数据在内存中,以得到较好的性能。
“至尊”级浏览器,Safari
此前我对苹果发布的windows版本Safai3还持有不屑一顾的态度,因为他们的发言人实在太过狂妄的发言,自称Safari是世界上最好的浏览器,未把任何浏览器放在眼里。我一向不喜欢自吹的人,却又对他们发言人的狂言感觉好奇,另一方面希望测试一下产品的跨浏览器能力,便索性下载了Safari 3 for windows。结果令我瞠目结舌,Safari处理JavaScript的速度绝非IE和Fx(包括他们的最新版本IE7和Fx3 alpha)所能及,绝对可以堪称一流的页面渲染能力。为程序员说句心里话,如果所有浏览器的页面渲染速度能达到Safari的水准,我们在AJAX RIA应用构建上将有更大的发挥空间。我着实为Safari带来的RIA极速浏览体验快感兴奋了一把。不夸张地说,Safari至少可以算个浏览器的准至尊吧。
Ext的js包使用注意事项
在通常情况下,使用ext-all.js就可以了,但是当一个页面需要包含多个iframe,且iframe的资源指向需要使用Ext的页面时,被嵌入的页面尽量不要使用Ext-all.js了,而是使用ext-core.js并从Ext的package目录中加载你所需要的js包。除非你确定你的客户使用Safari或者Fx3来浏览,否则性能会大打折扣。
作者:冰咖啡
from:http://icedcoffee.blogbus.com/logs/6489320.html
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
文章所提到的iframe内存回收的方案下文给出了一个完整参考:
项目中用到一个IFRAME做页面跳转前的处理,运行时发现每次通过IFRAME并关闭页面后,IE的内存会增加3M左右,调查发现是IFRAME没有释放掉,所以对代码做了修改:
作者:gaohades
from:http://www.cnblogs.com/gaohades/archive/2009/07/24/1415811.html
sign函数语法:
sign(n)
sign函数说明:
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0
示例:
select sign( 100 ),sign(- 100 ),sign( 0 ) from dual;
SIGN(100) SIGN(-100) SIGN(0)
———- ———- ———-
1 -1 0
暂时还没有用过,先收藏一下。
decode函数说明:
decode函数可以将输入数值与函数中的参数列表相比较,根据输入值返回一个对应值。
函数的参数列表是由若干数值及其对应结果值组成的若干序偶形式。当然,如果未能与任何一个实参序偶匹配成功,则函数也有默认的返回值。区别于SQL的其它函数,DECODE函数还能识别和操作空值。
如果应用中没有建立代码表,使用docode函数进行key–>value的转换是一种不错的替代方案,只是为应用的后期维护带来麻烦。
语法如下:
DECODE(control_value,value1,result1[,value2,result2…][,default_result]);
参数说明:
control _value
试图处理的数值。可以是数据库中表的某一列,DECODE函数将该数值与后面的一系列的偶序相比较,以决定返回值。
value1
是一组成序偶的数值。如果输入数值与之匹配成功,则相应的结果将被返回。对应一个空的返回值,可以使用关键字NULL于之对应
result1
是一组成序偶的结果值。
default_result
未能与任何一个值匹配时,函数返回的默认值。
示例:
首先创建一张sale表,并插入一些测试数据:
create table class(id char(2),name varchar2(50), valid_flag char(1));
insert into class values(’01’,’语文’,’Y’);
insert into class values(’02’,’数学’,’Y’);
insert into class values(’03’,’外语’,’N’);
insert into class values(’04’,’历史’);
首先看一下decode函数的基本用法:
select id, name, decode(valid_flag, ‘Y’, ‘有效’, ‘N’, ‘无效’,’未设置’) from class;
ID NAME DECODE(VALID_FLAG,’Y’,’有效’,’
— ————————————————– ——————————
01 语文 有效
02 数学 有效
03 外语 无效
04 历史 未设置
说明:
当valid_flag为’Y’时,则返回’有效’;
当month为’N’时,则返回’无效’;
其他则返回’未设置’。
以上的sql语句可以通过case实现:
select id, name, case valid_flag
when ‘Y’ then ‘有效’
when ‘N’ then ‘无效’
else ‘未设置’ end
from class;
由以上sql语句可以看出,使用decode函数要简洁的多。
另外,还可以在Order by中使用decode:
例:表table_subject,有subject_name列。要求按照:语、数、外的顺序进行排序。这时,就可以非常轻松的使用Decode完成要求了。
select * from table_subject order by decode(subject_name, ‘语文’, 1, ‘数学’, 2, , ‘外语’,3)
问:什么是NULL?
答:在我们不知道具体有什么数据的时候,也即未知,可以用NULL,我们称它为空,ORACLE中,含有空值的表列长度为零。
ORACLE允许任何一种数据类型的字段为空,除了以下两种情况:
1、主键字段(primary key),
2、定义时已经加了NOT NULL限制条件的字段
说明:
1、等价于没有任何值、是未知数。
2、NULL与0、空字符串、空格都不同。
3、对空值做加、减、乘、除等运算操作,结果仍为空。
4、NULL的处理使用NVL函数。
5、比较时使用关键字用“is null”和“is not null”。
6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,count(*)中,用nvl(列名,0)处理后再查。
7、排序时比其他数据都大(索引默认是降序排列,小→大),所以NULL值总是排在最后。
使用方法:
现有一个商品销售表sale,表结构为:
month char(6) –月份
sellnumber(10,2) –月销售金额
create table sale (month char(6),sell number);
然后我们给该表插入12条记录:
insert into sale values(‘200001’,1000);
insert into sale values(‘200002’,1100);
insert into sale values(‘200003’,1200);
insert into sale values(‘200004’,1300);
insert into sale values(‘200005’,1400);
insert into sale values(‘200006’,1500);
insert into sale values(‘200007’,1600);
insert into sale values(‘200101’,1100);
insert into sale values(‘200202’,1200);
insert into sale values(‘200301’,1300);
insert into sale values(‘200008’,1000);
insert into sale(month) values(‘200009’);
注意:最后一条记录的sell值为空,接下来测试几条sql来看看null的特性:
select * from sale where null=null;
MONTH SELL
—— —-
没有任何输入,说明null=null返回false,null与其自身都不相等,呵呵,有一点怪异。
select * from sale where null = 0;
MONTH SELL
—— —-
没有任何输入,说明null=0返回false,null与0不相等。
select * from sale where null = ”;
MONTH SELL
—— —-
没有任何输入,说明null=”返回false,null与”不相等。
select * from sale where ”=”;
MONTH SELL
—— —-
没有任何输入,说明”=”返回false,”与”不相等。
SQL> select * from sale where null is null;
MONTH SELL
—— —-
200001 1000
200002 1100
200003 1200
200004 1300
200005 1400
200006 1500
200007 1600
200101 1100
200202 1200
200301 1300
200008 1000
200009
12 rows selected
sale表的所有数据都成功返回,说明null is null返回true,看来null只能使用is null来识别。
再来看看null对于集合函数的影响:
SQL> select count(*) from sale;
COUNT(*)
———-
12
SQL> select count(sell) from sale;
COUNT(SELL)
———–
11
可以看出count函数在使用某一列作为参数的时候不会计算null,而count(*)会将null计算在内。
from:http://database.51cto.com/art/200511/10681.htm
参考链接:
http://www.blogjava.net/lingy/archive/2009/06/29/284559.html
instr的语法如下:
instr( string1, string2 [, start_position [, nth_appearance ] ] )
函数说明:
该函数返回参数string2在参数string1中的位置。
start_position参数表示将从string1的第几个字符开始来查找string2。该参数为可选参数,如果省略,那么默认为1。instr函数默认的查找顺序为从左到右。当该参数为负数的时候,则从右边开始查找。
nth_appearance表示返回第几次出现的string2的位置。该参数为可选参数,如果省略则默认为1,也就是返回首次出现string2的位置。
示例:
SELECT INSTR(‘CORPORATE FLOOR’, ‘OR’, -1, 1) “aaa” FROM DUAL;
aaa
———-
14
参考链接:
http://www.techonthenet.com/oracle/functions/instr.php
http://download.oracle.com/docs/cd/B28359_01/olap.111/b28126/dml_functions_1103.htm
http://www.psoug.org/reference/substr_instr.html
数组是用来集合相同类型的对象并通过一个名称来引用这个集合。作为一种最典型的数据结构,基本上所有的高级语言都有数组的概念,包括C、C++、Java、php等。
在Java中,使用数组分为以下三个步骤:
(1)声明数组;
(2)创建数组;
(3)初始化数组。
下面,我们按以上步骤来讲解数组在Java中的使用。
声明数组
一维数组的声明方式:
type var[]; 或type[] var;
推荐使用后者,同时需要注意声明数组时不能指定其长度(数组中元素的个数)。
在Java中,我们可以声明任何类型的数组──原始类型或类类型:
char chars[];
Point p; // where point is a class
在Java编程语言中,即使数组是由原始类型构成,甚或带有其它类类型,数组也是一个对象。声明不能创建对象本身,而创建的是一个引用,该引用可被用来引用数组。数组元素使用的实际存储器可由new语句或数组初始化软件动态分配。
创建数组
Java中使用关键字new创建数组对象,格式为:
数组名 = new 数组元素的类型 [数组元素的个数]
示例:
char[] chars = new char[20];
Point[] points= new Point[20];
第一行创建了一个可以容纳20个char值的数组;
第二行创建了一个可以容纳20个Point对象的数组;值得注意的是,此处并没有创建20个Point对象,创建工作必须分别完成如下:
points[0] = new Point();
points[1] = new Point();
等等。这部分工作被称为数组的初始化。
初始化数组
当创建一个数组时,每个元素都被初始化。在上述char数组chars的例子中,每个值都被初始化为0 (\u0000-null)字符;在数组points的例子中, 每个值都被初始化为null,表明它还未引用一个Point对象。在经过赋值 points[0]= new Point()之后,数组的第一个元素引用为实际Point对象。数组的初始化有如下两种方式:
1.动态初始化:数组定义与为数组分配空间和赋值的操作分开进行;
2.静态初始化:在定义数组的同时就为数组元素分配空间并赋值;
动态初始化数组示例:
public class TestD {
public static void main(String args[]) {
int a[];
a = new int[3];
a[0] = 0;
a[1] = 1;
a[2] = 2;
Date days[];
days = new Date[3];
days[0] = new Date(2008, 4, 5);
days[1] = new Date(2008, 2, 31);
days[2] = new Date(2008, 4, 4);
}
}
class Date {
int year, month, day;
Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
静态初始化数组示例:
public class TestS {
public static void main(String args[]) {
int a[] = { 0, 1, 2 };
Time times[] = { new Time(19, 42, 42), new Time(1, 23, 54), new Time(5, 3, 2) };
}
}
class Time {
int hour, min, sec;
Time(int hour, int min, int sec) {
this.hour = hour;
this.min = min;
this.sec = sec;
}
}
数组的默认初始化
数组是引用类型,它的元素相当于类的成员变量,因此数组分配空间后,每个元素也被按照成员变量的规则被隐式初始化。
public class TestDefault {
public static void main(String args[]) {
int a[] = new int[5];
System.out.println(“” + a[3]);
}
}
参考链接:
http://developer.51cto.com/art/200906/128274.htm
http://tech.ccidnet.com/art/3539/20070608/1107247_1.html
http://tech.163.com/06/0410/09/2EBATT9K0009159T.html
http://java.e800.com.cn/articles/2008/73/1215063991778_1.html
http://www.qqread.com/java/2008/06/w416323.html
NVL函数
在Oracle/PLSQL中,NVL函数会将一个NULL值替换为一个非NULL值。
语法
NVL(eExpression1, eExpression2)
参数
eExpression1, eExpression2
如果 eExpression1 的计算结果为 null 值,则 NVL( ) 返回 eExpression2。如果 eExpression1 的计算结果不是 null 值,则返回 eExpression1。eExpression1 和 eExpression2 可以是任意一种数据类型。如果 eExpression1 与 eExpression2 的结果皆为 null 值,则 NVL( ) 返回 .NULL.。
返回值类型
字符型、日期型、日期时间型、数值型、货币型、逻辑型或 null 值
说明
在不支持 null 值或 null 值无关紧要的情况下,可以使用 NVL( ) 来移去计算或操作中的 null 值。
示例1
select nvl(‘aaa’,’bbb’) from dual;
NVL(‘AAA’,’BBB’)
——————————–
aaa
示例2
select nvl(null,’bbb’) from dual;
NVL(NULL,’BBB’)
——————————–
bbb
返回字符串bbb
示例3
select nvl(NULL,’bbb’) from dual;
NVL(NULL,’BBB’)
——————————–
bbb
返回字符串bbb,null不区分大小写。
示例4
select nvl(‘null’,’aaa’) from dual;
NVL(‘NULL’,’AAA’)
—————–
null
字符串’null’不是null。
比利时一家杂志,曾对全国60岁以上的老人搞了一次问卷调查,调查的题目是:”你最后悔的是什么?”并列出了十几项生活中容易后悔的事情,供被调查者选择。于是,就出现了这样一个结果。
有72%的人后悔年轻时努力不够,以至事业无成。
由此我想起一个故事,说有一个40岁的人被医师告知患了绝症,最多再活三年时间。因此他为了使自己最后的生命更有意义,拟出一个『三年要做十件事』的工作计划。其中包括写一本书、学一门外语、搞一项发明、辨一个工厂、游30座名山、看50个城市等等,而且计划出后便立即付诸行动。在过了二年零八个月的时候,10项目标全都完成。可当他再到医院复诊时,却发现是医师当时拿错了病历,自己根本没有患病。这也是一个经验,如果别人工作你也工作,别人休息你也休息,别人娱乐你也娱乐,那么别人得到什么,你也只能得到什么,要想得到别人得不到的东西,就得付出别人不愿付出的东西。尤其是在你还年轻的时候,还有机会竞争的时候。
More …