??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品第一国产综合精品99,亚洲一区二区三区国产精品,日本亚洲色大成网站www久久http://www.tkk7.com/envoydada/category/32101.htmlzh-cnMon, 05 Jul 2010 21:34:09 GMTMon, 05 Jul 2010 21:34:09 GMT60Mongodb Import Export Toolshttp://www.tkk7.com/envoydada/archive/2010/07/05/325305.htmlDerek.GuoDerek.GuoMon, 05 Jul 2010 09:52:00 GMThttp://www.tkk7.com/envoydada/archive/2010/07/05/325305.htmlhttp://www.tkk7.com/envoydada/comments/325305.htmlhttp://www.tkk7.com/envoydada/archive/2010/07/05/325305.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/325305.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/325305.html

Import Export Tools

These tool just work with the raw data (the documents in the collection); they do not save, or load, the metadata like the defined indexes or (capped) collection properties. You will need to (re)create those yourself in a separate step, before loading that data. Vote here to change this.

mongoimport

This utility takes a single file that contains 1 JSON/CSV/TSV string per line and inserts it. You have to specify a database and a collection.

options:
            --help                  produce help message
            -v [ --verbose ]        be more verbose (include multiple times for more
            			    verbosity e.g. -vvvvv)
            -h [ --host ] arg       mongo host to connect to ("left,right" for pairs)
            -d [ --db ] arg         database to use
            -c [ --collection ] arg collection to use (some commands)
            -u [ --username ] arg   username
            -p [ --password ] arg   password
            --dbpath arg            directly access mongod data files in the given path,
            			    instead of connecting to a mongod instance - needs to
            			    lock the data directory, so cannot be used if a
            			    mongod is currently accessing the same path
            --directoryperdb        if dbpath specified, each db is in a separate
            directory
            -f [ --fields ] arg     comma seperated list of field names e.g. -f name,age
            --fieldFile arg         file with fields names - 1 per line
            --ignoreBlanks          if given, empty fields in csv and tsv will be ignored
            --type arg              type of file to import.  default: json (json,csv,tsv)
            --file arg              file to import from; if not specified stdin is used
            --drop                  drop collection first
            --headerline            CSV,TSV only - use first line as headers
            

mongoexport

This utility takes a collection and exports to either JSON or CSV. You can specify a filter for the query, or a list of fields to output.

Neither JSON nor TSV/CSV can represent all data types. Please be careful not to lose or change data (types) when using this. For full fidelity please use mongodump.

If you want to output CSV, you have to specify the fields in the order you want them.

Example

options:
            --help                  produce help message
            -v [ --verbose ]        be more verbose (include multiple times for more
            			    verbosity e.g. -vvvvv)
            -h [ --host ] arg       mongo host to connect to ("left,right" for pairs)
            -d [ --db ] arg         database to use
            -c [ --collection ] arg collection to use (some commands)
            -u [ --username ] arg   username
            -p [ --password ] arg   password
            --dbpath arg            directly access mongod data files in the given path,
            			    instead of connecting to a mongod instance - needs to
            			    lock the data directory, so cannot be used if a
            			    mongod is currently accessing the same path
            --directoryperdb        if dbpath specified, each db is in a separate
            directory
            -q [ --query ] arg      query filter, as a JSON string
            -f [ --fields ] arg     comma seperated list of field names e.g. -f name,age
            --csv                   export to csv instead of json
            -o [ --out ] arg        output file; if not specified, stdout is used
            

mongodump

This takes a database and outputs it in a binary representation. This is mostly used for doing hot backups of a database.

If you're using sharding and try to migrate data this way, this will dump shard configuration information and overwrite configurations upon restore.
options:
            --help                   produce help message
            -v [ --verbose ]         be more verbose (include multiple times for more
            			     verbosity e.g. -vvvvv)
            -h [ --host ] arg        mongo host to connect to ("left,right" for pairs)
            -d [ --db ] arg          database to use
            -c [ --collection ] arg  collection to use (some commands)
            -u [ --username ] arg    username
            -p [ --password ] arg    password
            --dbpath arg             directly access mongod data files in the given path,
            			     instead of connecting to a mongod instance - needs
            			     to lock the data directory, so cannot be used if a
            				     mongod is currently accessing the same path
            --directoryperdb         if dbpath specified, each db is in a separate
            directory
            -o [ --out ] arg (=dump) output directory
            

Example: Dumping Everything

To dump all of the collections in all of the databases, run mongodump with just the --host:

$ ./mongodump --host prod.example.com
            connected to: prod.example.com
            all dbs
            DATABASE: log    to   dump/log
            log.errors to dump/log/errors.bson
            713 objects
            log.analytics to dump/log/analytics.bson
            234810 objects
            DATABASE: blog    to    dump/blog
            blog.posts to dump/log/blog.posts.bson
            59 objects
            DATABASE: admin    to    dump/admin
            

You'll then have a folder called "dump" in your current directory.

If you're running mongod locally on the default port, you can just do:

$ ./mongodump
            

Example: Dumping a Single Collection

If we just want to dump a single collection, we can specify it and get a single .bson file.

$ ./mongodump --db blog --collection posts
            connected to: 127.0.0.1
            DATABASE: blog        to     dump/blog
            blog.posts to dump/blog/posts.bson
            59 objects
            

mongorestore

This takes the output from mongodump and restores it.

usage: ./mongorestore [options] [directory or filename to restore from]
            options:
            --help                  produce help message
            -v [ --verbose ]        be more verbose (include multiple times for more
            			    verbosity e.g. -vvvvv)
            -h [ --host ] arg       mongo host to connect to ("left,right" for pairs)
            -d [ --db ] arg         database to use
            -c [ --collection ] arg collection to use (some commands)
            -u [ --username ] arg   username
            -p [ --password ] arg   password
            --dbpath arg            directly access mongod data files in the given path,
            				    instead of connecting to a mongod instance - needs to
            				    lock the data directory, so cannot be used if a
            			    mongod is currently accessing the same path
            --directoryperdb        if dbpath specified, each db is in a separate
            directory
            --drop                  drop each collection before import
            --objcheck              validate object before inserting


Derek.Guo 2010-07-05 17:52 发表评论
]]>
Mongodb dbshell Referencehttp://www.tkk7.com/envoydada/archive/2010/07/05/325266.htmlDerek.GuoDerek.GuoMon, 05 Jul 2010 03:15:00 GMThttp://www.tkk7.com/envoydada/archive/2010/07/05/325266.htmlhttp://www.tkk7.com/envoydada/comments/325266.htmlhttp://www.tkk7.com/envoydada/archive/2010/07/05/325266.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/325266.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/325266.html阅读全文

Derek.Guo 2010-07-05 11:15 发表评论
]]>
转mongodb入门http://www.tkk7.com/envoydada/archive/2010/06/23/324266.htmlDerek.GuoDerek.GuoWed, 23 Jun 2010 07:40:00 GMThttp://www.tkk7.com/envoydada/archive/2010/06/23/324266.htmlhttp://www.tkk7.com/envoydada/comments/324266.htmlhttp://www.tkk7.com/envoydada/archive/2010/06/23/324266.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/324266.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/324266.html阅读全文

Derek.Guo 2010-06-23 15:40 发表评论
]]>
Mongodb Dynamic querys selecthttp://www.tkk7.com/envoydada/archive/2010/06/23/324255.htmlDerek.GuoDerek.GuoWed, 23 Jun 2010 06:13:00 GMThttp://www.tkk7.com/envoydada/archive/2010/06/23/324255.htmlhttp://www.tkk7.com/envoydada/comments/324255.htmlhttp://www.tkk7.com/envoydada/archive/2010/06/23/324255.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/324255.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/324255.htmlMySQL:
    
SELECT * FROM user
Mongo:    
    db.
user.find()


MySQL:
    
SELECT * FROM user WHERE name = 'foobar'
Mongo:    
    db.
user.find({'name' : 'foobar'})


MySQL:
    
INSERT INOT user (`name`, `age`) values ('foobar',25)
Mongo:    
   db.
user.insert({'name' : 'foobar''age' : 25})


if you want add a  column `email` on MySQL,you must :
   
ALTER TABLE user….
But 
in Mongo,you can just:    
  db.
user.insert({'name' : 'foobar''age' : 25'email' : 'foo@bar.com'})


MySQL:
    
DELETE * FROM user
Mongo:    
    db.
user.remove({})


MySQL:
    
DELETE FROM user WHERE age < 30
Mongo:    
    db.
user.remove({'age' : {$lt : 30}})

$gt : 
> ; $gte : >= ; $lt : < ; $lte : <= ; $ne : !=


MySQL:
    
UPDATE user SET `age` = 36 WHERE `name` = 'foobar'
Mongo:    
    db.
user.update({'name' : 'foobar'}, {$set : {'age' : 36}})


MySQL:
    
UPDATE user SET `age` = `age` + 3 WHERE `name` = 'foobar'
Mongo:    
   db.
user.update({'name' : 'foobar'}, {$inc : {'age' : 3}})

        See more @ http:
//www.mongodb.org/display/DOCS/Updating


MySQL:
    
SELECT COUNT(*FROM user WHERE `name` = 'foobar'
Mongo:    
    db.
user.find({'name' : 'foobar'}).count() ?db.user.count({name:'foobar'});


MySQL:
    
SELECT * FROM user limit 10,20
Mongo:    
   db.
user.find().skip(10).limit(20)


MySQL:
    
SELECT * FROM user WHERE `age` IN (2535,45)
Mongo:    
    db.
user.find({'age' : {$in : [25, 35, 45]}})


MySQL:
    
SELECT * FROM user ORDER BY age DESC
Mongo:    
    db.
user.find().sort({'age' : -1})


MySQL:
    
SELECT DISTINCT(name) FROM user WHERE age > 20
Mongo:    
   db.
user.distinct('name', {'age': {$lt : 20}})


MySQL:
    
SELECT name, sum(marks) FROM user GROUP BY name
Mongo:    
    db.
user.group({
        
key : {'name' : true},
        cond: {
'name' : 'foo'},
        reduce: 
function(obj,prev) { prev.msum += obj.marks; },
        initial: {msum : 
0}
    });


MySQL:
    
SELECT name FROM user WHERE age < 20
Mongo:    
   db.
user.find('this.age < 20', {name : 1})

Derek.Guo 2010-06-23 14:13 发表评论
]]>
mysql常用的hinthttp://www.tkk7.com/envoydada/archive/2010/04/08/317718.htmlDerek.GuoDerek.GuoThu, 08 Apr 2010 06:24:00 GMThttp://www.tkk7.com/envoydada/archive/2010/04/08/317718.htmlhttp://www.tkk7.com/envoydada/comments/317718.htmlhttp://www.tkk7.com/envoydada/archive/2010/04/08/317718.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/317718.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/317718.htmlmysql常用的hint

对于l常使用oracle的朋友可能知道,oracle的hint功能U类很多Q对于优化sql语句提供了很多方法。同P在mysql里,也有cM的hint功能。下面介l一些常用的?/p>

强制索引 FORCE INDEX

SELECT * FROM TABLE1 FORCE INDEX (FIELD1) …

以上的SQL语句只用徏立在FIELD1上的索引Q而不使用其它字段上的索引?/p>

忽略索引 IGNORE INDEX

SELECT * FROM TABLE1 IGNORE INDEX (FIELD1, FIELD2) …

在上面的SQL语句中,TABLE1表中FIELD1和FIELD2上的索引不被使用?/p>

关闭查询~冲 SQL_NO_CACHE

SELECT SQL_NO_CACHE field1, field2 FROM TABLE1;

