oracle怎么创建队列 如何创建队列

oracle 如何运用队列和触发器在员工表中每插入一个新员工自动生成员工编号

创建一个序列:abc_table_s

创新互联是一家集网站建设,庆城企业网站建设,庆城品牌网站建设,网站定制,庆城网站建设报价,网络营销,网络优化,庆城网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

插入表的value里引用:abc_table_s.nextval

oracle aq队列 能实现并行吗?创建两个队列也不能实现

并行概念

并行执行(parallel execution)是Oracle企业版才有的特性(标准版中没有这个特性),指能够将一个大型串行任务(任何DML,或者一般的DDL)物理地划分为多个较小的部分,这些较小的部分可以同时得到处理。

并行包括:

并行查询:这是指能使用多个操作系统进程或线程来执行一个查询。Oracle会发现能并行执行的操作(如全表扫描或大规模排序),并创建一个查询计划来实现)。

并行DML(PDML):这在本质上与并行查询很相似,但是PDML主要是使用并行处理来执行修改(INSERT、UPDATE、DELETE和MERGE)。

并行DDL:并行DDL是指Oracle能并行地执行大规模的DDL操作。例如,索引重建、创建一个新索引、数据加载以及大表的重组等都可以使用并行处理。

并行恢复:这是指数据库能并行地执行实例(甚至介质)恢复,以减少从故障恢复所需的时间。

过程并行化:这是指能并行地运行所开发的代码。

何时使用并行

在应用并行执行之前,需要保证以下两点成立:

必须有一个非常大的任务,如对50GB数据进行全面扫描。

必须有足够的可用资源(CPU、I/O、内存)。在并行全面扫描50GB数据之前,你要确保有足够的空闲CPU(以容纳并行进程),还要有足够的I/O通道。

如果只有一个小任务(通常OLTP系统中执行的查询就是这种典型的小任务),或者你的可用资源不足(这也是OLTP系统中很典型的情况),其中CPU和I/O资源通常已经得到最大限度的使用,那就根本不用考虑并行执行。

如果一个任务只需要几秒(或更短时间)就能串行地完成,引入并行执行后,相关的管理开销可能会让整个过程花费更长的时间。

举例如,写一页文档若12个人来写,需要开会分段等,可能并不如一个人来写更快。而如果写1200页,12个人写需要的时间只为原来的1/12,就算分配任务可能也就1/12,还是比一个人写要快多了。

并行查询

并行查询允许将一个SQL SELECT语句划分为多个较小的查询,每个部分的查询并发地运行,然后会将各个部分的结果组合起来,提供最终的答案。

在并行进程和扫描文件之间并不存在1对1映射,可以多个进程扫描同一个文件。

各个并行进程可称为并行执行服务器(parallel execution server),有时也称为并行查询(parallel

query,PQ)从属进程。各个并行执行服务器都是单独的会话,就像是专业服务器进程一样连接数据库。每个并行执行服务器分别负责扫描表中一个部分(各

个部分都不重叠),汇总其结果子集,将其输出发回给协调服务器(即原始会话的服务器进程),它再将这些子结果汇总为最终答案。

在默认情况下,Oracle是不启用并行查询的。启用并行查询有多种方法,可以直接在查询中使用一个提示,或者修改表要求考虑并行执行路径等。

【并行查询方法】

1)暗示hints式,临时有效

select /*+parallel(table_name num)*/ count(*) from table_name;

多表关联时多表并行:

select /*+parallel(table_name1,num1) parallel(table_name2,num2)*/ count(*) from table_name1, table_name2;

2)alter table对象式,长期有效

alter table table_name parallel num;

3)alter session会话式,会话生命周期有效

alter session force parallel query parallel num;

4)并行DDL式,会话生命周期有效

alter session enable parallel dml;

对于前两种方式,若省略num则Oracle将自动根据负载确定并行度。并行度要随着系统上工作负载的增减而变化。如果有充足的空闲资源,并行度会

上升;如果可用资源有限,并行度则会下降。这样就不会为机器强加一个固定的并行度。利用这种方法,允许Oracle动态地增加或减少查询所需的并发资源

量。

【查看默认并行数】

1)确定会话SID

select sid from v$mystat where rownum = 1;

2)在其他会话中查询

select sid,qcsid,server#,degree from v$px_session where qcsid = num;

一般而言,如果能访问尽可能多的资源(CPU、内存和I/O),并行执行就能最好地发挥作用。但这并不是说如果整个数据集都在一个磁盘上,就从并行

查询得不到任何好处。不过如果整个数据集都在一个磁盘上,可能确实不如使用多个磁盘那样能有更多收获。即使使用一个磁盘,在响应时间上也可能可以得到一定

的速度提升。原因在于:给定的一个并行执行服务器在统计行时并不读取这些行,反之亦然。所以,与执行串行相比,两个并行执行服务器可以在更短的时间内完成

