首页 | 摘要显示 | 上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 下一页

DBA Archives

September 4, 2006

Linux裸设备在Oracle 10.2.0.2版本中要过时了

    从Metalink(Notes: 357492.1, 发布于28-Jun-2006)来看, 在Linux的2.6内核版本上安装Oracle 10.2.0.2以上版本时, 可以不使用Linux的裸设备了, 而采用O_DIRECT方式来访问块设备. 具体可以有以下方法:

  • 直接访问块设备
  • 用ASMLib映射的设备
  • 用OCFS2的设备(OCFS还没有通过认证)
  • 如果单结点, 可直接用LVM2卷管理下的块设备

    这对于Linux的Oracle来说实在是件好事, Linux上的裸设备和传通的Unix上的裸设备有很大的不同, 是不太方便使用的. 如果你的Linux上的Oracle系统要打算升级, 不如考虑这个功能.

    如要在LVM2下直接使用这个功能, 请先详细了解一下LVM2的操作.

September 14, 2006

通过改变SQL来简化工作, 减轻工作量(一)

    今天接到一个任务, 将在大约二十几个数据库中运行以下的两个SQL来取某个值, 这个表很大, 大约快100个G了, 因此是一件不小的任务.

SELECT /*+ FULL(T) PARALLEL(T,4) */  COUNT(*)
FROM BIGTABLE T
WHERE COL1 < 1000000000
  AND ......
/

SELECT /*+ FULL(T) PARALLEL(T,4) */  COUNT(*)
FROM BIGTABLE T
WHERE COL1 > 1000000000
  AND ......
/

    因此我将这两个SQL进行合并, 这样的话只需要运行一次全表扫描就行了, 在时间上节约上一半, DBA在接到一些任务时, 在做之前需要思考一下, 看看可不可以不改变语义的情况下, 使SQL更有效率地运行, 不能总说开发人员提供的SQL效率不行.

SELECT /*+ FULL(T) PARALLEL(T,4) */  
  SIGN(COL1 - 1000000000), COUNT(*)
FROM BIGTABLE T
WHERE ......
GROUP BY SIGN(COL1 - 1000000000)
/

    如果你能在应用正式跑之前, 改掉很多不好的SQL的话, 就是DBA价值的一个重大体现.

September 19, 2006

通过改变SQL来简化工作, 减轻工作量(二)

    Oracle的分析函数功能强大, 可以用于SQL的优化, 往往用普通的SQL需要好几次表扫描的, 用了分析函数后可以一句话轻松搞定. 我们来看一下统计学生成绩的例子吧.

    我不想专门建一个成绩表, 就用DBA_OBJECTS来表示吧, 用OBJECT_TYPE来表示班级或年级, 用OBJECT_ID余100的值来作成绩, 为了减少记录显示, 我只查了"TABLE"和"INDEX"两个班级, 通过使用WIDTH_BUCKET函数可以很容易地实现这一要求, 如下所示:

ASQL> SELECT CLASS_ID,SCORE_LEVEL,COUNT(*) NROWS
    2 FROM(
    3 SELECT
    4    OBJECT_TYPE CLASS_ID,
    5    WIDTH_BUCKET(MOD(OBJECT_ID,100),60,100,4) SCORE_LEVEL
    6 FROM DBA_OBJECTS WHERE OBJECT_TYPE IN ('TABLE','INDEX'))
    7 GROUP BY CLASS_ID,SCORE_LEVEL
    8 ORDER BY 1,2
    9 /

CLASS_ID SCORE_LEVEL NROWS
-------- ----------- -----
INDEX              0   826
INDEX              1   140
INDEX              2   143
INDEX              3   144
INDEX              4   158
TABLE              0   613
TABLE              1   129
TABLE              2   144
TABLE              3   124
TABLE              4   115

10 rows returned.

ASQL>

    WIDTH_BUCKET这个函数有四个参数, 第一个参数列名, 第二个为起始值, 第三个为结束值, 第四个为在这个范围内将值平均划分的份数. 拿这个例子来说, 在60和100之间分四份, 那么60-70时这个函数返回1, 70-80时返回2, 80-90时返回3, 90-100时返回4, 而小于60时则返回0, 大于100时返回5(分数加一). 这个结果可以说是一目了然.

    分析函数比较全面的介绍在Data Warehouse Guide这个文档中, 我大致地看过两次, 还是记不住, 用时总得临时查阅.

October 9, 2006

手工创建一个数据库的步骤参考

    下面介绍一下如何手工创建一个数据库的步骤:

    1,准备一个参数文件(init<SID>.ora), 应当主要包括以下参数.

compatible=10.2.0.1.0
remote_login_passwordfile=NONE
pga_aggregate_target=33554432
db_domain=""
db_name=LFXDB
control_files=()
java_pool_size=0
large_pool_size=0
shared_pool_size=80m
open_cursors=300
undo_management=AUTO
undo_tablespace=UNDOTBS1
background_dump_dest=
core_dump_dest=
user_dump_dest=
processes=45
sessions=55
db_block_size=8192
db_cache_size=50331648
db_file_multiblock_read_count=8

    2,预建好数据文件目录, 及各种trace文件的目录(BACKGROUND_DUMP_DEST, CORE_DUMP_DEST, USER_DUMP_DEST).

    3,在Windows上首先要注册一个服务, 并启动这个服务, 在Linux/Unix上则不需要这一步. Windows上注册服务的命令如下:

ORADIM -NEW -SID <SID>
ORADIM -STARTUP -SID <SID>

    4,连接到空的数据库(sqlplus "/ as sysdba"), 运行创建数据库的命令.

阅读全文

October 10, 2006

如何将Oracle的数据导成Excel中的CSV格式?

    在网上看到有人问如何导出数据成Excel的CSV格式文件, 其实CSV格式只不过是以逗号分隔字段的文件本件, 用Spool或用ociuldr都可以很容易地将数据生成这种格式的文本文件. 用ociuldr的例子如下:

C:\TEMP>ociuldr user=anysql/anysql@test query="select * from tab" field=, file=anysql_tab.csv
    3100 bytes allocated for column TNAME (1)
     800 bytes allocated for column TABTYPE (2)
    4100 bytes allocated for column CLUSTERID (3)

       0 rows exported at 2006-10-10 16:37:50
      21 rows exported at 2006-10-10 16:37:51

    ociuldr是我的一个免费工具, 导出大量数据时的速度比Spool快速多了, 用来从Oracle中导出数据到格式化文本文件的小工具. 欢迎使用!

上一页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 下一页

当前分类: DBA

Creative Commons License
本站版权: 共用创作 CC
署名-非商业性-相同方式分享
本站基于MT-3.36免费版
(©)版权所有, 2004 - 2008, www.AnySQL.net, 保留所有权利.
MSN: loufangxin(a)msn.com, Mail: anysql(at)126.com/support(at)iamdba.com, Skype ID:anysql