有一些SQL语句需要实时地查询数据Q或者ƈ不经怋用(可能一天就执行一两次Q?q样需要把~冲关了,不管q条SQL语句是否被执行过Q服务器都不会在~冲Z查找Q每ơ都会执行它?/p>

强制查询~冲 SQL_CACHE

SELECT SQL_CALHE * FROM TABLE1;

如果在my.ini中的query_cache_type设成2Q这样只有在使用了SQL_CACHE后,才用查询缓册Ӏ?/p>

优先操作 HIGH_PRIORITY

HIGH_PRIORITY可以使用在select和insert操作中,让MYSQL知道Q这个操作优先进行?/p>

SELECT HIGH_PRIORITY * FROM TABLE1;

滞后操作 LOW_PRIORITY

LOW_PRIORITY可以使用在insert和update操作中,让mysql知道Q这个操作滞后?/p>

update LOW_PRIORITY table1 set field1= where field1= …

延时插入 INSERT DELAYED

INSERT DELAYED INTO table1 set field1= …

INSERT DELAYED INTOQ是客户端提交数据给MySQLQMySQLq回OK状态给客户端。而这是ƈ不是已经数据插入表Q而是存储在内存里面等待排队。当mysql有空余时Q再插入。另一个重要的好处是,来自许多客户端的插入被集中在一Pq被~写入一个块。这比执行许多独立的插入要快很多。坏处是Q不能返回自动递增的IDQ以及系l崩溃时QMySQLq没有来得及插入数据的话Q这些数据将会丢失?/p>

强制q接序 STRAIGHT_JOIN

SELECT TABLE1.FIELD1, TABLE2.FIELD2 FROM TABLE1 STRAIGHT_JOIN TABLE2 WHERE …

׃面的SQL语句可知Q通过STRAIGHT_JOINMySQL按TABLE1、TABLE2的顺序连接表。如果你认ؓ按自q序比MySQL推荐的顺序进行连接的效率高的话,可以通过STRAIGHT_JOIN来确定连接顺序?/p>

强制使用临时?SQL_BUFFER_RESULT

SELECT SQL_BUFFER_RESULT * FROM TABLE1 WHERE …

当我们查询的l果集中的数据比较多Ӟ可以通过SQL_BUFFER_RESULT.选项强制结果集攑ֈ临时表中Q这样就可以很快地释放MySQL的表锁(q样其它的SQL语句可以对q些记录q行查询了)Qƈ且可以长旉Cؓ客户端提供大记录集?/p>

分组使用临时?SQL_BIG_RESULT?strong>SQL_SMALL_RESULT

SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM TABLE1 GROUP BY FIELD1;

一般用于分l或DISTINCT关键字,q个选项通知MySQLQ如果有必要Q就查询结果放C时表中,甚至在时表中进行排序。SQL_SMALL_RESULT比vSQL_BIG_RESULT差不多,很少使用?/p>

Derek.Guo 2010-04-08 14:24 发表评论
]]>
Mysql innodb引擎优化http://www.tkk7.com/envoydada/archive/2010/04/08/317716.htmlDerek.GuoDerek.GuoThu, 08 Apr 2010 06:15:00 GMThttp://www.tkk7.com/envoydada/archive/2010/04/08/317716.htmlhttp://www.tkk7.com/envoydada/comments/317716.htmlhttp://www.tkk7.com/envoydada/archive/2010/04/08/317716.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/317716.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/317716.html介绍Q?/span>
  InnoDBl?/span>MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全Q?/span>ACID兼容Q存储引擎?/span>InnoDB锁定在行Uƈ且也?/span>SELECT语句提供一?/span>Oracle风格一致的非锁定读。这些特色增加了多用户部|和性能。没有在InnoDB中扩大锁定的需要,因ؓ?/span>InnoDB中行U锁定适合非常的I间?/span>InnoDB也支?/span>FOREIGN KEY强制。在SQL查询中,你可以自由地?/span>InnoDBcd的表与其?/span>MySQL的表的类型؜合v来,甚至在同一个查询中也可以؜合?/span>
 Innodb 的创始hQ?/span>Heikki Tuuri
 Heikki Tuuri在テnnodb的Qug社区里也是很活跃的Q如果遇刎ug也可以直接提到社区,得到作者的解答?/span>

Z么要学习Qnnodb的调优:
  目前来说Q?/span>InnoDB是ؓMysql处理巨大数据量时的最大性能设计。它?/span>CPU效率可能是Q何其它基于磁盘的关系数据库引擎所不能Ҏ的。在数据量大的网站或是应用中Innodb是倍受青睐的?/span>
  另一斚wQ在数据库的复制操作?/span>Innodb也是能保?/span>master?/span>slave数据一致有一定的作用?/span>

参数调优内容Q?/span>
  1. 内存利用斚w
  2. 日值控制方?/span>
  3. 文gIO分配Q空间占用方?/span>
  4. 其它相关参数