所有行的统计。

数据分布在多个物理设备上可以提高I/O,如表分区、跨磁盘等。

在Oracle 11g Release2及以上版本中,引入了一项新功能来限制资源过度使用:并行语句排除(Parallel

Statement

Queuing,PSQ)。使用PSQ时,数据库会限制并发执行的并行查询数,并把更多的并行请求放在一个执行队列中。CPU资源用尽时数据库会阻止新的

请求变为活动状态。这些请求并没有失败,它们只是会延迟开始,也就是说它们将排队。资源可用时,数据库就会开始执行队列中的查询。

并行DML

Oracle文档将并行DML(PDML)一词的范围限制为只包括INSERT、UPDATE、DELETE和MERGE(不像平常的DML那样还

包括SELECT)。在PDML期间,Oracle可以使用多个并行执行服务器来执行INSERT、UPDATE、DELETE或MERGE,而不是只利

用一个串行进程。在一个有充足I/O带宽的多CPU主机上,对于大规模的DML操作,可能会得到很大的速度提升。

不过,不能把PDML当成提高OLTP应用速度的一个特性。因为并行操作设计为要充分、完全地利用一台机器上的所有资源。通过这种设计,一个用户可

以完全使用机器上的所有磁盘、CPU和内存。在某些数据仓库中(有大量数据,而用户很少),这可能正是你想要的。而在一个OLTP系统中(大量用户都在做

很短、很快的事务),可能就不能希望如此了,你不想让用户能够完全占用机器资源。

类似于Oracle执行的分布式查询,PDML操作采用同样的方式执行,即每个并行执行服务器相当于一个单独数据库实例中的一个进程。这些事务都结束后,会执行一个相当于快速2PC的过程来提交这些单独的独立事务。这些事务要么都由PDML协调会话提交,要么无一提交。

由于PDML采用的一种伪分布式的实现,因此存在一些限制:

PDML操作期间不支持触发器。这是一个很合理的限制,因为触发器可能会向更新增加大量开销,而你使用PDML的本来目的是为了更快一些,这两方面是矛盾的,不能放在一起。

PDML期间,不支持某些声明方式的引用完整性约束,因为表中的每一片(部分)会在单独的会话中作为单独的事务进行修改。例如,PDML操作不支持自引用完整性。如果真的支持自引用完整性,可能会出现死锁和其他锁定问题。

在提交或回滚之前,不能访问用PDML修改的表。

PDML不支持高级复制(因为复制特性的实现要基于触发器)。

不支持延迟约束(也就是说,采用延迟模式的约束)。

如果表是分区的,PDML只可能在有位图索引或LOB列的表上执行,而且并行度取决于分区数。在这种情况下,无法在分区内并行执行一个操作,因为每个分区只有一个并行执行服务器来处理。

执行PDML时不支持分布式事务。

PDML不支持聚簇表。

并行DDL

从维护的观点看,以及从管理的角度来说,并行DDL才是Oracle中并行执行最突出的优点。如果认为并行查询主要是为最终用户设计的,那么并行

DDL则是为DBA/开发人员设计的。如果没有并行执行,DBA将很难真正充分利用硬件的全部能力。但如果利用并行执行,则完全可以做到。以下SQL

DDL命令允许“并行化”:

CREATE INDEX:多个并行执行服务器可以扫描表、对数据排序,并把有序的段写出到索引结构。

CREATE TABLE AS SELECT:执行SELECT的查询可以使用并行查询来执行,表加载本身可以并行完成。

ALTER INDEX REBUILD:索引结构可以并行重建。

ALTER TABLE MOVE:表可以并行移动。

ALTER TABLE SPLIT|COALESCE PARTITION:单个表分区可以并行地分解或合并。

ALTER INDEX SPLIT PARTITION:索引分区可以并行地分解。

前4个命令还适用于单个的表/索引分区,也就是说,可以并行地MOVE一个表的单个分区。

并行DDL和使用外部表的数据加载

利用并行DDL,再加上外部表,就能通过一个简单的CREATE TABLE AS SELECT or INSERT /*+ APPEND

*/来实现并行直接路径加载。不用再编写脚本,不必再分解文件,也不用协调要运行的N个脚本。简单地说,通过结合并行DDL和外部表,不仅提供了纯粹的易

用性,而且全无性能损失。

并行DDL和区段截断

并行DDL依赖于直接路径操作。也就是说,数据不传递到缓冲区缓存以便以后写出;而是由一个操作(如CREATE TABLE AS

SELECT)来创建新的区段,并直接写入这些区段,数据直接从查询写到磁盘(放在这些新分配的区段中)。每个并行执行服务器执行自己的部分CREATE

