blog.TangGaowei.com

Oracle 10g 的索引优化

作者 Neot 写于 2008-12-18  | 1,949 次浏览

最近公司网站的速度一起很不理想,文章页面基本都要 10s 以上才能打开。数据库用的是 Oracle 10g Express Edtion,存放文章的表超过了 10 万数据量,类似执行一个 select count(1) from res where class_id=1 这样的语句就经常在 10s 以上。然而,今天我在 class_id 上加了一个索引,这条语句的执行时间就几乎变成了 0s。效果之显著,完全出乎我的预料。下面是相关的总结:
 
1. 监控 select 语句
 
(“数据库主页”从开始菜单里“Oracle Database 10g Express Edition”的“转至数据库主页”进入)
 
进入“数据库主页>管理>数据库监视器>会话>SQL”页面,在“搜索”里输入“select”,点击“开始”。 这样就可以看到最近执行的 select 语句。点击“SQL”列里的 SQL 语句链接,查看执行情况。其中,“CPU时间”即为执行所用的时间,“已处理的行数”为查询结果的行数。下面的“SQL文本”是 SQL 语句的完整内容,“索引”区域显示该查询使用了哪个索引。
 
找到“CUP时间”超过 1 秒的查询,看是否需要添加索引。
2. 添加索引
 
进入“数据库主页>对象浏览器”页面,在右边偏上方有一个“创建”按钮。点击“创建” 按钮,在出现的菜单里选择“索引”,然后输入“表名”,“索引类型”使用“常规”,再点击“下一步”。
 
在新出现的页面,输入索引的名称和索引列。如果是不唯一的字段,最好将“单性值”设置为唯一,可能有助提高检索速度。再点击“下一步”,点击“完成”按钮。
 
照我的理解,创建索引时选择什么索引列,应该是由 select 语句的 where 部分决定的。比如 where id=1 ,只需选择 id 一个索引列;如果是 where id=1 and name=2 ,则需要选择 id 和 name 两个索引列来创建索引。只对主键进行索引,因为是唯一的,所以将“单性值”设置为“唯一”。
 
数据量比较大的表,都应在其主键上创建一个索引,其它需要的另加。
 
order by 语句里的字段,一般无法使用索引,所以,尽量在 order by 之前将查询结果的行数缩到最少。
 
要提高 order by 语句的执行效率,可适当增加 sort_area_size 的值( 10240000=10m ):
 
alter system set sort_area_size=10240000 scope=spfile;
 
 
附一:为表添加主键
 
进入“数据库主页>对象浏览器”页面,在左则选择要创建主键的表。在右边出现的表页面中,点击“约束条件”->“创建”,“约束条件类型”设置为“主键”,其它自行填写。
 
附二:Oracle 配置参数查询语句
 
SELECT NAME,VALUE
FROM v$parameter
WHERE NAME IN
(’sga_max_size’,'db_cache_size’,
’shared_pool_size’,’shared_pool_reserved_size’,'large_pool_size’,'java_pool_size’,
‘db_block_size’,'db_block_buffers’,'log_buffer’,’sort_area_size’,’sort_area_retained_size’,
‘hash_area_size’,’sessions’,'open_cursors’
)ORDER BY NAME;
附三:其它参数设置命令
 

alter system set sga_max_size=700m scope=spfile;

 

alter system set sga_target=700m scope=spfile;


[ 标签: oracle, 数据库优化, 索引 ]
[ 固定链接:http://blog.tanggaowei.com/2008/12/oracle-10g.html ]

精简Oracle客户端+PLSQL Developer安装方法

作者 Neot 写于 2006-11-28  | 19,450 次浏览

PLSQL Developer必须要Oracle客户端才能正常运行。但标准的Oracle客户端有几百兆,而且很耗资源。于是,有人专门打包了一个精简版的Oracle客户端,安装后只有30M。下面介绍一下,PLSQL Developer怎么通过这个精简版的Oracle客户端,来实现正常运行:

1.下载软件

oracle.part1.raroracle.part2.raroracle.part3.rar

2.安装软件

分别安装“Oracle客户端”和“PLSQL Developer”软件。

3.配置

Oracle客户端的配制文件,默认会安装在“C:\Oracle\ora90\network\ADMIN”目录下,名为“tnsnames.ora”参考格式如下:

ORCL_192.168.1.246 =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.246)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SID = orcl)
      (SERVER = DEDICATED)
    )
  )

