使CREATETABLEASSELECT能支持ORDERBY
大家都知道,“CREATE TABLE AS SELECT”这个 SQL 命令并不支持“ORDER BY”,但如果我们想增加一个表,它存储的是已经排列过的一组数据,这些数据来自一个现有表,该怎么办呢? 哈哈,可以通过先建立一个VIEW,然后再CREATE,是不是一个不错的想法,看看下
大家都知道,“CREATE TABLE AS SELECT”这个
SQL命令并不支持“ORDER BY”,但如果我们想增加一个表,它存储的是已经排列过的一组数据,这些数据来自一个现有表,该怎么办呢?
哈哈,可以通过先建立一个VIEW,然后再CREATE,是不是一个不错的想法,看看下面的这篇文章,对你或许有用。
一般情况下,对一个TABLE中的数据进行分类排序后有利于优化
数据库的查询
性能。
例如:你的应用程序需要频繁的执行一个查询
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,会有大量的重复记录出现。
原文转自:http://www.ltesting.net
|