TABLE AS SELECT工作,并且都会写至自己的区段。INSERT /*+ APPEND

*/(直接路径插入)会在一个段的HWM“之上“写,每个并行执行服务器再写至其自己的一组区段,而不会与其他并行执行服务器共享。因此,如果执行一个并

行CREATE TABLE AS

SELECT,并使用4个并行执行服务器来创建表,就至少有4个分区,可能还会更多。每个并行执行服务器会分配其自己的区段,向其写入,等填满时,再分配

另一个新的区段,并行执行服务器不会使用由其他并行执行服务器非品牌的区段。

oracle中怎样创建队列 使id自动增长

序列+触发器 实现,代码如下:

CREATE SEQUENCE SEQname

INCREMENT BY 1

START WITH 1

MAXVALUE 99999999

/

CREATE TRIGGER TRGname

BEFORE INSERT ON table_name

REFERENCING

NEW AS :NEW

FOR EACH ROW

Begin

SELECT SEQname.NEXTVAL

INTO :NEW.FIELDname

FROM DUAL;

End;

oracle 如何创建每小时执行的jobs

dbms_job.submit( job out binary_integer,

what in archar2,

next_date   in date,

interval in varchar2,

no_parse in boolean)

●job:输出变量,是此任务在任务队列中的编号;

●what:执行的任务的名称及其输入参数;

●next_date:任务执行的时间;

●interval:任务执行的时间间隔。

interval取值'SYSDATE + 1/24'就是每天运行一次

如何解决ORACLE 9I高级队列不能及时同步

参考dbms_aqadm.create_queue_table

1.存储参数storage_clause 可以是 MAXTRANS,LOB等

2.sort_list 可以是PRIORITY,enq_time这2个参数或者其中一个。具体可以察看对应的 队列表的数据结构。例如下面的例子

--创建队列表,‘sms_aq_tab’ 队列表名,' sms_aq_tab '队列对象名(充当消息体的对象名称),以下同

dbms_aqadm.create_queue_table('WDZAQTABLE','WDZAQMSG');

--创建具有排序功能的队列表

dbms_aqadm.create_queue_table('WDZSQRTAQTABLE','WDZAQMSG',sort_list = 'PRIORITY,enq_time');

3。消息分组参数 message_grouping 可以是 NONE,或 TRANSACTIONAL

-- message grouping

dbms_aqadm.TRANSACTIONAL CONSTANT BINARY_INTEGER := 1;

dbms_aqadm.NONE CONSTANT BINARY_INTEGER := 0;后者表示一个与事务相关的消息分成1组,在提取消息的时候可以当成一组相关消息来提取。例如:

--创建带带分组功能的消息队列表

dbms_aqadm.create_queue_table('WDZGROUPAQTABLE','WDZAQMSG',

sort_list = 'PRIORITY,enq_time',

message_grouping =dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/ );

4.multiple_consumers表示消息接受者是否为多个用户。默认是只有1个接收者。如果要多个用户可以接受消息,需要设置=true

--创建多个接收者的消息队列表

dbms_aqadm.create_queue_table('WDZMUTIAQTABLE','WDZAQMSG',sort_list = 'PRIORITY,enq_time',

message_grouping =dbms_aqadm.TRANSACTIONAL/*dbms_aqadm.NONE*/

,multiple_consumers = true);

4.2删除队列表

Exec dbms_aqadm.drop_queue_table(queue_table = 'sms_mt_tab');

Exec dbms_aqadm.drop_queue_table(queue_table = 'sms_mo_tab');

4.3建立队列

建立队列代码如下:

exec dbms_aqadm.create_queue(queue_name='sms_mt_queue', queue_table='sms_mt_tab');

exec dbms_aqadm.create_queue(queue_name='sms_mt_queue_exception', queue_table='sms_mt_tab',queue_type=dbms_aqadm.EXCEPTION_QUEUE);

exec dbms_aqadm.create_queue(queue_name='sms_mt_queue_backup', queue_table='sms_mt_tab');

求oracle DBA 大神. ora-600, 队列表.

这个问题在MyOracleSupport上有文档讲

Getting ORA-600 [kcbgcur_3] When Creating a Queue Table (Doc ID 555035.1)

这个错误是因为之前有人drop过这个队列表,但是没有成功。导致AQ Metadata损坏。

依次尝试如下步骤

DBMS_AQADM.DROP_QUEUE_TABLE(queue_table = 'qtable_name');

DBMS_AQADM.DROP_QUEUE_TABLE(queue_table = 'qtable_name', force = TRUE);

尝试创建队列表,如果不行

重启实例以清除内存残留信息

尝试创建队列表,如果还不行,需要手动的清除AQ metadata.这个得找Oracle Support部门开SR。我也不知道怎么手动清除。


分享标题:oracle怎么创建队列 如何创建队列
URL分享:http://hbruida.cn/article/hiijei.html