Q?/span>.内存利用斚wQ?/span>
首先介绍一?/span>Innodb最重要的参敎ͼ
innodb_buffer_pool_size
  q个参数?/span>MyISAM?/span>key_buffer_size有相g处,但也是有差别的。这个参C要缓?/span>innodb表的索引Q数据,插入数据时的~冲。ؓInnodb加速优化首要参数?/span>
  该参数分配内存的原则Q这个参数默认分配只?/span>8MQ可以说是非常小的一个倹{如果是一个专用DQ服务器Q那么他可以占到内存?/span>70%-80%。这个参C能动态更改,所以分配需多考虑。分配过大,会Swap占用q多Q致?/span>Mysql的查询特慢。如果你的数据比较小Q那么可分配是你的数据大+Q0Q左叛_个参数的倹{例如:数据大小为5Q݋,那么l这个值分?/span>innodb_buffer_pool_sizeQ6Q݋
讄ҎQ?/span>
innodb_buffer_pool_size=4G
q个参数分配值的使用情况可以Ҏshow innodb status"G;中的
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 4668764894;

ȝ认用情c?/span>


W二个:
innodb_additional_mem_pool
Q?/span>
作用Q用来存?/span>Innodb的内部目?/span>
q个g用分配太大,pȝ可以自动调。不用设|太高。通常比较大数据设|?/span>16Q够用了Q如果表比较多,可以适当的增大。如果这个D动增加,会在error log有中昄的?/span>
分配原则Q?/span>
?/span>show innodb status"G;L看运行中的DQ是什么状态(参?/span>BUFFER POOL AND MEMORYD中Q,然后可以调整到适当的倹{?/span>
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 4668764894; in additional pool allocated 16777216
参考:in additional pool allocated 16777216
Ҏ你的参数情况Q可以适当的调整?/span>

讄ҎQ?/span>
innodb_additional_mem_pool=16M


Q?/span>.关于日值方面:
innodb_log_file_size
作用Q指定日值的大小
分配原则Q几个日值成员大加h差不多和你的innodb_buffer_pool_size相等。上限ؓ每个日g限大ؓ4G.一般控制在几个QOQ文件相加大在QG以内Z。具体情况还需要看你的事务大小Q数据大ؓ依据?/span>
说明Q这个值分配的大小和数据库的写入速度Q事务大,异常重启后的恢复有很大的关系?/span>
讄ҎQ?/span>
innodb_log_file_size=256M


innodb_log_files_in_group
作用Q指定你有几个日值组?/span>
分配原则Q 一般我们可以用Q-Q个日值组。默认ؓ两个?/span>
讄ҎQ?/span>
innodb_log_files_in_group=3


innodb_log_buffer_sizeQ?/span>
作用Q事务在内存中的~冲?/span>
分配原则Q控制在2-8M.q个g用太多的。他里面的内存一般一U钟写到盘一ơ。具体写入方式和你的事务提交方式有关。在Qracle{数据库了解q个Q一般最大指定ؓQ݋比较合适?br /> 参考:Innodb_os_log_written(show global status 可以拿到)
如果q个值增长过快,可以适当的增加innodb_log_buffer_size
另外如果你需要处理大理的Q_IQTQ或是QOQ字D,可以考虑增加q个参数的倹{?br /> 讄ҎQ?/span>

innodb_log_buffer_size=3M

innodb_flush_logs_at_trx_commit
作用Q控制事务的提交方式
分配原则Q这个参数只有3个|Q,Q,Q请认一下自已能接受的别。默认ؓQ,d请不要更改了?/span>

性能更高的可以设|ؓQ或是2Q但会丢׃U钟的事务?/span>
说明Q?/span>
q个参数的设|对Qnnodb的性能有很大的影响Q所以在q里l多说明一下?/span>
当这个gؓ
1Ӟinnodb 的事?/span>LOG在每ơ提交后写入日值文Ӟq对日值做h到磁盘。这个可以做C丢Q何一个事务?br /> 当这个gؓ2Ӟ在每个提交,日志~冲被写到文Ӟ但不Ҏ志文件做到磁盘操作的h,在对日志文g的刷新在gؓ2的情况也每秒发生一ơ。但需要注意的是,׃q程调用斚w的问题,q不能保证每U1Q0Q的发生。从而在性能上是最快的。但操作pȝ崩溃或掉甉|会删除最后一U的事务?br /> 当这个gؓ0Ӟ日志~冲每秒一ơ地被写到日志文Ӟq且Ҏ志文件做到磁盘操作的hQ但是在一个事务提交不做Q何操作?/span>mysqldq程的崩溃会删除崩溃前最后一U的事务?/span>

从以上分析,当这个g为1Ӟ可以取得较好的性能Q但遇到异常会有损失Q所以需要根据自已的情况去衡量?/span>


讄ҎQ?/span>
innodb_flush_logs_at_trx_commit=1

3. 文gIO分配Q空间占用方?/span>
innodb_file_per_table
作用Q每个Innodb的表Q有自已独立的表I间。如删除文g后可以回攉部分I间?br /> 分配原则Q只有用不使用。但Qq需要有一个公q表空间?/span>
讄ҎQ?/span>

innodb_file_per_table=1

innodb_file_io_threads
作用Q文件读写テQ数Q这个参数只?/span>Windows上v作用。在LINUX上只会等于4
讄ҎQ?/span>

innodb_file_io_threads=4

innodb_open_files
作用Q限?/span>Innodb能打开的表的数据?br /> 分配原则Q如果库里的表特别多的情况,请增加这个。这个值默认是Q0Q?/span>
讄ҎQ?/span>

innodb_open_files=800
请适当的增?/span>table_cache


4. 其它相关参数

q里说明一个比较重要的参数Q?/span>
innodb_flush_method
作用Qテnnodb和pȝ打交道的一个テQ模?/span>
分配原则Q?span style="color: black; font-family: Verdana">Windows
不用讄?br /> Qnix可以讄Qfsync() or O_SYNC/O_DSYNC
如果pȝ可以止pȝ的Eache那就把他了?br /> Qinux可以选择QO_DIRECT
直接写入盘Q禁止系lEache?br /> 讄ҎQ?/span>

innodb_flush_method=O_DIRECT

innodb_max_dirty_pages_pct
作用Q控?/span>Innodb的脏在~冲中在那个癑ֈ比之下,值在范围1-100,默认?0.
q个参数的另一个用处:当テnnodb的内存分配q大Q致使Swap占用严重时Q可以适当的减调整这个|使达刎ͼwap空间释攑և来。徏义:q个值最大在Q0Q,最在Q5Q。太大,~存中每ơ更新需要致换数据页太多Q太,攄数据太,更新操作太慢?br /> 讄ҎQ?/span>

innodb_max_dirty_pages_pct
Q?0
动态更攚w要有QIper权限:
set global innodb_max_dirty_pages_pct=50;



Derek.Guo 2010-04-08 14:15 发表评论
]]>
Oracle 10g Recycle Binhttp://www.tkk7.com/envoydada/archive/2008/06/18/208808.htmlDerek.GuoDerek.GuoWed, 18 Jun 2008 03:12:00 GMThttp://www.tkk7.com/envoydada/archive/2008/06/18/208808.htmlhttp://www.tkk7.com/envoydada/comments/208808.htmlhttp://www.tkk7.com/envoydada/archive/2008/06/18/208808.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/208808.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/208808.html在Oracle 10g数据库中Q引入了一个回收站(Recycle Bin)的数据库对象?

回收站,从原理上来说是一个数据字典表Q放|用户Drop掉的数据库对象信息。用戯行Drop操作的对象ƈ没有被数据库删除Q仍然会占用I间。除非是׃用户手工q行Purge或者因为存储空间不够而被数据库清掉。数据库有了q样的功能,能够减少很多不必要的ȝ。常常看到开发h员误把表删除Q急急忙忙找DBA 来想办法的情c相信随着10G的大范围应用Q这U情形应该比较少见了Q我们可以充分利?0g的闪?FLASHBACK)功能来避免大量的人工误操作?/p>

DBA理上的相关信息可以从USER_recyclebin(DBA_recyclebin)中获取?

Z便于试,我们创徏了一个表I间Foo,大小?M,创徏了一个用户Foo,默认的表I间为Foo.

SQL> CONNECT foo/foo;
Connected.
SQL> SELECT table_name FROM user_tables;
no rows selected
SQL>
SQL> DESC user_recyclebin
Name                                      Null?    Type
----------------------------------------- -------- -------------------
OBJECT_NAME                               NOT NULL VARCHAR2(30)
ORIGINAL_NAME                                      VARCHAR2(32)
OPERATION                                          VARCHAR2(9)
TYPE                                               VARCHAR2(25)
TS_NAME                                            VARCHAR2(30)
CREATETIME                                         VARCHAR2(19)
DROPTIME                                           VARCHAR2(19)
DROPSCN                                            NUMBER
PARTITION_NAME                                     VARCHAR2(32)
CAN_UNDROP                                         VARCHAR2(3)
CAN_PURGE                                          VARCHAR2(3)
RELATED                                   NOT NULL NUMBER
BASE_OBJECT                               NOT NULL NUMBER
PURGE_OBJECT                              NOT NULL NUMBER
SPACE                                              NUMBER
SQL>
user_recyclebin大多是自解释?相对比较Ҏ理解.
SQL> SELECT object_name FROM user_recyclebin;
no rows selected
SQL>
SQL> SELECT object_name FROM user_recyclebin;
no rows selected
SQL> CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> SELECT table_name FROM user_tables;
TABLE_NAME
----------------------------------------------
FOO
SQL> DROP TABLE foo;
Table dropped.
SQL> SELECT table_name FROM user_tables;
no rows selected
SQL> SHOW recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO              BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE        2004-10-30:14:37:39
SQL>
SQL*Plus命oSHOW recyclebin{h于这条SQL:
SQL> SELECT original_name, object_name, TYPE, droptime FROM user_recyclebin;
ORIGINAL_NAME   OBJECT_NAME                    TYPE       DROPTIME
--------------- ------------------------------ ---------- --------------------
FOO             BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE      2004-10-30:14:37:39
SQL>
SQL> DESC "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
Name                                      Null?    Type
----------------------------------------- -------- ----------------
DUMMY                                              VARCHAR2(1)
SQL>

当一个表被删除ƈUd?回收?中,它的名字要进行一些{换。这L目的显而易见是Z避免同类对象名称的重复?q一点和Windows操作pȝ的回收站不同QWindows中的回收站经q了Ҏ的处理,操作pȝ文g可以重名?

转换后的名字格式如下:

BIN$unique_id$version 
  • 其中BIN代表RecycleBin
  • unique_id是数据库中该对象的唯一标志Q?6个字W长?
  • version表示该对象的版本?/li>
注:?0g beta 版本中,名字格式如下Q?
RB$$objn$object_type$version
其中的RB,代表Recycle Bin. objn的目录对象号. object_type表示对象cd. version表示版本? 由数据库指定?/blockquote>下面我们验证一下回收站里数据库对象名字的唯一?
SQL>  CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> SELECT table_name FROM user_tables;
TABLE_NAME
------------------------------------------------------------
FOO
SQL> DROP TABLE foo;
Table dropped.
SQL> SHOW recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO              BIN$VL+ZsqVlQF6R2nYnwAqtvw==$0 TABLE        2004-10-30:15:01:42
FOO              BIN$V3f/oYUITrCEF2cotS5JaA==$0 TABLE        2004-10-30:14:37:39
SQL>

能看出来Q虽然源表名字相同,在回收站里的对象名字是不同的?

针对Recycle Bin对象的操?/h2>

已经攑ֈ回收站里的表是不能用drop 命o删除?注意对象名字上的双引?Q?

SQL> DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
2  /
DROP table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
*
ERROR at line 1:
ORA-38301: can not perform DDL/DML over objects in Recycle Bin
SQL>
如果要清掉该对象,使用purge命oQ?
SQL> PURGE table "BIN$V3f/oYUITrCEF2cotS5JaA==$0"
2  /
Table purged.
SQL> SELECT object_name, original_name FROM user_recyclebin;
OBJECT_NAME                    ORIGINAL_NAME
------------------------------ ---------------
BIN$VL+ZsqVlQF6R2nYnwAqtvw==$0 FOO
SQL>
对象已经清掉。如果直接清I所有的Recycle Bin中的对象Q?
SQL> PURGE RECYCLEBIN;
Recyclebin purged.
SQL> SELECT object_name, original_name FROM user_recyclebin;
no rows selected
SQL>
恢复表,用回闪表的功能:
SQL> FLASHBACK TABLE foo TO BEFORE DROP;
Flashback complete.
SQL>SELECT table_name FROM user_tables;
TABLE_NAME
------------------------------------------------------------
FOO
SQL>
??0g Beta版本中,使用Undrop命o来做到这一?
有的时候,可能同一个名字的表被删除到回收站?
SQL> DROP TABLE FOO;
Table dropped.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO              BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE        2004-10-30:15:18:03
SQL>  CREATE TABLE foo AS SELECT * FROM DUAL;
Table created.
SQL> DROP TABLE foo;
Table dropped.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO              BIN$J63QaUaKTmC1glat+imjeg==$0 TABLE        2004-10-30:15:18:50
FOO              BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE        2004-10-30:15:18:03
SQL> FLASHBACK TABLE FOO TO BEFORE DROP;
Flashback complete.
SQL> SHOW RECYCLEBIN
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
FOO              BIN$lfTbzOjISXaw8u0BIO7pNA==$0 TABLE        2004-10-30:15:18:03
SQL>

默认的恢复是W一个被删除的FOO表。如果要恢复指定的表Q可以在FLASHBACK TABLE 后面加上指定的RECYCLEBIN 参数指定其他的名?

SQL> FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP;
FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP
*
ERROR at line 1:
ORA-38312: original name is used by an existing object
SQL> FLASHBACK TABLE "BIN$lfTbzOjISXaw8u0BIO7pNA==$0" TO BEFORE DROP
2  RENAME TO foo2;
Flashback complete.
SQL>


Derek.Guo 2008-06-18 11:12 发表评论
]]>Oracle中分的?/title><link>http://www.tkk7.com/envoydada/archive/2008/06/16/208221.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Mon, 16 Jun 2008 01:27:00 GMT</pubDate><guid>http://www.tkk7.com/envoydada/archive/2008/06/16/208221.html</guid><wfw:comment>http://www.tkk7.com/envoydada/comments/208221.html</wfw:comment><comments>http://www.tkk7.com/envoydada/archive/2008/06/16/208221.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/envoydada/comments/commentRss/208221.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/envoydada/services/trackbacks/208221.html</trackback:ping><description><![CDATA[        在大型的企业应用或企业的数据库应用中,要处理的数据量通常可以辑ֈ几十到几百GBQ有的甚臛_以到TBU?虽然存储介质和数据处理技术的发展也很快,但是仍然不能满用户的需求,Z使用L大量的数据在d操作和查询中速度更快QOracle提供了对表和索引q行分区的技术,以改善大型应用系l的性能?br /> <br /> 使用分区的优点:<br />     1、增强可用性:如果表的某个分区出现故障Q表在其他分区的数据仍然可用Q?br />     2、维护方便:如果表的某个分区出现故障Q需要修复数据,只修复该分区卛_Q?br />     3、均衡I/OQ可以把不同的分区映到盘以^衡I/OQ改善整个系l性能Q?br />     4、改善查询性能Q对分区对象的查询可以仅搜烦自己兛_的分区,提高索速度?br /> <br />     Oracle数据库提供对表或索引的分区方法有三种Q?br />         1、范围分?br />         2、Hash分区Q散列分区)<br />         3、复合分?br /> <br />     下面以实例的方式分别对q三U分区方法来说明分区表的使用。ؓ了测试方便,我们先徏三个表空间?br /> create tablespace dinya_space01<br /> datafile '/test/demo/oracle/demodata/dinya01.dnf' size 50M<br /> <br /> create tablespace dinya_space01<br /> datafile '/test/demo/oracle/demodata/dinya02.dnf' size 50M<br /> <br /> create tablespace dinya_space01<br /> datafile '/test/demo/oracle/demodata/dinya03.dnf' size 50M<br /> <br />  <br /> 1  分区表的创徏Q?.1     范围分区<br />     范围分区是Ҏ据表中的某个值的范围q行分区Q根据某个值的范围Q决定将该数据存储在哪个分区上。如Ҏ序号分区Q根据业务记录的创徏日期q行分区{?br /> <br />     需求描qͼ有一个物料交易表Q表名:material_transactions。该表将来可能有千万U的数据记录数。要求在表的时候用分。这时候我们可以用序号分Z个区Q每个区中预计存储三千万的数据,也可以用日期分区,如每五年的数据存储在一个分Z?br /> <br /> Ҏ交易记录的序号分区徏表:<br /> SQL> create table dinya_test<br />   2  (<br />   3      transaction_id number primary key,<br />   4      item_id number(8) not null,<br />   5      item_description varchar2(300),<br />   6      transaction_date date  not null<br />   7  )<br />   8  partition by range (transaction_id)<br />   9  (<br />  10      partition part_01 values less than(30000000) tablespace dinya_space01,<br />  11      partition part_02 values less than(60000000) tablespace dinya_space02,<br />  12      partition part_03 values less than(maxvalue) tablespace dinya_space03<br />  13  );<br /> <br /> Table created.<br /> <br /> SQL><br /> <br /> 成功Q根据交易的序号Q交易ID在三千万以下的记录将存储在第一个表I间dinya_space01中,分区名ؓ:par_01Q在三千万到六千万之间的记录存储在第二个表空_dinya_space02中,分区名ؓQpar_02Q而交易ID在六千万以上的记录存储在W三个表I间dinya_space03中,分区名ؓpar_03.<br /> <br /> Ҏ交易日期分区Q?br /> SQL> create table dinya_test<br />   2  (<br />   3      transaction_id number primary key,<br />   4      item_id number(8) not null,<br />   5      item_description varchar2(300),<br />   6      transaction_date date not null   <br />   7  )<br />   8  partition by range (transaction_date)<br />   9  (<br />  10  partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace dinya_space01,<br />  11  partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd')) tablespace dinya_space02,<br />  12  partition part_03 values less than(maxvalue) tablespace dinya_space03<br />  13  );<br /> <br /> Table created.<br /> <br /> SQL><br /> <br /> q样我们分别徏了以交易序号和交易日期来分区的分。每ơ插入数据的时候,pȝ根据指定的字段的值来自动记录存储到制定的分区(表空_中?br /> <br />     当然Q我们还可以Ҏ需求,使用两个字段的范围分布来分区Q如partition by range ( transaction_id ,transaction_date),分区条g中的g做相应的改变Q请读者自行测试?br /> <br />  <br /> 1.2   Hash分区Q散列分区)<br />     散列分区为通过指定分区~号来均匀分布数据的一U分区类型,因ؓ通过在I/O讑֤上进行散列分区,使得q些分区大小一致。如物料交易表的数据根据交易ID散列地存攑֜指定的三个表I间中:<br /> SQL> create table dinya_test<br />   2  (<br />   3      transaction_id number primary key,<br />   4      item_id number(8) not null,<br />   5      item_description varchar2(300),<br />   6      transaction_date date<br />   7  )<br />   8  partition by hash(transaction_id)<br />   9  (<br />  10      partition part_01 tablespace dinya_space01,<br />  11      partition part_02 tablespace dinya_space02,<br />  12      partition part_03 tablespace dinya_space03<br />  13  );<br /> <br /> Table created.<br /> <br /> SQL><br /> <br />     成功Q此时插入数据,pȝ按transaction_id记录散列地插入三个分区中,q里也就是三个不同的表空间中?br /> <br /> 1.3    复合分区<br />     有时候我们需要根据范围分区后Q每个分区内的数据再散列地分布在几个表空间中Q这h们就要用复合分区。复合分区是先用范围分区,然后在每个分区内再用散列分区的一U分区方法,如将物料交易的记录按旉分区Q然后每个分Z的数据分三个子分区,数据散列地存储在三个指定的表空间中Q?br /> SQL> create table dinya_test<br />   2  (<br />   3      transaction_id number primary key,<br />   4      item_id number(8) not null,<br />   5      item_description varchar2(300),<br />   6      transaction_date date<br />   7  )<br />   8  partition by range(transaction_date)subpartition by hash(transaction_id)<br />   9      subpartitions 3 store in (dinya_space01,dinya_space02,dinya_space03)<br />  10  (<br />  11      partition part_01 values less than(to_date('2006-01-01','yyyy-mm-dd')),<br />  12      partition part_02 values less than(to_date('2010-01-01','yyyy-mm-dd')),<br />  13      partition part_03 values less than(maxvalue)<br />  14  );<br /> <br /> Table created.<br /> <br /> SQL><br /> <br />     该例中,先是Ҏ交易日期q行范围分区Q然后根据交易的ID记录散列地存储在三个表I间中?br /> <br />  <br /> 2    分区表操?br /> 以上了解了三U分的徏表方法,下面用实际的数据qҎ日期的范围分区来试分区表的数据记录的操作?br /> 2.1     插入记录Q?br /> SQL> insert into dinya_test values(1,12,'BOOKS',sysdate);<br /> 1 row created.<br /> SQL> insert into dinya_test values(2,12, 'BOOKS',sysdate+30);<br /> 1 row created.<br /> SQL> insert into dinya_test values(3,12, 'BOOKS',to_date('2006-05-30','yyyy-mm-dd'));<br /> 1 row created.<br /> SQL> insert into dinya_test values(4,12, 'BOOKS',to_date('2007-06-23','yyyy-mm-dd'));<br /> 1 row created.<br /> SQL> insert into dinya_test values(5,12, 'BOOKS',to_date('2011-02-26','yyyy-mm-dd'));<br /> 1 row created.<br /> SQL> insert into dinya_test values(6,12, 'BOOKS',to_date('2011-04-30','yyyy-mm-dd'));<br /> 1 row created.<br /> SQL> commit;<br /> Commit complete.<br /> SQL><br />     按上面的l果Q?006q前的数据将存储在第一个分区part_01上,?006q到2010q的交易数据存储在W二个分区part_02上,2010q以后的记录存储在第三个分区part_03上?br /> 2.2     查询分区表记录:<br /> SQL> select * from dinya_test partition(part_01);<br /> TRANSACTION_ID    ITEM_ID       ITEM_DESCRIPTION            TRANSACTION_DATE<br /> -------------------------------------------------------------------------------- <br />              1     12            BOOKS                      2005-1-14 14:19:<br />              2     12            BOOKS                      2005-2-13 14:19:<br /> SQL><br /> <br /> SQL> select * from dinya_test partition(part_02);<br /> TRANSACTION_ID     ITEM_ID      ITEM_DESCRIPTION            TRANSACTION_DATE<br /> -------------------------------------------------------------------------------- <br />              3      12            BOOKS                       2006-5-30<br />              4      12            BOOKS                       2007-6-23<br /> SQL><br /> <br /> SQL> select * from dinya_test partition(part_03);<br /> TRANSACTION_ID     ITEM_ID         ITEM_DESCRIPTION      TRANSACTION_DATE<br /> -------------------------------------------------------------------------------- <br />              5      12               BOOKS                 2011-2-26<br />              6      12               BOOKS                 2011-4-30<br /> SQL><br /> <br />     从查询的l果可以看出Q插入的数据已经Ҏ交易旉范围存储在不同的分区中。这里是指定了分区的查询Q当然也可以不指定分区,直接执行select * from dinya_test查询全部记录。在也检索的数据量很大的时候,指定分区会大大提高检索速度?br /> <br /> 2.3     更新分区表的记录Q?br /> SQL> update dinya_test partition(part_01) t set t.item_description='DESK' where t.transaction_id=1;<br /> 1 row updated.<br /> <br /> SQL> commit;<br /> Commit complete.<br /> SQL><br /> <br />     q里第一个分Z的交易ID=1的记录中的item_description字段更新?#8220;DESK”Q可以看到已l成功更C一条记录。但是当更新的时候指定了分区Q而根据查询的记录不在该分ZӞ不会更新数据,L下面的例子:<br /> <br /> SQL> update dinya_test partition(part_01) t set t.item_description='DESK' where t.transaction_id=6;<br /> <br /> 0 rows updated.<br /> <br /> SQL> commit;<br /> <br /> Commit complete.<br /> <br /> SQL><br /> <br /> 指定了在W一个分Z更新记录Q但是条件中限制交易ID?Q而查询全表,交易ID?的记录在W三个分ZQ这栯条语句将不会更新记录?br /> <br /> 2.4     删除分区表记录:<br /> SQL> delete from dinya_test partition(part_02) t where t.transaction_id=4;<br /> 1 row deleted.<br /> <br /> SQL> commit;<br /> Commit complete.<br /> <br /> SQL><br /> <br /> 上面例子删除了第二个分区part_02中的交易记录ID?的一条记录,和更新数据相同,如果指定了分区,而条件中的数据又不在该分ZӞ不会删除Q何数据?br /> <br />  <br /> 3     分区表烦引的使用Q?br /> 分区表和一般表一样可以徏立烦引,分区表可以创建局部烦引和全局索引。当分区中出现许多事务ƈ且要保证所有分Z的数据记录的唯一性时采用全局索引?br /> 3.1     局部烦引分区的建立Q?br /> SQL> create index dinya_idx_t on dinya_test(item_id)<br />   2  local<br />   3  (<br />   4     partition idx_1 tablespace dinya_space01,<br />   5     partition idx_2 tablespace dinya_space02,<br />   6     partition idx_3 tablespace dinya_space03<br />   7  );<br /> <br /> Index created.<br /> <br /> 看查询的执行计划Q从下面的执行计划可以看出,pȝ已经使用了烦引:<br /> SQL> select * from dinya_test partition(part_01) t where t.item_id=12;<br /> Execution Plan<br /> ----------------------------------------------------------<br />    0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=187)<br />    1    0   TABLE ACCESS (BY LOCAL INDEX ROWID) OF 'DINYA_TEST' (Cost=2 Card=1 Bytes=187)<br />    2    1     INDEX (RANGE SCAN) OF 'DINYA_IDX_T' (NON-UNIQUE) (Cost=1 Card=1)<br /> <br /> Statistics<br /> ----------------------------------------------------------<br />           0  recursive calls<br />           0  db block gets<br />           4  consistent gets<br />           0  physical reads<br />           0  redo size<br />         334  bytes sent via SQL*Net to client<br />         309  bytes received via SQL*Net from client<br />           2  SQL*Net roundtrips to/from client<br />           1  sorts (memory)<br />           0  sorts (disk)<br />           2  rows processed<br /> <br /> SQL><br /> <br />  <br /> 3.2     全局索引分区的徏立?br /> 全局索引建立时global 子句允许指定索引的范围|q个范围gؓ索引字段的范围|<br /> SQL> create index dinya_idx_t on dinya_test(item_id)<br />   2  global partition by range(item_id)<br />   3  (<br />   4     partition idx_1 values less than (1000) tablespace dinya_space01,<br />   5     partition idx_2 values less than (10000) tablespace dinya_space02,<br />   6     partition idx_3 values less than (maxvalue) tablespace dinya_space03<br />   7  );<br /> <br /> Index created.<br /> <br /> SQL> <br /> <br />     本例中对表的item_id字段建立索引分区Q当然也可以不指定烦引分区名直接Ҏ个表建立索引Q如Q?br /> SQL> create index dinya_idx_t on dinya_test(item_id);<br /> Index created.<br /> <br /> SQL> <br /> <br />     同样的,对全局索引Ҏ执行计划可以看出索引已经可以使用Q?br /> SQL> select * from dinya_test t where t.item_id=12;<br /> Execution Plan<br /> ----------------------------------------------------------<br />    0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=3 Bytes=561)<br />    1    0   TABLE ACCESS (BY GLOBAL INDEX ROWID) OF 'DINYA_TEST' (Cost =2 Card=3 Bytes=561)<br />    2    1     INDEX (RANGE SCAN) OF 'DINYA_IDX_T' (NON-UNIQUE) (Cost=1 Card=3)<br /> <br /> Statistics<br /> ----------------------------------------------------------<br />           5  recursive calls<br />           0  db block gets<br />          10  consistent gets<br />           0  physical reads<br />           0  redo size<br />         420  bytes sent via SQL*Net to client<br />         309  bytes received via SQL*Net from client<br />           2  SQL*Net roundtrips to/from client<br />           3  sorts (memory)<br />           0  sorts (disk)<br />           5  rows processed<br /> SQL><br /> <br /> 4     分区表的l护Q?br />     了解了分的徏立、烦引的建立、表和烦引的使用后,在应用的q要l常对分行维护和理。日常维护和理的内容包括:增加一个分区,合ƈ一个分区及删除分区{等。下面以范围分区Z说明增加、合q、删除分区的一般操作:<br /> 4.1     增加一个分?<br /> SQL> alter table dinya_test <br />   2  add partition part_04 values less than(to_date('2012-01-01','yyyy-mm-dd')) tablespace dinya_space03;<br /> <br /> Table altered.<br /> <br /> SQL><br /> <br />     增加一个分区的时候,增加的分区的条g必须大于现有分区的最大|否则pȝ提CORA-14074 partition bound must collate higher than that of the last partition 错误?br /> <br />     <br /> 4.2     合ƈ一个分区:<br /> SQL> alter table dinya_test merge partitions part_01,part_02 into partition part_02;<br /> <br /> Table altered.<br /> <br /> SQL> <br /> <br />     在本例中原有的表的part_01分区和part_02分区q行了合qӞ合ƈ后的分区为part_02,如果在合q的时候把合ƈ后的分区定ؓpart_01的时候,pȝ提CORA-14275 cannot reuse lower-bound partition as resulting partition 错误?br /> <br />  <br /> 4.3     删除分区Q?br /> SQL> alter table dinya_test drop partition part_01;<br /> <br /> Table altered.<br /> <br /> SQL><br /> <br />     删除分区表的一个分区后Q查询该表的数据时显C,该分Z的数据已全部丢失Q所以执行删除分区动作时要慎重,保先备份数据后再执行,或将分区合ƈ?br /> <br /> 5    ȝQ?br />     需要说明的是,本文在D例说名分事务操作的时候,都指定了分区Q因为指定了分区Q系l在执行的时候则只操作该分区的记录,提高了数据处理的速度。不要指定分区直接操作数据也是可以的。在分区表上建烦引及多烦引的使用和非分区表一栗此外,因ؓ在维护分区的时候可能对分区的烦引会产生一定的影响Q可能需要在l护之后重徏索引Q相兛_容请参考分索引部分的文档? <img src ="http://www.tkk7.com/envoydada/aggbug/208221.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/envoydada/" target="_blank">Derek.Guo</a> 2008-06-16 09:27 <a href="http://www.tkk7.com/envoydada/archive/2008/06/16/208221.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE CTXCAT-CATSEARCHhttp://www.tkk7.com/envoydada/archive/2008/06/12/207472.htmlDerek.GuoDerek.GuoThu, 12 Jun 2008 10:38:00 GMThttp://www.tkk7.com/envoydada/archive/2008/06/12/207472.htmlhttp://www.tkk7.com/envoydada/comments/207472.htmlhttp://www.tkk7.com/envoydada/archive/2008/06/12/207472.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/207472.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/207472.htmlCATSEARCH

Use the CATSEARCH operator to search CTXCAT indexes. Use this operator in the WHERE clause of a SELECT statement.

The grammar of this operator is called CTXCAT. You can also use the CONTEXT grammar if your search criteria requires special functionality,
such as thesaurus, fuzzy matching, proximity searching or stemming. To utilize the CONTEXT grammar,
use the Query Template Specification in the text_query parameter as described in this section.

About Performance

You use the CATSEARCH operator with a CTXCAT index mainly to improve mixed query performance. You specify your text query condition with text_query and your structured condition with structured_query.

Internally, Oracle Text uses a combined b-tree index on text and structured columns to quickly produce results satisfying the query.

Limitation

This operator does not support functional invocation.

Syntax

CATSEARCH(
[schema.]column,
text_query       VARCHAR2,
structured_query VARCHAR2,
RETURN NUMBER; 
[schema.]column

Specify the text column to be searched on. This column must have a CTXCAT index associated with it.

text_query

Specify one of the following to define your search in column.

CATSEARCH query operations

The CATSEARCH operator supports only the following query operations:

  • Logical AND
  • Logical OR (|)
  • Logical NOT (-)
  • " " (quoted phrases)
  • Wildcarding

These operators have the following syntax:

Operation Syntax Description of Operation

Logical AND

a b c

Returns rows that contain a, b and c.

Logical OR

a | b | c

Returns rows that contain a, b, or c.

Logical NOT

a - b

Returns rows that contain a and not b.

hyphen with no space

a-b

Hyphen treated as a regular character.

For example, if the hyphen is defined as skipjoin, words such as web-site are treated as the single query term website.

Likewise, if the hyphen is defined as a printjoin, words such as web-site are treated as web site in the CTXCAT query language.

" "

"a b c"

Returns rows that contain the phrase "a b c".

For example, entering "Sony CD Player" means return all rows that contain this sequence of words.

( )

(A B) | C

Parentheses group operations. This query is equivalent to the CONTAINS query (A &B) | C.

wildcard

(right and double truncated)

term*

a*b

The wildcard character matches zero or more characters.

For example, do* matches dog, and gl*s matches glass.

Left truncation not supported.

Note: Oracle recommends that you create a prefix index if your application uses wildcard searching. You set prefix indexing with the BASIC_WORDLIST preference.

Query Template Specification

You specify a marked-up string that specifies a query based on the CONTEXT grammar.
Use the following tags and attribute values which are case sensitive:

TAG Description Possible Values

<query> </query>

Signals that this query be interpreted as a query template.

<textquery> </textquery>

Specify the query string.

grammar=

Specify the grammar of the query.

CONTEXT

CTXCAT

<score></score>

Specify the score preference

datatype=

Specify the type of number returned as score.

INTEGER

FLOAT


structured_query

Specify the structured conditions and the ORDER BY clause.
There must exist an index for any column you specify. For example, if you specify 'category_id=1 order by bid_close',
you must have an index for 'category_id, bid_close' as specified with CTX_DDL.ADD_INDEX.

With structured_query, you can use standard SQL syntax with only the following operators:

  • =
  • <=
  • >=
  • >
  • <
  • IN
  • BETWEEN


Note:

You cannot use parentheses () in the structured_query parameter.


Examples

Create the Table

The following statement creates the table to be indexed.

CREATE TABLE auction (category_id number primary key, title varchar2(20),bid_close date);

The following table inserts the values into the table:

INSERT INTO auction values(1, 'Sony CD Player', '20-FEB-2000');
INSERT INTO auction values(2, 'Sony CD Player', '24-FEB-2000');
INSERT INTO auction values(3, 'Pioneer DVD Player', '25-FEB-2000');
INSERT INTO auction values(4, 'Sony CD Player', '25-FEB-2000');
INSERT INTO auction values(5, 'Bose Speaker', '22-FEB-2000');
INSERT INTO auction values(6, 'Tascam CD Burner', '25-FEB-2000');
INSERT INTO auction values(7, 'Nikon digital camera', '22-FEB-2000');
INSERT INTO auction values(8, 'Canon digital camera', '26-FEB-2000');

Create the CTXCAT Index

The following statements create the CTXCAT index:


begin
ctx_ddl.create_index_set('auction_iset');
ctx_ddl.add_index('auction_iset','bid_close');
end; 
CREATE INDEX auction_titlex ON auction(title) INDEXTYPE IS CTXCAT PARAMETERS ('index set auction_iset'); 
A typical query with CATSEARCH might include a structured clause as follows to 
find all rows that contain the word camera ordered by bid_close:
SELECT * FROM auction WHERE CATSEARCH(title, 'camera', 'order by bid_close
desc')> 0;
CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
8 Canon digital camera 26-FEB-00
7 Nikon digital camera 22-FEB-00

The following query finds all rows that contain the phrase Sony CD Player and that have a bid close date of February 20, 2000:

SELECT * FROM auction WHERE CATSEARCH(title, '"Sony CD Player"', 'bid_close=''20-FEB-00''')> 0;
CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
1 Sony CD Player       20-FEB-00
The following query finds all rows with the terms Sony and CD and Player:
SELECT * FROM auction WHERE CATSEARCH(title, 'Sony CD Player', 'order by bid_close desc')> 0;
CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
4 Sony CD Player       25-FEB-00
2 Sony CD Player       24-FEB-00
1 Sony CD Player       20-FEB-00
The following query finds all rows with the term CD and not Player:
SELECT * FROM auction WHERE CATSEARCH(title, 'CD - Player', 'order by bid_close
desc')> 0;
CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
6 Tascam CD Burner     25-FEB-00

The following query finds all rows with the terms CD or DVD or Speaker:

SELECT * FROM auction WHERE CATSEARCH(title, 'CD | DVD | Speaker', 'order by bid_close desc')> 0;
CATEGORY_ID TITLE                BID_CLOSE
----------- -------------------- ---------
3 Pioneer DVD Player   25-FEB-00
4 Sony CD Player       25-FEB-00
6 Tascam CD Burner     25-FEB-00
2 Sony CD Player       24-FEB-00
5 Bose Speaker         22-FEB-00
1 Sony CD Player       20-FEB-00
 

    --创徏索引?br />     ctx_ddl.create_index_set('CIRCLE_INDEX_SET');
    ctx_ddl.add_index('CIRCLE_INDEX_SET','CREATETIME');
   
    --创徏停用词列?br />     ctx_ddl.create_stoplist('TAG_STOPLIST', 'BASIC_STOPLIST');
    --d停用?br />     ctx_ddl.add_stopword('TAG_STOPLIST','游戏');
    --删除停用?br />     ctx_ddl.remove_stopword('TAG_STOPLIST','游戏');
    --删除停用词列?br />     ctx_ddl.drop_stoplist('TAG_STOPLIST');
  
   --查询ctx_stoplists和ctx_stopwords 视图
   SELECT * FROM ctx_stoplists;
   SELECT * FROM ctx_stopwords;
   --查看pȝ默认参数?br />    SELECT * FROM ctx_parameters;
   --查看索引集视?br />    SELECT * FROM ctx_index_sets

    --创徏全文索引
    CREATE INDEX CTXCAT_CIRCLE_TAG ON CIRCLE(TAG) INDEXTYPE IS CTXSYS.CTXCAT;
    --带停用词创徏索引
    create index CTXCAT_CIRCLE_TAG on CIRCLE(TAG) indextype is CTXSYS.CTXCAT
    parameters ('stoplist TAG_STOPLIST');
    --带烦引集创徏所?br />     CREATE INDEX CTXCAT_CIRCLE_TAG ON CIRCLE(TAG) INDEXTYPE IS CTXSYS.CTXCAT
    PARAMETERS ('index set CIRCLE_INDEX_SET');
   
    --删除索引
    DROP INDEX CTXCAT_CIRCLE_TAG;

   --重徏索引
   ALTER INDEX CTXCAT_CIRCLE_TAG REBUILD
      PARAMETERS ('REPLACE STOPLIST TAG_STOPLIST');

   
   select * from (select  row_.*, rownum rownum_ from(
        SELECT * FROM CIRCLE c
        WHERE CATSEARCH(TAG,'游戏|漫画|旅游','order by createtime DESC')>0
   ) row_  where rownum <= 10) where rownum_ >= 0



Derek.Guo 2008-06-12 18:38 发表评论
]]>ORACLE JOBShttp://www.tkk7.com/envoydada/archive/2008/06/12/207288.htmlDerek.GuoDerek.GuoThu, 12 Jun 2008 01:39:00 GMThttp://www.tkk7.com/envoydada/archive/2008/06/12/207288.htmlhttp://www.tkk7.com/envoydada/comments/207288.htmlhttp://www.tkk7.com/envoydada/archive/2008/06/12/207288.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/207288.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/207288.html一、设|初始化参数 job_queue_processes
  sql> alter system set job_queue_processes=n;Qn>0Q?br />   job_queue_processes最大gؓ1000
  
  查看job queue 后台q程
  sql>select name,description from v$bgprocess;
  
  二,dbms_job package 用法介绍
  包含以下子过E:
  
  Broken()q程?br />   change()q程?br />   Interval()q程?br />   Isubmit()q程?br />   Next_Date()q程?br />   Remove()q程?br />   Run()q程?br />   Submit()q程?br />   User_Export()q程?br />   What()q程?br />   
  1、Broken()q程更新一个已提交的工作的状态,典型地是用来把一个已破工作标Cؓ未破工作?br />   q个q程有三个参敎ͼjob 、broken与next_date?br />   
  PROCEDURE Broken (job    IN binary_integer,
           Broken  IN boolean,
           next_date IN date :=SYSDATE)
  
  job参数是工作号Q它在问题中唯一标识工作?br />   broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破Q而FLASE说明此工作将标记为未破?br />   next_date参数指示在什么时候此工作再ơ运行。此参数~省gؓ当前日期和时间?br />   job如果׃某种原因未能成功之行Qoracle重?6ơ后Q还未能成功执行Q将被标Cؓbroken重新启动状态ؓbroken的jobQ有如下两种方式;
  a、利用dbms_job.run()立即执行该job
    sql>begin
    sql>dbms_job.run(:jobno) 该jobno为submitq程提交时返回的job number
    sql>end;
    sql>/
  b、利用dbms_job.broken()重新broken标记为false
    sql>begin
    sql>dbms_job.broken (:job,false,next_date)
    sql>end;
    sql>/
  2、Change()q程用来改变指定工作的设|?br />   q个q程有四个参敎ͼjob、what 、next_date与interval?br />   
  PROCEDURE Change (job    IN binary_integer,
           What    IN varchar2,
           next_date IN date,
           interval  IN varchar2)
  
  此job参数是一个整数|它唯一标识此工作?br />   What参数是由此工作运行的一块PL/SQL代码块?br />   next_date参数指示何时此工作将被执行?br />   interval参数指示一个工作重执行的频度?br />   
  3、Interval()q程用来昑ּ地设|重执行一个工作之间的旉间隔数。这个过E有两个参数Qjob与interval?br />   
  PROCEDURE Interval (job   IN binary_integer,
            Interval IN varchar2)
  
  job参数标识一个特定的工作。interval参数指示一个工作重执行的频度?br />   
  4、ISubmit()q程用来用特定的工作h交一个工作。这个过E有五个参数Qjob、what、next_date、interval与no_parse?br />   
  PROCEDURE ISubmit (job    IN binary_ineger,
            What   IN varchar2,
            next_date IN date,
            interval IN varchar2,
            no_parse IN booean:=FALSE)
  
  q个q程与Submit()q程的唯一区别在于此job参数作ؓIN型参C递且包括一个由开发者提供的工作受如果提供的工作号已被用,生一个错误?br />   
  5、Next_Date()q程用来昑ּ地设定一个工作的执行旉。这个过E接收两个参敎ͼjob与next_date?br />   
  PROCEDURE Next_Date(job     IN binary_ineger,
            next_date  IN date)
  job标识一个已存在的工作。next_date参数指示了此工作应被执行的日期与旉?br />   
  6、Remove()q程来删除一个已计划q行的工作。这个过E接收一个参敎ͼ
  
  PROCEDURE Remove(job IN binary_ineger);
  
  job参数唯一地标识一个工作。这个参数的值是׃ؓ此工作调用Submit()q程q回的job参数的倹{已正在q行的工作不能由调用q程序删除?br />   
  7、Run()q程用来立即执行一个指定的工作。这个过E只接收一个参敎ͼ
  
  PROCEDURE Run(job IN binary_ineger)
  
  job参数标识被立即执行的工作?br />   
  8、用Submit()q程Q工作被正常地计划好?br />   q个q程有五个参敎ͼjob、what、next_date、interval与no_parse?br />   
  PROCEDURE Submit ( job    OUT binary_ineger,
            What   IN varchar2,
            next_date IN date,
            interval IN varchar2,
            no_parse IN booean:=FALSE)
  
  job参数是由Submit()q程q回的binary_ineger。这个值用来唯一标识一个工作?br />   what参数是将被执行的PL/SQL代码块?br />   next_date参数指识何时运行这个工作?br />   interval参数何时q个工作被重执行?br />   no_parse参数指示此工作在提交时或执行时是否应q行语法分析——TRUE指示此PL/SQL代码在它W一ơ执行时应进行语法分析,而FALSE指示本PL/SQL代码应立卌行语法分析?br />   
  9、User_Export()q程q回一个命令,此命令用来安排一个存在的工作以便此工作能重新提交?br />   此程序有两个参数Qjob与my_call?br />   
  PROCEDURE User_Export(job    IN binary_ineger,
             my_call  IN OUT varchar2)
  
  job参数标识一个安排了的工作。my_call参数包含在它的当前状态重新提交此工作所需要的正文?br />   
  10、What()q程应许在工作执行时重新讄此正在运行的命o。这个过E接收两个参敎ͼjob与what?br />   
  PROCEDURE What (job IN binary_ineger,
          What IN OUT varchar2)
  job参数标识一个存在的工作。what参数指示被执行的新的PL/SQL代码?br />   
  三、查看相关job信息
  1、相兌?br />   dba_jobs
  all_jobs
  user_jobs
  dba_jobs_running 包含正在q行job相关信息
  
  2、查看相关信?br />   SQL>SELECT JOB, NEXT_DATE, NEXT_SEC, FAILURES, BROKEN FROM DBA_JOBS;
  
  
  正在q行的JOB相关信息
  SQL>SELECT SID, r.JOB, LOG_USER, r.THIS_DATE, r.THIS_SEC FROM DBA_JOBS_RUNNING r, DBA_JOBS j
  WHERE r.JOB = j.JOB;

  JOB QUEUE LOCK相关信息
  SQL>SELECT SID, TYPE, ID1, ID2  FROM V$LOCK  WHERE TYPE = 'JQ';
  
  
  四、简单例?br />     
  创徏JOB
  SQL> variable job1 number;
  SQL>
  SQL> begin
   2 dbms_job.submit(:job1,'MYPROC;',sysdate,'sysdate+1/1440');  --每天1440分钟Q即一分钟q行testq程一?br />    3 end;
   4 /
  
  PL/SQL q程已成功完成?br />   
  q行JOB
  SQL> begin
   2 dbms_job.run(:job1);
   3 end;
   4 /
  
  PL/SQL q程已成功完成?br />   
  SQL> select to_char(a,'yyyy/mm/dd hh24:mi:ss') 旉 from TEST;
  
  旉
  -------------------
  2001/01/07 23:51:21
  2001/01/07 23:52:22
  2001/01/07 23:53:24
  
  删除JOB
  SQL> begin
   2 dbms_job.remove(:job1);
   3 end;
   4 /
  
  PL/SQL q程已成功完成?


1/24    一时Q?一?4时)
1/1440    一分;(一?440分钟Q?br /> 1/3600   24U;
1/86400  一U?一?6400U)


 1?每分钟执?
  
  Interval => TRUNC(sysdate,'mi') + 1 / (24*60)
  
  2?每天定时执行
  
  例如Q每天的凌晨2Ҏ?
  
  Interval => TRUNC(sysdate) + 1 +2 / (24)
  
  3?每周定时执行
  
  例如Q每周一凌晨2Ҏ?
  
  Interval => TRUNC(next_day(sysdate,'星期一'))+2/24
  
  4?每月定时执行
  
  例如Q每?日凌?Ҏ?
  
  Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24
  
  5?每季度定时执?
  
  例如每季度的W一天凌?Ҏ?
  
  Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24
  
  6?每半q定时执?
  
  例如Q每q??日和1?日凌??
  
  Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24
  
  7?每年定时执行
  
  例如Q每q??日凌?Ҏ?
  
  Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24


Derek.Guo 2008-06-12 09:39 发表评论
]]>
Oracle 分区?Partition)http://www.tkk7.com/envoydada/archive/2008/06/11/207090.htmlDerek.GuoDerek.GuoWed, 11 Jun 2008 04:43:00 GMThttp://www.tkk7.com/envoydada/archive/2008/06/11/207090.htmlhttp://www.tkk7.com/envoydada/comments/207090.htmlhttp://www.tkk7.com/envoydada/archive/2008/06/11/207090.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/207090.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/207090.htmlOracle提供了分区技术以支持VLDB(Very Large DataBase)。分通过对分区列的判断,把分区列不同的记录,攑ֈ不同的分Z。分区完全对应用透明?


