169it科技资讯


当前位置:  数据库>其它
本页文章导读:
    ▪oracle 数据库       ORACLE SQL(Structured Query Language)结构化查询语言 DML   数据操纵语言 SQL    DCL   数据控制语言,控制权限        DDL  &nb......
    ▪插入10万条记录测试      通过前几篇文章,介绍了JadePool的许多长处,JadePool到底如何,需要经得起实践的检验。以下是插入10万条记录的测试情况。 硬件:笔记本联想G450 CPU:Intel Pentium T4300(2.1GHz) 内存:2G IDE:Ne......
    ▪rebuild index VS. rebuild index online      create index和rebuild index时都会对原表加4号锁,对obj$加3号锁,阻止对原表的DML操作。 create index online 和 rebuild index online 采用新增一张临时表来处理创建或者重建索引时对原表索引列的修改,这......

[1]oracle 数据库
    来源: 互联网  发布时间: 2013-11-15

ORACLE

SQL(Structured Query Language)结构化查询语言

DML   数据操纵语言

SQL    DCL   数据控制语言,控制权限

       DDL   数据定义语言  例如:CREATE,DROP,ALTER,DELETE

ORACLE安装

              Sys  超级管理员

  System system

              Scott tiger

       

Oracle端口号:1521

Oracle只有一个database,通过不同的用户给表分类。

sqlplus

Select * from tab;查询当前用户有哪些表。

set linesize 300;显示一行显示300个字符。

Set pagesize 50;显示一页50行

简单查询语句:

Select [distinct] <列名> [[as] 别名] from <表名> [[as] 别名]

[where <查询条件>]

[order by <排序列名> [asc | desc]]

distinct 去掉查询结果中重复列  字段名不能加’ ’(引号)

select ‘name:’ || ename form emp

            字符串连接

Between 1500 and 3000 结果包含了1500和3000

Between ….and….也可用于日期

In:

Select empno,ename from emp where empno in(2011,2001,2300)

通配符:’ -’代表一个字符,‘%’代表0到多个字符。

在sqlplus 中,ed d:/a  表示打开或创建一个sql文件,

             @ d:/a   表示执行此文件

单行函数

字符函数:接收字符输入并输出。

  upper: 将小写字符转换成大写

   select upper(‘jack’) from dual;

oracle有一张特殊的表:dual,完成一项功能使用

  initcap:将单词第一个字母转换成大写

    select initcap(lower(ename)) from emp;   嵌套使用函数。

  Concat:字符串连接

Select concat(‘name:’,ename) from emp;    相当于使用‘ ||’

  length: 求长度

select length(‘hello’) from dual;

  substr: 截取字符串

substr(‘word’,3)  从第三个开始截取

substr(‘helloword’,1,3) :其中1 为索引,3为长度

索引可从0开始,也可从1开始

Substr(‘helloword’,-3)  从后向前数截取3个

  Replace:替换

Select replace(ename,’s’,’9’) from emp;

数字函数:

  round:四舍五入

    select round(2473.125) from dual; 无小数保留

round(2736.3567,2) 保留两位小数

round(2173.34,-2) 精确到两小点前两位

  trunc(2649.34,2)保留两位小数,其余位截去

日期函数:

日期-数字=日期    日期+数字=日期    日期-日期=数字

  round((sysdate-hiredate)/7) 求员工入职大约有几个星期

  month_betweed(sysdate,hiredate)  求员工入职有几个月

  add_months(sysdate,1) 加一个月

  next_day(sysdate,’星期一’) 求出给定日期的下星期一是号

  last_day(sysdate)  这个月的最后一天是几号

转换函数:

  to_char(hiredate) 转换成字符串

  to_char(hiredate,’yy-mm-dd’) 转换成日期形式

  to_char(hiredate,’fmyyyy-mm-dd’)  其中fm:format去掉前导0

  to_char(sal,’$99.999,99’)

  to_number(‘34235’)

  to_date(’12-28-2012’,’mm-dd-yyyy’)  转换成日期

通用函数:

Oracle中空值参加四则运算,结果为null

  select ename,sal*12+nvl(comm,0) from emp;

多表查询:

   找关联字段作关联条件

(1) 找出几张表 (2)消除迪卡尔积  (3)确定查询内容

 一张表当两张表用时不是一回事

 “什么的什么“用时需消除迪卡尔积

表连接:

(1) oracle特有的方式

“+“号在”=“号左边是右连接,在“=”号右边是右连接

