存档
topSCN是什么
在《Concepts》中是这么描述SCN的:
A system change number (SCN) is a logical, internal timestamp used by Oracle Database. SCNs order events that occur within the database, which is necessary to satisfy the ACID properties of a transaction. Oracle Database uses SCNs to mark the SCN before which all changes are known to be on disk so that recovery avoids applying unnecessary redo. The database also uses SCNs to mark the point at which no redo exists for a set of data so that recovery can stop.
怎么理解这个“SCN(系统变更号)是供Oracle数据库使用的一个逻辑的、内部的时间戳”呢?要理解这个先需要理解Oracle中的事务(Transaction)和数据一致性(Data Consistency)的概念。
先说说数据一致性的概念。数据一致性指的是数据的可用性。比如说管理一个财务的系统,需要从A账户将100元转入到B账户,正常的操作是从A账户减去100元,然后给B账户加上100元,如果这两步操作都正常完成了,那我们可以说完成转账操作之后的数据是一致可用的;但是如果在操作的过程中出了问题,A账户的100元给减掉了,但是B账户却没有加上100元,这样的情况下产生的结果数据就有问题了,因为部分操作的失败导致了数据的不一致而不可用,在实际中肯定是要避免这种让数据不一致的情况发生的。在Oracle数据库中,保证数据一致性的方法就是事务。
事务是一个逻辑的、原子性的作业单元,通常由一个或者是多个SQL组成,一个事务里面的所有SQL操作要么全部失败回滚(Rollback),要么就是全部成功提交(Commit)。就像上面转账的例子,为保证数据的一致性,就需要将转账的两步操作放在一个事务里面,这样不管哪个操作失败了,都需要将所有已进行的操作回滚,以保证数据的可用性。进行事务管理是数据库区别于别的文件系统的一个最主要的特征,在数据库中事务最主要的作用就是保证了数据的一致性,每次事务的提交都是将数据库从一种一致性的状态带入到另外一种一致性的状态中,SCN就是用来对数据库的每个一致状态进行标记的,每当数据库进入到一个新的一致的状态,SCN就会加1,也就是每个提交操作之后,SCN都会增加。也许你会想为什么不直接记录事务提交时候的时间戳呢?这里面主要是涉及了两个问题,一个是时间戳记录的精度有限,再一个就是在分布式系统中记录时间戳会存在系统时钟同步的问题,详细的讨论可以查看Ordering Events in Oracle。
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/scn-basics.html
许多人都能很快的码出一些shell代码来完成简单的任务,而且这种写法将会一直持续下去。问题是编写的shell脚本经常会包含着许多足以导致脚本运行失败的细小的缺陷(subtle effects)。本文中我就将解释编写一个健壮的Bash脚本所需要的一些技术,告诉你是能做到将这些问题减少到最小的。
top使用set -u
你是否会经常遇到因为变量没有赋值而导致脚本无法成功运行的情况呢?反正我是经常的遇到。
chroot=$1 ... rm -rf $chroot/usr/share/doc
如果你在运行上述脚本的时候忘记了提供一个参数的话,最后的结果是你会把所有系统文档都删掉,而不是仅仅删除$chroot下指定的文档。那你该怎么办呢?还好,Bash提供了一个选项set -u,使用这个选项可以使脚本在使用未初始化的变量时直接退出。这个选项的另一个可读性更强点的写法是set -o nounset。
david% bash /tmp/shrink-chroot.sh $chroot= david% bash -u /tmp/shrink-chroot.sh /tmp/shrink-chroot.sh: line 3: $1: unbound variable david%
译者:马齿苋 | 链接:http://www.dbabeta.com/2010/writing-robust-shell-scripts.html
作者:David Pashley | 原文:http://www.davidpashley.com/articles/writing-robust-shell-scripts.html
本文记录的是本人近期阅读的Method R相关文章的一个汇总总结。
top关于Method R
Method R最早由Cary Millsap以及Jeff Holt在他们2003年出版的书《Optimizing Oracle Performance》中提出,这种方法提出之初是“To create a performance optimization method that works and that can be taught effectively to the typical Oracle database administrator. (OOP序言)”,就是说这方法是为Oracle性能优化而建,但在从最近Cary Millsap的访谈和他的最新文章Thinking Clearly about Performance中可以看到他已经将Method R的应用从Oracle数据库扩展到了电脑软件甚至是一切流程的优化上,当然他的公司Method R Corporation也是为此而建的。
topThinking Clearly About Performance
Thinking Clearly about Performance可以认为是《Optimizing Oracle Performance》中关于Method R的一个简化版,如果没有看过OOP的话,仔细的阅读这篇文章也能对Method R有深刻的理解。
文章的大概总结:
- 什么是性能:性能就是完成一个指定任务的时间,性能就是时间
- 性能的衡量与描述: 响应时间和吞吐率,这两个是相关的,但却不似线性相关
- 分析性能问题:序列图能直观的表现一个任务的响应时间,但是却仅限于简单的任务。Profile才是分析响应时间的好工具。
- 解决性能问题:阿姆达尔定律、风险管理、效率这几个都是在考虑解决性能问题方案时候必须要注意的问题。
- 负载的衡量:负载可以说的系统资源的利用率,由排队论知道负载对于响应时间有着巨大的影响。排队延时和资源拐点论是在进行容量规划时必须考虑的问题,容量规划最重要的一点就是保证系统在运营高峰期时的资源消耗不会越过拐点。
- 竞争延时:并行处理的系统中除了排队延时之外还有个影响很大的就是竞争延时,M/M/m理论中的多个通道是相互独立的,而实际系统中却不是这样,并行的进行总会在一些公共资源上发生竞争,而且最严重的就是这种竞争根本无可预测性,因为其中会有人为的因素在里边。
- 性能的测试和测量:测试需要根据实际系统的情况来进行,要求高的测试多,要求低的测试少。性能测量是要注意必须要测量那些应该测量的,而不是只捡简单事情做,代理测量是很多错误判断的来源。
- 性能应该作为软件的特性:考虑性能问题不能在软件成型之后,而是在软件设计之初就要考虑到的,在代码编写的过程中就将插桩代码作为软件的一部分,这样系统成型之后就能很方便的查找性能问题。将性能测量代码写入软件中最终能使你的系统永远的都能以最快的速度跑起来,而不至于因为性能不好而抓瞎。
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/readings-on-method-r.html
top测试环境
SQL> SELECT * FROM v$version; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 - 64bit Production PL/SQL Release 11.1.0.7.0 - Production CORE 11.1.0.7.0 Production TNS for Linux: Version 11.1.0.7.0 - Production NLSRTL Version 11.1.0.7.0 - Production
top参数FastStartFailoverPmyShutdown的作用
在10G的时候,当Primary与Standby和Observer同时失去联系了之后(Primary被隔离了),它自己会自动关闭数据库,因为这个时候Primary并不知道这个Standby是否已经自动转换为了新的Primary,自动关闭目的是减少同时两个Primary存在所造成的数据不一致。这个行为在10G的时候是不可控的,从11G开始,Oracle提供了参数FastStartFailoverPmyShutdown来确定在Primary被隔离之后Primary应该采取什么操作,下面是文档中关于FastStartFailoverPmyShutdown的说明:
9.2.13 FastStartFailoverPmyShutdown
The FastStartFailoverPmyShutdown configuration property causes the primary database to shut down if Fast-start failover is enabled and V$DATABASE.FS_FAILOVER_STATUS indicates the primary has been STALLED for longer than FastStartFailoverThreshold seconds. A value of TRUE helps to ensure that an isolated primary database cannot satisfy user queries.
This property cannot be used to prevent the primary database from shutting down if a Fast-start failover occurred because a user configuration condition was detected or was requested by an application by calling the DBMS_DG.INITIATE_FS_FAILOVER function
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/test-on-faststartfailoverpmyshutdown.html
Array Fetch Size这个参数决定了客户端一次从数据库获取数据的行数,写过访问Oracle数据库程序的人可能会发现Array Fetch Size在默认情况下设置的值都比较小,当他把Array Fetch Size设定值加大之后,自己的程序明显的跑的更快了。既然越大Array Fetch Size对于程序运行越快,那为什么默认的Array Fetch Size值会那么小,多大的Array Fetch Size值才是个合适的呢?本文就试图探索下这方面的内容。
top测试环境
ORAINST@orcl> SELECT * FROM v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod PL/SQL Release 10.2.0.2.0 - Production CORE 10.2.0.2.0 Production TNS for Linux: Version 10.2.0.2.0 - Production NLSRTL Version 10.2.0.2.0 - Production
oracle@orainst[orcl]:~$ uname -a Linux orainst.desktop.mycompany.com 2.4.21-50a6smp #1 SMP Wed Oct 3 18:57:25 PDT 2007 i686 i686 i386 GNU/Linux oracle@orainst[orcl]:~$ cat /etc/redhat-release Red Hat Enterprise Linux WS release 3 (Taroon Update 4)
top不同Array Fetch Size下的统计输出
SQLPlus中可以自由的设定Array Fetch Size的大小,因此我们的实验都是基于SQLPlus来完成的,实际上不管是什么类型客户端还是自己基于OCI写程序,都是能单独设置Array Fetch Size的,SQLPlus设置方法为SET ARRAYSIZE number,默认情况下的Array Fetch Size大小为15,最大值允许设置的值是5000,可以通过SHOW ARRAYSIZE来查看当前使用的值。
现在来建立一个测试表,然后设定不同Array Fetch Size,在观察不同情况下查询输出的统计数据有什么样的区别。
首先建立测试数据:
-- 创建测试表 ORAINST@orcl> CREATE TABLE t AS SELECT * FROM all_objects; Table created. -- 表建立完毕之后打开统计输出 ORAINST@orcl> SET AUTOT TRACE STATISTICS ORAINST@orcl> SET TIMING ON
作者:马齿苋 | 链接:http://www.dbabeta.com/2010/array-fetch-size-study.html
【译注】作为Oracle领域中神级的大牛Jonathan Lewis竟然也开始给SQL Server的用户写起文章来了,这实在是SQL Server社区的一个大好消息。现在这篇文章就是Jonathan写给SQL Server用户的第一篇文章,他文中通过一个详尽的例子给大家展示了一种高效SQL的可视化设计方法。正如文中所说的那样,这种设计高效SQL的方法的基本思想上是独立于数据库的,只有在实际进行SQL编码时才会涉及一些特定数据库的知识,因此这篇文章也是适合使用其它类型数据库的用户阅读。
有时候,在解决一个复杂的、有性能问题的查询时,把手从键盘上拿开,代之于拿起纸笔,会是个更好的方法。通过图表的方式把相关的表、连接、数据量以及索引都画出来,你就能更直观的找到可能会相对更有效率的查询表的路径。
人们经常说SQL是一种描述性的语言,你不需要告诉它怎么去取你要的数据,只需要描述清楚就行了。这点是没错的:只要描述好你要什么们你就能得到,但是却不能保证你能以你希望的速度和成本得到它。这就有点像你在一个陌生的城市打车,你把目的地告诉司机之后就只能寄希望于司机能给你选择一个最好的路线把你送到了,但是如果你没有提供给司机一些你期望走的路线的线索的话,很有可能你打车所花的钱和时间都会比你想象的多。
不管优化器能做到多好,都将会出现一些优化器算法无法应付你的要求的情况。这可能是现有统计数据的误导,或者是优化器针对你的数据做了些错误的假设,而你要做的就是找出一种能正确引导优化器的方法。
译者:马齿苋 | 链接:http://www.dbabeta.com/2010/designing-efficient-sql.html
作者:Jonathan Lewis | 原文:http://www.simple-talk.com/sql/performance/designing-efficient-sql-a-visual-approach/
topTest environment
SELECT @@VERSION --------------------------------------------------------------------------- Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
topTest table script and some data
Table script:
USE tempdb
GO
DROP TABLE tmp
CREATE TABLE tmp (id INT, c CHAR(900))
CREATE CLUSTERED INDEX CI_C ON tmp(c)
DECLARE @i INT
SET @i=0
WHILE @i<100000
BEGIN
INSERT INTO tmp(id, c)
SELECT @i, CAST(RAND()*100000 AS VARCHAR)
SET @i=@i+1
END
近期评论