piner的专栏

欢迎来到piner的Blog

原创 有关Oracle数据库的几个神话收藏

新一篇: 不是bug的bug?

1、RAC(or OPS in oracle 8i)
        RAC是盛传很久了的一个神话了,因为RAC对硬件的要求高,特别在9i版本以前,几乎都是跑在小型机上,因而,很多人就把RAC想成了稳定快速的代名词。实际上如此吗?其实我们应当先看看RAC的设计目的是什么:为了解决高可用性与高并发性,因此而不是整体性能的提升。在一定程度上来说,RAC比单个节点是要慢的,因为它比单节点多了节点之间的通信与管理。但是,正因为它的高可用性与大量并发连接的支持,所以,RAC应用才如此广泛,在多个性能比较差的机器上可以平均的分布负载,在一个节点故障的时候,其它的节点可以进行接管。但是RAC带来的却是管理的复杂,性能的降低(这个在OPS的OLTP系统中尤其明显,而在RAC中则好多了)。
2、分区(partition)
        有的时候,会有人问我:“我把我的一个大表分区了,应用的速度怎么慢了呢,我认为应当变快啊”,我则会问他的索引是本地索引吗?应用大部分是以分区关键字为查询条件吗?回答往往是:“对了,为了管理的方便,我们用了分区索引,我们只有一小部分查询是有分区条件的,大部分没有”。对了,到这里,就是原因所在了,分区不是fast=true参数,实际上,也根本没有这个参数。我们再看看分区的目的,为了DSS等数据仓库系统大型对象管理的方便性。分区最主要的两个作用就是高可管理性与可扩展性,并没有说性能的提升。因为大表的分区,我们可以方便的管理一个分区而不至于是整张表,但是,如果不是按照分区条件进行的查询,而索引又是本地索引,查询需要分开到多个本地索引树去扫描而不是一个索引树。
3、并行(parallel)
        今天随便翻了翻一本Oracle书,居然把这个词翻译为线索,当时查点没有晕背过去。并行也是广泛流传的一个神话。在说并行之前,我们先说一个工作分配的问题,有一个部门领导,下面有12个小兵(先这么说吧),有一天,来了一个小任务,其实他一个人一个小时就做完了,但是他非要分给下面12个人同时做,结果,开会->分工->分别行动->整合,整个过程下来,他们居然发现花了1个半小时,为什么?原因就是盲目的分工。并行查询就是这样,适合在数据仓库环境下,少量的并发连接用户,执行大的查询。如上面的例子,如果一个很大的工作,分配给12个人是好的。所以,在决定使用并行查询前需要考虑的问题是:会不会因为并行度占用资源较多,对其它用户造成影响,是不是一个大的,并行能提高查询速度的语句。除了并行查询,并行DDL则是对管理来说一个比较常用的减少维护时间的手段了。

发表于 @ 2004年10月27日 09:16:00|评论(loading...)|编辑

旧一篇: 怎么样正确的删除备用数据库的日志

评论

#Fenng 发表于2004-11-04 21:00:00  IP: 221.219.22.*
的确存在很多误解,

不过,分区+并行倒是一个不错的话题,利用好了,效果是不错的
#jametong 发表于2004-11-10 18:43:00  IP: 211.140.10.*
经常遇到的问题
#Kamus 发表于2004-11-12 00:38:00  IP: 61.51.141.*
分区中分开多个本地索引,或者使用分区的全局索引,在大量的insert或者update时,效率提升是明显的。减少了节点分裂的操作。
然而对于不使用分区键的select可能效果是不明显的。
#piner 发表于2004-11-17 16:02:00  IP: 218.108.88.*
本地索引在OLTP系统中的影响还是很大的。我倒不觉得本地索引对insert与update有多明显的效率提高。查询使用全局索引比本地索引的代价有时候要小很多倍,如从100个逻辑读降低到10个逻辑读的时候,可以说,这个效率提高在OLTP系统中是非常明显的。
#lijt 发表于2004-12-27 20:45:00  IP: 202.118.7.*
我在代码中加入内嵌触发器,编译不过去,但其他语句就可以。

代码:
EXEC SQL EXECUTE
CREATE OR REPLACE TRIGGER DB_STARTUP_TRIGGER
AFTER STARTUP ON DATABASE
BEGIN
INSERT INTO AUDIT_ORACLE
VALUES (SYSDATE);
END DB_STARTUP_TRIGGER;

END-EXEC;

不能正确执行,使用EXEC SQL 也不行?如何将触发器代码加入C代码中呢?你做过这样的代码吗?
#lijt 发表于2004-12-27 20:45:00  IP: 202.118.7.*
我在代码中加入内嵌触发器,编译不过去,但其他语句就可以。

代码:
EXEC SQL EXECUTE
CREATE OR REPLACE TRIGGER DB_STARTUP_TRIGGER
AFTER STARTUP ON DATABASE
BEGIN
INSERT INTO AUDIT_ORACLE
VALUES (SYSDATE);
END DB_STARTUP_TRIGGER;

END-EXEC;

不能正确执行,使用EXEC SQL 也不行?如何将触发器代码加入C代码中呢?你做过这样的代码吗?
#blue_prince 发表于2006-10-13 13:20:00  IP: 220.189.213.*
过来重温一下。师傅不写BLOG已经多年了:(
发表评论  


当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
Csdn Blog version 3.1a
Copyright © piner