以哪张表为基准就是

    
[2]插入10万条记录测试
    来源: 互联网  发布时间: 2013-11-15
通过前几篇文章,介绍了JadePool的许多长处,JadePool到底如何,需要经得起实践的检验。以下是插入10万条记录的测试情况。
硬件:笔记本联想G450
CPU:Intel Pentium T4300(2.1GHz)
内存:2G
IDE:NetBeans 7.2.1
数据库:SQL Server 2000
表:
       create table test_xueshng(
          id bigint primary key,
          name varchar(16),
          sex varchar(2),
          birthday datetime,
          address varchar(80)
          );
JDBC驱动程序:sqljdbc4.jar

以下是插入10万条记录的运行结果:
        /*
         run:
         测试时间:2013-03-19 05:05:07
         插入记录数:100000 ;用时:28609毫秒。
         成功构建 (总时间: 28 秒)

         */


/*
 * ProcessVO测试
 */
package cn.test;

import cn.jadepool.sql.Jade;
import cn.jadepool.sql.ProcessVO;
import cn.jadepool.util.DateTool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 *
 * @author hkm
 */
public class ProcessVO_InsertTest {

    public static void main(String[] args) throws SQLException {
        ProcessVO_InsertTest test = new ProcessVO_InsertTest();
        test.insert();
        /*
         run:
         测试时间:2013-03-19 05:05:07
         插入记录数:100000 ;用时:28609毫秒。
         成功构建 (总时间: 28 秒)
         */
    }

    /**
     * 插入10万条记录测试
     */
    public long insert() throws SQLException {

        /*
         * create table test_xueshng(
         * id bigint primary key,
         * name varchar(16),
         * sex varchar(2),
         * birthday datetime,
         * address varchar(80)
         * );
         */

        DateTool dt = new DateTool();
        long t0 = System.currentTimeMillis();
        System.out.println("测试时间:" + dt.dateTime());
        int length = 100000;
        List v = new ArrayList();
        for (int i = 0; i < length; i++) {
            int k = i % 2;
            String sex = "男";
            if (k == 0) {
                sex = "男";
            }
            if (k == 1) {
                sex = "女";
            }
            String s = "" + (length * 10 + i);
            s = s.substring(1);
            Map m = new HashMap();
            m.put("id", i);
            m.put("name", ("name" + s));
            m.put("sex", sex);
            m.put("age", 16);//无效字段将被自动删除
            m.put("memo", "备注");//无效字段将被自动删除
            m.put("birthday", dt.dateTime(-12 * 365));//12年前出生
            v.add(m);
        }

        ProcessVO pvo = new ProcessVO(getCon());
        try {
            pvo.setAutoCommit(false);
            pvo.delete("delete from test_xueshng");
            pvo.insert("test_xueshng", v);
            pvo.commit();
        } catch (SQLException ex) {
            ex.printStackTrace();
            pvo.rollback();
        } finally {
            pvo.closeCon();
        }
        
        //以下是使用Jade时的等效代码
        /*
         Jade j = new Jade(getCon());
         j.delete("delete from test_xueshng");
         j.insert("test_xueshng", v);
         j.commit();
         */

        long t1 = System.currentTimeMillis();
        long t = t1 - t0;
        System.out.println("插入记录数:" + v.size() + " ;用时:" + t + "毫秒。");
        return t;
    }

    /**
     * sqljdbc4.jar
     */
    public static synchronized Connection getCon() {
        Connection con = null;
        String url = "jdbc:sqlserver://127.0.0.1\\dba:1436;databaseName=jadepool_test";
        String userName = "jadepool_test";
        String password = "123";
        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            con = DriverManager.getConnection(url, userName, password);
        } catch (SQLException ex1) {
            ex1.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return con;
    }
}



在此,我们可以对比以下Hibernate的情况,JadePool的性能还是相当出色的。
以下来自

Hibernate入门:批量插入数据   http://blog.csdn.net/xiazdong/article/details/7709068
Hibernate 与 原生 Jdbc 批量插入时的差距  http://liu-anxin.iteye.com/blog/1026777
Hibernate批量插入的测试 http://www.360doc.com/content/10/0910/09/1542811_52551961.shtml

作者:wj800 发表于2013-3-19 5:55:32 原文链接
阅读:0 评论:0 查看评论

    
[3]rebuild index VS. rebuild index online
    来源: 互联网  发布时间: 2013-11-15

create index和rebuild index时都会对原表加4号锁,对obj$加3号锁,阻止对原表的DML操作。