Oracle的分可以包括多个分区Q每个分区都是一个独立的D(SEGMENTQ,可以存放C同的表空间中。查询时可以通过查询表来讉K各个分区中的数据Q也可以通过在查询时直接指定分区的方法来q行查询?


分区提供以下优点Q?


׃数据分散到各个分区中,减少了数据损坏的可能性;


可以对单独的分区q行备䆾和恢复;


可以分区映到不同的物理磁盘上Q来分散IOQ?


提高可管理性、可用性和性能?


Oracle提供了以下几U分区类型:


范围分区QrangeQ;


哈希分区QhashQ;


列表分区QlistQ;


范围Q哈希复合分区(range-hashQ;


范围Q列表复合分区(range-listQ?

 

索引也可以进行分区,分区索引有两U类型:global和local。对于local索引Q每一个表分区对应一个烦引分区,当表的分区发生变化时Q烦引的l护由Oracle自动q行。对于global索引Q可以选择是否分区Q而且索引的分区可以不与表分区相对应。当对分行维护操作时Q通常会导致全局索引的INVALDEDQ必d执行完操作后REBUILD。Oracle9i提供了UPDATE GLOBAL INDEXES语句Q可以在进行分区维护的同时重徏全局索引?

全局索引可以包含多个分区的?局部烦引比全局索引Ҏ理,而全局索引比较?br /> 注意:不能为散列分?或?子分区创建全局索引

如果表中预期的数据量较大Q通常都需要考虑使用分区表,定使用分区表后Q还要确定什么类型的分区Qrange partition、hash partition、list partition{)、分区区间大等。分区的创徏最好与E序有某U默契,偶曾l创建分Q按自然月䆾定义分区的,但程序却在查询时默认的开始时间与l束旉是:当前日期-30臛_前日期,比如当天?.18P那查询条件被产生?.18-9.18Q结果分区后q不没有大幅提高性能Q后来对E序的查询日期做了调_按自然月查询Q系l的负蝲了很多?/p>

从Oracle8.0开始支持表分区QMSSQL2005开始支持表分区Q?/p>

Oracle9i 分区能够提高许多应用E序的可理性、性能与可用性。分区可以将表、烦引及索引~排表进一步划分,从而可以更_地对q些数据库对象进行管理和讉K。Oracle 提供了种cȝ多的分区Ҏ以满x有的业务需要。另外,׃?SQL 语句中是完全透明的,所以分区可以用于几乎所有的应用E序?

分区表允许将数据分成被称为分区甚臛_分区的更的更好理的块。烦引也可以q么分区。每个分区可以被单独理Q可以不依赖于其他分单独发挥作用,因此提供了一个更有利于可用性和性能的结构?/p>

分区可以提高可管理性、性能与可用性,从而给各种各样的应用程序带来极大的好处。通常Q分区可以某些查询以及l护操作的性能大大提高。此外,分区q能够在很大E度上简化日常管理Q务。分使数据库设计人员和管理员能够解决端应用E序带来的最隄问题。分区是建立上亿万字节数据系l或需要极高可用性系l的关键工具?/p>

在多CPU配置环境下,如果打算使用q行执行Q则分区提供了另一Uƈ行的Ҏ。通过l表或烦引的不同分区分配不同的ƈ行执行服务器Q就可以q行执行对分和分区烦引的操作?/p>

表或索引的分区和子分区都׃n相同的逻辑属性。例如表的所有分区或子分区共享相同的列和U束定义Q一个烦引的分区或子分区׃n相同的烦引选项。然而它们可以具有不同的物理属性如表空间?/p>

管不需要将表或索引的每个分区或子分区放在不同的表空_但这样做更好。将分区存储C同的表空间能?/p>

l 减少数据在多个分Z冲突的可能?/p>

l 可以单独备䆾和恢复每个分?/p>

l 控制分区与磁盘驱动器之间的映对qI/O 负蝲是重要的

l 改善可管理性可用性和性能

分区操作对现存的应用和运行在分区表上的标准DML 语句来说是透明的。但是可以通过在DML 中用分区扩展表或烦引的名字来对应用~程Q其利用分区的优点?/p>

可以使用SQL*Loader、Import 和Export 工具来装载或卸蝲分区表中的数据。这些工具都是支持分区和子分区的?/p>

分区的方法Oracle9i 提供了如?U分区方法:

 

l 范围分区Range

l 散列分区Hash

l 列表分区List

l l合范围-散列分区Range-Hash

l l合范围-列表分区Range-List

可对索引和表分区。全局索引只能按范围分区,但可以将其定义在Mcd的分区或非分上。通常全局索引比局部烦引需要更多的l护?/p>

一般组建局部烦引,以便反映其基表的l构。它与基表是{同分区的,卛_与基

表在同样的列上分区,创徏同样数量的分区或子分区,讄与基表相对应的同L分区边界。对局部烦引而言Q当l护zd影响分区Ӟ会自动维护烦引分区。这保证了烦引与基础表之间的{同分区?/p>

关于范围分区RangeQ?/p>

要想行映射到基于列D围的分区Q就使用范围分区Ҏ。当数据可以被划分成逻辑范围时如q度中的月䆾Q这U类型的分区有用了。当数据在整个范围中能被均等地划分时性能最好。如果靠范围的分Z׃不均{的划分而导致分区在大小上明显不同时Q就需要考虑其他的分区方法?/p>

关于散列分区HashQ?/p>

如果数据不那么容易进行范围分区,但ؓ了性能和管理的原因又想分区Ӟ׃用散列分区方法。散列分区提供了一U在指定数量的分Z均等地划分数据的Ҏ。基于分区键的散列值将行映到分区中。创建和使用散列分区会给你提供了一U很灉|的放|数据的ҎQ因Z可以通过在I/O 驱动器之间播?摘掉)q些均等定量的分区,来媄响可用性和性能?/p>

关于列表分区ListQ?/p>

当你需要明地控制如何行映射到分区时Q就使用列表分区Ҏ。可以在每个分区的描qC分区列指定一列离散|q不同于范围分区Q在那里一个范围与一个分区相养Iq也不同于散列分区,在那里用户不能控制如何将行映到分区。列表分区方法是Ҏ为遵从离散值的模块化数据划分而设计的。范围分区或散列分区不那么容易做到这一炏V进一步说列表分区可以非常自然地将无序的和不相关的数据集进行分l和l织C赗?/p>

与范围分区和散列分区所不同Q列表分Z支持多列分区。如果要表按列分区Q那么分区键只能由表的一个单独的列组成,然而可以用范围分区或散列分区方法进行分区的所有的?都可以用列表分区Ҏq行分区?/p>

关于l合范围-散列分区Q?/p>

范围和散列技术的l合Q首先对表进行范围分区,然后用散列技术对每个范围分区再次分区。给定的范围分区的所有子分区加在一赯C数据的逻辑子集?

关于l合范围-列表分区Q?/p>

范围和列表技术的l合Q首先对表进行范围分区,然后用列表技术对每个范围分区再次分区。与l合范围-散列分区不同的是Q每个子分区的所有内容表C数据的逻辑子集Q由适当的范围和列表分区讄来描q?/p>

创徏或更改分时可以指定行Ud子句Q即ENABLE ROW MOVEMENT 或者DISABLE ROW MOVEMENT Q当光被更ҎQ该子句启用或停用将行迁Ud一个新的分区。默认gؓDISABLE ROW MOVEMENT。本产品(目)使用ENABLE ROW MOVEMENT子句?/p>


分区技术能够提高数据库的可理性:

使用分区技术,l护操作可集中于表的特定部分。例如,数据库管理员可以只对表的一部分做备份,而不必对整个表做备䆾。对整个数据库对象的l护操作Q可以在每个分区的基上进行,从而将l护工作分解成更Ҏ理的小块?

分区技术提高可理性的一个典型用法是支持数据仓库中的‘滚动视窗’加蝲q程。假设数据库理员每周向表中加蝲新数据。该表可以是范围分区Q以便每个分区包含一周的数据。加载进E只是简单地d新的分区。添加一个新分区的操作比修改整个表效率高很多Q因为数据库理员不需要修改Q何其他分区。从分区后的表中去除数据也是一栗你只要用一个很便快L数据字典操作删掉一个分区,而不必发Z用大量资源和调动所有要删除的数据的 ‘DELETE’ 命o?

分区技术能够提高数据库的性能:

׃减少了所查或操作的数据数量,同时允许q行执行QOracle9i 的分区功能提供了性能上的优势。这些性能包括Q?

l 分区修整Q分Z整是用分区技术提高性能的最单最有h值的手段。分Z整常常能够将查询性能提高几个数量U。例如,假定应用E序中有包含定单历史记录的定单表Q该表用周进行了分区。查询一周的定单只需讉K该定单表的一个分区。如果该定单表包含两q的历史记录Q这个查询只需要访问一个而不是一N四个分区。该查询的执行速度因ؓ分区修整而有可能快一癑ր。分Z整能与所有其?Oracle 性能Ҏ协作。Oracle 公司把分区修整技术与索引技术、连l技术和q行讉KҎ一赯合用?

l 分区联接Q分区功能可以通过UCؓ分区联接的技术提高多表联接的性能。当两个表要联接在一P而且每个表都用联接关键字来分区时Q就可以使用分区联接。分区智能联接将大型联接分解成较的发生在各个分区间的联接,从而用较少的时间完成全部联接。这q串行和ƈ行的执行都能带来显著的性能改善?

l 更新和删除的q行执行Q分区功能能够无限地q行执行 UPDATE、DELETE ?MERGE 语句。当讉K分区或未分区的数据库对象时Oracle ƈ行处?SELECT ?INSERT 语句。当不用位囄引时Q也可以对分区或未分区的数据库对象ƈ行处?UPDATE、DELETE ?MERGE 语句。ؓ了对有位囄引的对象q行处理那些操作Q目标表必须先分区。这?SQL 语句的ƈ行执行可以大大提高性能Q特别是提高 UPDATE ?DELETE ?MERGE 操作涉及大量数据时的性能?

分区技术提高可用性:

分区的数据库对象h分区独立性。该分区独立性特点可能是高可用性战略的一个重要部分,例如Q如果分的分Z能用Q但该表的所有其他分Z然保持在Uƈ可用。那么这个应用程序可以l针对该分区表执行查询和事务处理Q只要不是访问那个不可用的分区,数据库操作仍然能够成功运行?数据库管理员可以指定各分区存攑֜不同的表I间里,从而让理员独立于其它表分区针Ҏ个分行备份与恢复操作?q有Q分区功能可以减计划停机时间。性能׃分区功能得到了改善,使数据库理员在相对较小的批处理H口完成大型数据库对象的l护工作?/p>

Oracle最大允许存在多个分区?

我们可以从Oracle?a >Concepts手册上找到这个信息,对于Oracle9iR2:

Tables can be partitioned into up to 64,000 separate partitions.

对于Oracle10gR2QOracle增强了分区特性:

Tables can be partitioned into up to 1024K-1 separate partitions.

关于何时应该q行分区,Oracle有如下徏?

?Tables greater than 2GB should always be considered for partitioning.
?Tables containing historical data, in which new data is added into the newest partition. A typical example is a historical table where only the current month's data is updatable and the other 11 months are read only.



Derek.Guo 2008-06-11 12:43 发表评论
]]>
数据库性能 常用SQLhttp://www.tkk7.com/envoydada/archive/2007/12/27/170920.htmlDerek.GuoDerek.GuoThu, 27 Dec 2007 08:34:00 GMThttp://www.tkk7.com/envoydada/archive/2007/12/27/170920.htmlhttp://www.tkk7.com/envoydada/comments/170920.htmlhttp://www.tkk7.com/envoydada/archive/2007/12/27/170920.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/170920.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/170920.html阅读全文

Derek.Guo 2007-12-27 16:34 发表评论
]]>
SQL SERVER事务处理http://www.tkk7.com/envoydada/archive/2006/08/04/61650.htmlDerek.GuoDerek.GuoFri, 04 Aug 2006 01:45:00 GMThttp://www.tkk7.com/envoydada/archive/2006/08/04/61650.htmlhttp://www.tkk7.com/envoydada/comments/61650.htmlhttp://www.tkk7.com/envoydada/archive/2006/08/04/61650.html#Feedback0http://www.tkk7.com/envoydada/comments/commentRss/61650.htmlhttp://www.tkk7.com/envoydada/services/trackbacks/61650.html 事务定义Q?/span>

事务是单个的工作单元。如果某一事务成功Q则在该事务中进行的所有数据更改均?/span>

提交Q成为数据库中的怹l成部分。如果事务遇到错误且必须取消或回滚,则所?/span>

数据更改均被清除?/span>

事务三种q行模式Q?/span>
自动提交事务
每条单独的语句都是一个事务?/span>
昑ּ事务
每个事务均以 BEGIN TRANSACTION 语句昑ּ开始,
?/span> COMMIT ?/span> ROLLBACK 语句昑ּl束?/span>
隐性事?/span>
在前一个事务完成时C务隐式启动,但每个事务仍?/span> COMMIT ?/span> ROLLBACK 语句

昑ּ完成?/span>

事务操作的语法:

BEGIN TRANSACTION
BEGIN DISTRIBUTED TRANSACTION
COMMIT TRANSACTION
COMMIT WORK
ROLLBACK WORK
SAVE TRANSACTION
BEGIN TRANSACTION

BEGIN TRANSACTION
标记一个显式本C务的起始炏V?/span>

BEGIN TRANSACTION ?/span> @@TRANCOUNT ?/span> 1 ?/span>

BEGIN TRANSACTION 代表一点,p接引用的数据在该Ҏ逻辑和物理上都一致的。如果遇上错误,?/span> BEGIN TRANSACTION 之后的所有数据改动都能进行回滚,以将数据q回到已知的一致状?/span> 。每个事务l执行直到它无误地完成ƈ且用 COMMIT TRANSACTION Ҏ据库作永久的改动Q或者遇上错误ƈ且用 ROLLBACK TRANSACTION 语句擦除所有改?/span>

语法
BEGIN TRAN [ SACTION ] [ transaction_name | @tran_name_variable [ WITH MARK [ 'description' ] ] ]

例子Q?/span>
BEGIN TRAN T1
UPDATE table1 ...
--nest transaction M2
BEGIN TRAN M2 WITH MARK
UPDATE table2 ...
SELECT * from table1
COMMIT TRAN M2
UPDATE table3 ...
COMMIT TRAN T1

BEGIN DISTRIBUTED TRANSACTION
指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 理?/span> Transact-SQL 分布式事务的起始?/span>

语法
BEGIN DISTRIBUTED TRAN [ SACTION ]
[ transaction_name | @tran_name_variable ]

参数
transaction_name
是用户定义的事务名,用于跟踪 MS DTC 实用工具中的分布式事务?/span> transaction_name 必须W合标识W规则,但是仅用头 32 个字W?/span>

@tran_name_variable
是用户定义的一个变量名Q它含有一个事务名Q该事务名用于跟t?/span> MS DTC 实用工具中的分布式事务。必ȝ char ?/span> varchar ?/span> nchar ?/span> nvarchar 数据cd声明该变量?/span>

注释
执行 BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创ZhQƈ且控制事务的完成

当连接发出后l?/span> COMMIT TRANSACTION ?/span> ROLLBACK TRANSACTION 语句Ӟ
L服务器请?/span> MS DTC 在所涉及的服务器间管理分布式事务的完成?/span>
有两个方法可远E?/span> SQL 服务器登记在一个分布式事务中:

分布式事务中已登记的q接执行一个远E存储过E调用,该调用引用一个远E服务器?/span>
分布式事务中已登记的q接执行一个分布式查询Q该查询引用一个远E服务器?/span>

CZ
本例在本地和q程数据库上更新作者的姓。本地和q程数据库将同时提交或同时回滚本事务?/span>

说明
当前?/span> SQL Server 上必d?/span> MS DTC.

USE pubs
GO
BEGIN DISTRIBUTED TRANSACTION
UPDATE authors
SET au_lname = 'McDonald' WHERE au_id = '409-56-7008'
EXECUTE
link_Server_T .pubs.dbo.changeauth_lname '409-56-7008','McDonald'
COMMIT TRAN
GO
Note:
如果需要连接远E?/span> DB, 如果?/span> linkServer 方式q接的话Q一定要修该 linkServer ?/span> RPC 选项|ؓ True ?/span>

SET XACT_ABORT
指定?/span> Transact-SQL 语句产生q行旉误时Q?/span> Microsoft? SQL Server? 是否自动回滚当前事务?/span>

( 可以比较单的理解Q如果中间有M一?/span> SQL 出错Q所?/span> SQL 全部回滚 . 特别适用?/span> Procedure 中间调用 Procedure Q如果第一?/span> Procedure Ok Q被调用?/span> Procedure 中间有错误,如果 SET XACT_ABORT=false Q则出错的部分回滚,其他部分提交Q当然外?/span> Procedure 也提交。) .

--- 在分布式 Trans 中一定要注意讄下面参数 (XACT_ABORT)

语法 SET XACT_ABORT { ON | OFF }

注释 ?/span> SET XACT_ABORT ?/span> ON Ӟ如果 Transact-SQL 语句产生q行旉误,整个事务终止ƈ回滚。ؓ OFF Ӟ只回滚生错误的 Transact-SQL 语句Q而事务将l箋q行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的媄响?/span>

对于大多?/span> OLE DB 提供E序Q包?/span> SQL Server Q,隐性或昑ּ事务中的数据修改语句必须?/span> XACT_ABORT 讄?/span> ON ?/span>

SET XACT_ABORT 的设|是在执行或q行时设|,而不是在分析时设|?/span>

CZ 下例D在含有其?/span> Transact-SQL 语句的事务中发生q反外键错误。在W一个语句集中生错误,但其它语句均成功执行且事务成?/span>
提交。在W二个语句集中, SET XACT_ABORT 讄?/span> ON 。这D语句错误使批处理l止Qƈ使事务回滚?/span>

CREATE TABLE t1 (a int PRIMARY KEY)
CREATE TABLE t2 (a int REFERENCES t1(a))
GO
INSERT INTO t1 VALUES (1)
INSERT INTO t1 VALUES (3)
INSERT INTO t1 VALUES (4)
INSERT INTO t1 VALUES (6)
GO
SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT INTO t2 VALUES (1)
INSERT INTO t2 VALUES (2) /* Foreign key error */
INSERT INTO t2 VALUES (3)
COMMIT TRAN
GO

SET XACT_ABORT ON
GO

BEGIN TRAN
INSERT INTO t2 VALUES (4)
INSERT INTO t2 VALUES (5) /* Foreign key error */
INSERT INTO t2 VALUES (6)
COMMIT TRAN
GO

SAVE TRANSACTION
在事务内讄保存炏V?/span>

语法 SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }
参数 savepoint_name
是指z保存点的名称。保存点名称必须W合标识W规则,但只使用?/span> 32 个字W?/span>
@savepoint_variable
是用户定义的、含有有效保存点名称的变量的名称?/span>
必须?/span> char ?/span> varchar ?/span> nchar ?/span> nvarchar 数据cd声明该变量?/span> 注释
用户可以在事务内讄保存Ҏ标记。保存点定义如果有条件地取消事务的一部分Q事 务可以返回的位置。如果将事务回滚C存点Q则必须Q如果需要,使用更多?/span> Transact-SQL 语句?/span> COMMIT TRANSACTION 语句Ql完成事务,或者必(通过事务回滚到其v始点Q完全取消事务。若要取消整个事务,请?/span> ROLLBACK TRANSACTION transaction_name 格式。这撤消事务的所 有语句和q程?/span>

Note Q?/span> 1 Q?/span> 在由 BEGIN DISTRIBUTED TRANSACTION 昑ּ启动或从本地事务升而来的分布式事务中,不支?/span> SAVE TRANSACTION ?/span>

2 Q?/span> 当事务开始时Q将一直控制事务中所使用的资源直C务完成(也就是锁定)。当事务的一部分回滚C存点Ӟl控制资源直C务完成(或者回滚全部事务)?/span>

例子Q?/span> begin transaction
save transaction A
insert into demo values('BB','B term')
rollback TRANSACTION A
create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
commit transaction

ROLLBACK TRANSACTION

显式事务或隐性事务回滚到事务的vҎ事务内的某个保存炏V?/span>
语法
ROLLBACK [ TRAN [ SACTION ]
[ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ] ]

参数
transaction_name
是给 BEGIN TRANSACTION 上的事务指派的名U?/span> transaction_name 必须W合标识W规则,但只使用事务名称的前 32 个字W。嵌?/span>
事务Ӟ transaction_name 必须是来自最q的 BEGIN TRANSACTION 语句的名U?/span>
@tran_name_variable
是用户定义的、含有有效事务名U的变量的名U。必ȝ char ?/span> varchar ?/span> nchar ?/span> nvarchar 数据cd声明该变量?/span>
savepoint_name
是来?/span> SAVE TRANSACTION 语句?/span> savepoint_name ?/span> savepoint_name 必须W合标识W规则。当条g回滚只媄响事务的一部分时 ?/span> savepoint_name ?/span>
@savepoint_variable
是用户定义的、含有有效保存点名称的变量的名称。必ȝ char ?/span> varchar ?/span> nchar ?/span> nvarchar 数据cd声明该变量?/span>

注释 ROLLBACK TRANSACTION 清除自事务的L或到某个保存Ҏ做的所有数据修攏V?/span> ROLLBACK q释攄事务控制的资源?/span>
不带 savepoint_name ?/span> transaction_name ?/span> ROLLBACK TRANSACTION 回滚C务的L。嵌套事务时Q该语句所有内层事务回滚到 最q的 BEGIN TRANSACTION 语句。在q两U情况下Q?/span> ROLLBACK TRANSACTION 均将 @@TRANCOUNT pȝ函数减ؓ 0 ?/span> ROLLBACK
TRANSACTION savepoint_name
不减?/span> @@TRANCOUNT ?/span>

Note:
ROLLBACK TRANSACTION
语句若指?/span> savepoint_name 则不释放M锁?/span>
在由 BEGIN DISTRIBUTED TRANSACTION 昑ּ启动或从本地事务升而来的分布式事务中, ROLLBACK TRANSACTION 不能
引用 savepoint_name ?/span> 在执?/span> COMMIT TRANSACTION 语句后不能回滚事?/span> ?/span>

在事务内允许有重复的保存点名Uͼ?/span> ROLLBACK TRANSACTION 若用重复的保存点名Uͼ则只回滚到最q的使用该保存点名称?/span> SAVE TRANSACTION ?/span>

在存储过E中Q不?/span> savepoint_name ?/span> transaction_name ?/span> ROLLBACK TRANSACTION 语句所有语句回滚到最q的 BEGINTRANSACTION 。在存储q程中, ROLLBACK TRANSACTION 语句?/span> @@TRANCOUNT 在触发器完成时的g同于调用该存储过E时?/span> @@TRANCOUNT |q且生成一个信息。该信息不媄响后面的处理?/span>

如果在触发器中发?/span> ROLLBACK TRANSACTION Q将回滚对当前事务中的那一Ҏ做的所有数据修改,包括触发器所做的修改?/span>
触发器l执?/span> ROLLBACK 语句之后的所有其余语句。如果这些语句中的Q意语句修Ҏ据,则不回滚q些修改。执行其余的语句不会Ȁ发嵌套触发器。在批处理中Q不执行所有位于激发触发器的语句之后的语句。每ơ进入触发器Q?/span> @@TRANCOUNT 增?/span> 1 Q即使在自动提交模式下也是如此。(pȝ触发器视作隐性嵌套事务。)

在存储过E中Q?/span> ROLLBACK TRANSACTION 语句不媄响调用该q程的批处理中的后箋语句Q?/span>
执行批处理中的后箋语句。在触发器中Q?/span> ROLLBACK TRANSACTION 语句l止含有Ȁ发触发器的语句的批处理;
不执行批处理中的后箋语句?/span>

ROLLBACK TRANSACTION 语句不生成显C给用户的信息。如果在存储q程或触发器中需要警告,请?RAISERROR ?PRINT 语句。RAISERROR 是用于指出错误的首选语句?/span>

ROLLBACK Ҏ标的影响׃面三个规则定义:
?CURSOR_CLOSE_ON_COMMIT 讄?ON ӞROLLBACK 关闭但不释放所有打开的游标?
?CURSOR_CLOSE_ON_COMMIT 讄?OFF ӞROLLBACK 不媄响Q何打开的同?STATIC ?INSENSITIVE 游标不媄响已完全填充的异?STATIC 游标。将关闭但不释放M其它cd的打开的游标?
对于Dl止批处理ƈ生成内部回滚的错误,释攑֜含有该错误语句的批处理内声明的所有游标?br />不论游标的类型或 CURSOR_CLOSE_ON_COMMIT 的设|,所有游标均被释放Q其中包括在该错误批处理所调用的存储过E内声明的游标。在该错误批处理之前的批处理内声明的游标以规?1 ?2 为准。死锁错误就属于q类错误。在触发器中发出?ROLLBACK 语句?自动生成q类错误?

权限
ROLLBACK TRANSACTION 权限默认授予M有效用户?br />
例子Q?/span>

begin transaction
save transaction A
insert into demo values('BB','B term')
rollback TRANSACTION A

-- select * into demo2 from demo1

create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
rollback transaction

COMMIT TRANSACTION
标志一个成功的隐性事务或用户定义事务的结束。如?/span> @@TRANCOUNT ?/span> 1 Q?/span> COMMIT

TRANSACTION 使得自从事务开始以来所执行?/span> 所有数据修Ҏ为数据库的永久部分,释放q接

占用的资源,q将 @@TRANCOUNT 减少?/span> 0 。如?/span> @@TRANCOUNT 大于 1 Q则 COMMIT

TRANSACTION ?/span> @@TRANCOUNT ?/span> 1 递减?/span>

只有当事务所引用的所有数据的逻辑都正时Q发?/span> COMMIT TRANSACTION 命o?/span>
COMMIT WORK
标志事务的结束?/span>
语法
COMMIT [ WORK ]

注释
此语句的功能?/span> COMMIT TRANSACTION 相同Q但 COMMIT TRANSACTION 接受用户定义的事?/span>

名称。这个指定或没有指定可选关键字 WORK ?/span> COMMIT 语法?/span> SQL-92 兼容

例子 Q?/span>
begin transaction a
insert into demo values('BB','B term')
commit TRANSACTION A

隐性事?/span>
当连接以隐性事务模式进行操作时Q?/span> SQL Server 在提交或回滚当前事务后自动启动C务。无LqC务的开始,只需提交?/span>

回滚每个事务。隐性事务模式生成连l的事务链?/span>

在ؓq接隐性事务模式设|ؓ打开之后Q当 SQL Server 首次执行下列M语句Ӟ都会自动启动一个事务:

 

ALTER TABLE

INSERT

 

CREATE

OPEN

 

DELETE

REVOKE

 

DROP

SELECT

 

FETCH

TRUNCATE TABLE

 

GRANT

UPDATE

在发?/span> COMMIT ?/span> ROLLBACK 语句之前Q该事务一直保持有效。在W一个事务被提交或回滚之后,下次当连接执行这些语?/span>

中的M语句Ӟ SQL Server 都将自动启动一个新事务?/span> SQL Server 不断地生成一个隐性事务链Q?/span>

直到隐性事务模式关闭ؓ?/span>

例子Q?/span>
begin transaction
save transaction A

insert into demo values('BB','B term')
rollback TRANSACTION A

create table demo2(name varchar(10),age int)
insert into demo2(name,age) values('lis',1)
rollback transaction
--
?/span> Create table demo2 ?/span> SQL Server 已经隐式创徏一?/span> Trans, 知道提交或回?/span>

嵌套事务处理 :

1 Q?/span> Trans 嵌套Q将内部?/span> trans 合ƈ到外部ƈ形成一?/span> Trans.

begin tran t1

----In the first trans .
Insert into demo2(name,age) values('lis',1)

---Second Trans begin transaction t2
insert into demo values('BB','B term')
commit transaction t2

----In the first trans .
Insert into demo2(name,age) values('lis',2)
rollback transaction t1

Note:

在一pd嵌套的事务中用一个事务名l多个事务命名对该事务没有什么媄响。系l仅登记W一个(最外部的)事务名?span>回滚

到其它Q何名字(有效的保存点名除外)都会产生错误 ?/span>

事实上,M在回滚之前执行的语句都没有在错误发生时回滚。这语句仅当外层的事务回滚时才会q行回滚?/span>

例:内部事务回滚 SQL server 报错?/span>

begin tran t1
Insert into demo2(name,age) values('lis',1)
---Second Trans

--Server: Msg 6401, Level 16, State 1, Line 6
---Cannot roll back t2. No transaction or savepoint of that name was found.
begin transaction t2
insert into demo values('BB','B term')
rollback transaction t2

----In the first trans .
Insert into demo2(name,age) values('lis',2)
commit transaction t1

例: 内部事务提交 SQL server 不会报错?/span>

begin tran t1
Insert into demo2(name,age) values('lis',1)
---Second Trans no error
begin transaction t2
insert into demo values('BB','B term')
commit transaction t2

----In the first trans .
Insert into demo2(name,age) values('lis',2)
commit transaction t1

SQL Server 的隔ȝ别:

1: TimeOut 参数

Set Lock_TimeOut 5000

被锁时 5 U将自动解锁

Set Lock_TimeOut 0

产立卌锁,q回 Error 默认?/span> -1 Q无限等?/span>

2 Q?/span>

(SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ | SERIALIZABLE
} Q?/span>

READ COMMITTED

指定在读取数据时控制׃n锁以避免脏读Q但数据可在事务l束前更改,从而生不可重复读取或

qd数据。该选项?/span> SQL Server 的默认倹{?/span>

避免脏读Qƈ在其?/span> session 在事务中不能对已有数据进行修攏V共享锁?/span>

READ UNCOMMITTED

执行脏读?/span> 0 U隔锁定,q表CZ发出׃n锁,也不接受排它锁。当讄该选项Ӟ可以Ҏ

据执行未提交L脏读Q在事务l束前可以更Ҏ据内的数|行也可以出现在数据集中或从数?/span>

集消失。该选项的作用与在事务内所有语句中的所有表上设|?/span> NOLOCK 相同。这是四个隔ȝ别中

限制最的U别?/span>

REPEATABLE READ

锁定查询中用的所有数据以防止其他用户更新数据Q但是其他用户可以将新的qd行插入数?/span>

集,且像行包括在当前事务的后箋d中。因为ƈ发低于默认隔ȝ别,所以应只在必要时才?/span>

用该选项?/span>

SERIALIZABLE

在数据集上放|一个范围锁Q以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这

是四个隔ȝ别中限制最大的U别。因为ƈ发别较低,所以应只在必要时才使用该选项。该选项

的作用与在事务内所?/span> SELECT 语句中的所有表上设|?/span> HOLDLOCK 相同?/span>



Derek.Guo 2006-08-04 09:45 发表评论
]]>
վ֩ģ壺 91㽶߹ۿ| ŷһ | ƷۺרĻѲ| ձ| ޹Һ2020| ޾Ʒ| AVպۺһ| ˳վ| ؼëƬѹۿƵ| һؼaaaaëƬѹۿ| ƷƵѲ| ߹ۿƬAVվ| ϼ˳߹ۿƵ | þþƷavƷ| ˳߲| Ůվ| | òֻƵ| vƬ߹ۿƵվ| һӰ߿Ƭ| ŮȸͰƵѰ | 91Ƶַ| Ƶ| Ʒ_Ʒ| С˵ۺͼ| ޹һɾþþƷۺ| һŮ| ۺ߹ۿƵ| Ʒ޾Ʒ| avպۺһ| JIZZйJIZZѿ| Դ߹ۿѰ| Ѹ弤| һҴ| ޹Ʒպ| ˿Ƶ| av߹ۿַ| ˳ƵƵ| 69ӰԺëƬѹۿƵ| avվѹۿ| ƷƬ߹ۿ |