[ 标签: oracle, 数据库 ]
[ 固定链接:http://blog.tanggaowei.com/2006/11/oracleplsql-developer.html ]

关于Oracle的排序问题

作者 Neot 写于 2006-11-17  | 2,488 次浏览

Oracle对唯一字段的排序没有任何问题,每次的排列顺序都是相同的。但是,Oracle对不唯一字段的排序,却很怪异,并不是每次的排列顺序都一样。这种怪异性,在分页排序时产生严重的问题。

比如,UserInfo表有“性名”(唯一)、“性别”(不唯一)两个字段,对该表的“性别”字段进行排序:

排序前

姓名 性别
刘德华
张惠妹
周华建
张曼玉
周杰伦
张学友
成龙
刘青云
李小璐

第一次排序

姓名 性别
刘德华
周华建
周杰伦
张学友
成龙
刘青云
张惠妹
张曼玉
李小璐

第二次排序

姓名 性别
周杰伦
周华建
刘德华
张学友
成龙
刘青云
李小璐
张曼玉
张惠妹

如上所示,第一次排序和第二次排序都是按“性别”顺序排序。单独看“性别”字段,两次的排列顺序是相同的。但是,结合“姓名”字段一起,就有问题了。很明显,两次排序的“性名”字段的顺序并不相同,它们是在“性别”排序的基础上自动进行的。

经过测试,对不唯一字段进行排序时,每次的排列顺序都可能不同。
为了解决这样的问题,对不唯一字段进行排序时,可以在排序字段里,额外增加一个唯一字段,如:”SELECT * FROM UserInfo ORDER BY 性别,姓名”。

[ 标签: oracle, 排序 ]
[ 固定链接:http://blog.tanggaowei.com/2006/11/oracle.html ]

Oracle可能抢占Tomcat的8080端口

作者 Neot 写于 2006-08-06  | 3,555 次浏览

  默认情况下,Oracle也要用到HTTP的8080端口为自己提供服务。所以,在装有Oracle的电脑上,再安装Tomcat,可能导致Tomcat不可用。因为Tomcat在情况下也是使用8080端口的。如果Oracle先启动了,就会占用8080端口。Tomcat就无法访问8080端口。

解决办法:要么把Oracle服务改到其它端口,要么把Tomcat改到其它端口。

[ 标签: oracle, tomcat, 端口 ]
[ 固定链接:http://blog.tanggaowei.com/2006/08/oracletomcat8080.html ]

Java中从Oracle里取出数据时,为什么提示“无效的列索引”

作者 Neot 写于 2006-07-18  | 3,796 次浏览

  第一次在Java中用JDBC连接Oracle数据库,连接通了,但是一个简单的SQL查询,却报告“无效的列索引”。

开始,我以为是Oracle里的表索引没有设置。于是,我给要查询的表添加了索引。但是,还是报同样的错。

记得,前段时间,我用JSP中用JDBC连接过Oracle数据库,SQL查询查出来过记录。只是当时用的数据表不同。于是,我又试着用与JSP中同样的代码,同样的数据表再测了一次。结果,还是不行。

没办法,只得请教一位公司里的JAVA高手,让她帮忙看一下。原来,是我取字段的时候,字段序号写错了。高手就是高手,一看就看出来了。

错误代码如下:

……
ResultSet rs = null;
try {
……
if (rs.first()) {
String col = rs.getString(0); // 错误代码处
}
}
}
……

完整的正确代码如下:

// 省略数据库连接部分

String sqlquery = “select * from users”;

PreparedStatement ps = null;
ResultSet rs = null;
try {
ps = conn.prepareStatement(sqlquery,
ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);

rs = ps.executeQuery();
if (rs.first()) {
String col = rs.getString(1); // 修改后的正确代码
}
}
} catch (SQLException se) {
throw se;
} catch (Exception ex) {
throw ex;
} finally {
if (rs != null)
rs.close();
if (ps != null)
ps.close();
}

从上面的代码可以看出,ResultSet类型的getString(int index)方法,是以1开始的。我用的是0,所以出错了。

VB中数字以1开关,Java同C++一样,数字一般以0开始。而像这样突然在Java里面出现以1开始的情况,确实很难想到。因此,虽然只是一字之错,但我还是把它写了下来。

[ 标签: java, oracle ]
[ 固定链接:http://blog.tanggaowei.com/2006/07/javaoracle.html ]

订阅

 

手机访问

http://blog.tanggaowei.com/wap/

Google