create index online 和 rebuild index online 采用新增一张临时表来处理创建或者重建索引时对原表索引列的修改,这样就可以不用锁表,保证原表的dml操作在过程中可以正常执行。

rebuild的过程用户仍然可以走旧的索引来查询,索引重建索引需要原来索引两倍的空间。


测试1:create表加锁

conn scott/tiger
select sid,username from v$session; 
create index test_index on test(name); 

SID USERNAME
------- -------------
    139

    143 SCOTT


SQL> SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=143;
  OBJECT_NAME LMODE
  ------------------------------ ----------
  OBJ$ 3

  TEST 4


测试2:rebuild online加锁

alter index test_index rebuild online;


SELECT OBJECT_NAME,LMODE FROM V$LOCK L,DBA_OBJECTS O WHERE O.OBJECT_ID=L.ID1 AND L.TYPE='TM' AND SID=143;
  OBJECT_NAME LMODE
  ------------------------------ ----------
  SYS_JOURNAL_10499 4
  TEST 2

附锁类型
                0, 'None',           
                1, 'Null',           
                2, 'Row-S (SS)',     
                3, 'Row-X (SX)',     
                4, 'Share',          
                5, 'S/Row-X (SSX)',  
                6, 'Exclusive',      

测试3:在online重建过程中,数据库是如何记录的。

首先创建一张大表,保证有足够的时间观察索引重建过程的细节。


SQL> create table test_rebuild as select * from dba_objects;
Table created.

SQL> insert into test_rebuild select * from test_rebuild;

6398 rows created.


SQL> /
409472 rows created.

SQL> commit;

Commit complete.


SQL> desc test_rebuild
 Name                                      Null?    Type
 ----------------------------------------- -------- ---------------------
 OWNER                                              VARCHAR2(30)
 OBJECT_NAME                                        VARCHAR2(128)
 SUBOBJECT_NAME                                     VARCHAR2(30)
 OBJECT_ID                                          NUMBER
 DATA_OBJECT_ID                                     NUMBER
 OBJECT_TYPE                                        VARCHAR2(18)
 CREATED                                            DATE
 LAST_DDL_TIME                                      DATE
 TIMESTAMP                                          VARCHAR2(19)
 STATUS                                             VARCHAR2(7)
 TEMPORARY                                          VARCHAR2(1)
 GENERATED                                          VARCHAR2(1)

 SECONDARY                                          VARCHAR2(1)


SQL> create index idx_rebuild on test_rebuild(object_name) ;

Index created.


接下来开始重头戏
开三个session

15:13:09 session1>alter index idx_rebuild rebuild online;


15:13:30 session2>select rowid,object_name from scott.test_rebuild where rownum<2;
ROWID              OBJECT_NAME
------------------ ---------------------------------------------------------

AAABoLAAFAAAAI0AAA old


15:13:41 session2> update scott.test_rebuild set object_name='new' where rownum<2;
1 row updated.


15:13:54 SQL> commit;

Commit complete.


15:13:57 session3> select * from scott.SYS_JOURNAL_6668;

C0       O      PTODE PARTNO RID

-------- - ---------- ---------------------------------

old      D          0 AAAAABAAFAAAAI0AAA

new      I          0 AAAAABAAFAAAAI0AAA


当session1报Index altered.再查询select * from scott.SYS_JOURNAL_6668;就会提示表不存在


可见oracle在修改到索引列的过程中会把修改的值写入一张临时创建的表SYS_JOURNAL_xxxx,xxxx表示索引的object_id,可以通过查询select index_name,object_id from user_objects 得到。比如例子中update操作,在临时创建表中记录了两个动作,一个旧值D代表删除,一个新值I代表插入,同时记录了修改的rowid。修改到非索引列时SYS_JOURNAL_xxxx不会有记录。


补充:如果建的是组合索引create index idx_rebuild on test_rebuild(object_name,status) online,则查询select * from scott.SYS_JOURNAL_6668;
C0                             C1      O     PARTNO RID
------------------------------ ------- - ---------- ------------------
new                            invalid I          0 BAEAAAAAFAAAAI0AAA
old                            invalid D          0 BAEAAAAAFAAAAI0AAA
建了两个列的组合索引,就会在临时创建表里有2个C开头的列
作者:jlhnxly 发表于2013-3-19 16:32:18 原文链接
阅读:7 评论:0
    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2017,169IT.COM,E-mail:www_169it_com#163.com(请将#改为@)

浙ICP备11055608号