Chinaunix首页 | 论坛 | 博客
  • 博客访问: 651820
  • 博文数量: 109
  • 博客积分: 6081
  • 博客等级: 准将
  • 技术积分: 1318
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 10:28
文章分类
文章存档

2011年(8)

2010年(39)

2009年(62)

分类: Oracle

2009-11-30 16:58:46


“CREATE TABLE AS SELECT”这个SQL命令并不支持“ORDER BY”,但如果我们想增加一个表,它存储的是已经排列过的一组数据,这些数据来自一个现有表,该怎么办呢?

可以通过先建立一个VIEW,然后再CREATE

例如:你的应用程序需要频繁的执行一个查询
SELECT * FROM EMP WHERE NAME LIKE ‘M%’;
如 果EMP表中的所有行都被他们的的名字排了序,那么你的查询将会有显著提高。因为NAME中所有包含‘M’的行都被存储在了一起,ORACLE在查询数据 时仅仅从表中取得很少的DATA BLOCKS。当然,如果你的TABLE中的数据是静态的,那么这个很好办到,即在你CREATE TABLE时按照顺序INSERT即可。但是往往我们的TABLE中的数据时常要更新,而SQL又不支持带ORDER BY 字句的INSERT INTO ... SELECT ... FROM ...和CREATE TABLE AS SELECT ... FROM ...命令,于是只能放弃固有的排序了,结果当数据达到十几万条记录时,查询性能就显著的下降了。如何处理这样的问题呢,有两个解决的方法。
这里提供一个方法,通过GROUP BY操作来完成。
CREATE VIEW EMPGROUP AS
SELECT NAME,EMPID,HIREDATE,ROWNUM FROM EMP
GROUP BY NAME, EMPID, HIREDATE,ROWNUM;
然后用这个VIEW来增加一个TABLE
CREATE TABLE SORTED_EMP AS SELECT NAME, EMPID, HIREDATE FROM EMPGROUP;
注意:
1、如果你使用ORACLE7.3以上版本,可以使用INLINE VIEW代替EMPGROUP VIEW。
2、如果你建VIEW时忽略了ROWNUM,那么由于使用了GROUP BY,会有大量的重复记录出现。


阅读(2046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~