1,并行扫描分区表

数据库操作语句

DDL:(Data Definition
Language)数据库定义语言

DML(insert,update,delete)

DML是数据操作语言,对表的的内容进行相关操作(增、删、改)

按照ROWID扫描分区表:

insert into liubo values(1,'小明',12);
insert into liubo(name,priovince,sge) values('名','山东',20);插入一个数据
insert into liubo(name,priovince,sge) values('名','山东',20),('名','山东',20),('名','山东',20),('名','山东',20);插入多个数据,中间用逗号隔开;
用delete删除数据,【注意】用where限制,不然表中数据全部没有了。
delete from bb where id =2; 
update更新数据,【注意】也要住where限制
update liubo set money = 4000,age=30 where id  = 1;

它是定义数据库的语言,

1.插入数据
insert into 表名(列,列…)values(值,值…)
//当插入的数据与表格一一对应时,列可以省略
insert into 表名 values(值,值…)

  • 插入数据
  • 修改数据
  • 删除数据

select /*+ PARALLEL(SALES,9)*/ * FROM SALES;

里面包含:

例如:–给tbl_user表中添加一条记录
insert into tbl_user values (22,’刘强东’,’123456′);


V$PQ_TQSTAT:可以查看包含并行执行操作上的统计量.帮助在一个查询中测定不平衡的问题.
最好是每个并行的servers最好工作量差不多。可以看出每个从属进程的处理的数。只有发出并行语句的SQL的session才可以看,其他的session看不到。

CREATE
ALTER
DROP
TRUNCATE
COMMENT
RENAME

2.更新数据
update 表名 set 列=新值 where 条件;

一. 插入数据

  • INTERT INTO 表名(列名1,列名2, …) VALUES(列值1, 列值2, …);

    • 在表名后给出要插入的列名,其他没有指定的列等同与插入null值。所插入记录总是插入一行。
    • 在VALUES后给出列值,值的顺序和个数必须与前面指定的列对应
  • INTERT INTO 表名 VALUES(列值1, 列值2);

    • 没有给出要插入的列,那么表示插入所有列。

    • 值的个数必须是该表列的个数。

    • 值的顺序,必须与表创建时给出的列的顺序相同。

      1.插入所有列
      INSERT INTO stu(
         number, name, age, gender
       )
      VALUES(
         'ID001', '张三', 28, 'male'
       );
      2.插入部分列,没有指定的列默认为NULL值
      INSERT INTO stu(
          number, name
      ) VALUES(
         'ID002', '李四'
      )
      3.不给出插入列,那么默认为插入所有列!值的顺序要与创建表时列的顺序相同
      INSERT INTO stu VALUES(
         'ID003', '王五', 82, 'female'
      );
      

SQL> select * from v$pq_tqstat;

DML:(Data
Manipulation Language)数据操纵语言

例如:–修改tbl_user表中第二行记录的用户名
update tbl_user username = ‘章泽天’ where id = 2;

二. 修改数据

  • UPDATE 表名 SET 列名1=列值1, 列名2=列值2, … [WHERE 条件]
    *条件必须是一个boolean类型的值或表达式(可选) *
    运算符:=、!=、<>、>、<、>=、<=、BETWEEN…AND、IN(…)、IS
    NULL、NOT、OR、AND

    WHERE age >= 18 AND age <= 80
    WHERE age BETWEEN 18 AND 80
    WHERE name='张三' OR name='李四'
    WHERE name IN ('张三', '李四')
    WHERE age IS NULL (不能使用等号)
    WHERE age IS NOT NULL 
    

DFO_NUMBER      TQ_ID SERVER_TYPE                              
 NUM_ROWS      BYTES  OPEN_TIME AVG_LATENCY      WAITS   TIMEOUTS
PROCESS                    

它是对数据库进行操作的语言,查询和更新等操作。

注意:修改操作千万要注意条件!!!

三. 删除数据

  • DELETE FROM 表名 [WHERE 条件];
  • TRUNCATE TABLE 表名;
    TRUNCATE是DDL语句,它是先删除drop该表,再create该表。而且无法回滚!

在数据库中所有的字符串类型,必须使用单引,不能使用双引,包括日期类型在内

               INSTANCE

动作有:

3.删除数据
delete 表名 where 条件


SELECT
INSERT
UPDATE
DELETE
MERGE
CALL
EXPLAIN PLAN
LOCK TABLE

例如:删除用户表格第三行
delete tbl_user where id = 4;


 

–删除用户表格第三行的密码


参考文章:

 

         1          0 Producer                                    
103114    3851028          0           0         13         0 P008      
                                        1

     

注意:此处不能违反约束

         1          0 Producer                                    
104775    3892852          0           0         13         0 P007      
                                        1

 


         1          0 Producer                                    
 98771    3672836          0           0         12         0 P006      
                                        1

DML语句和DDL语句的差别
1.DML语句不会自动提交,也就是说当运行完DML语句后,数据库中真实的数据还没有发生变化,当前自己事务中看到的仅仅是内存中的情况,所以此时,另外一个事务是无法看到修改结果的。
如果要把修改后的结果同步到数据库中,则必须手动使用如下命令:
–提交数据,把内存中的数据提交同步到数据库中
commit;

         1          0 Producer                                    
102038    3797736          0           0         13         0 P005      
                                        1

即:一个事务无法读取到另一个事务还没有提交的数据!!!

         1          0 Producer                                    
 98982    3694298          0           0         14         0 P003      
                                        1

注意:plsql中默认情况下DML 语句会自动提交

         1          0 Producer                                    
104311    3877078          0           0         13         0 P004      
                                        1

–回滚操作,撤销还没有提交的操作
rollback 回滚点名字;

         1          0 Producer                                    
100393    3715209          0           0         12         0 P002      
                                        1

–设置回滚点【不需要掌握】
savepoint 回滚点名字

         1          0 Producer                                    
105659    3927959          0           0         13         0 P001      
                                        1

2.DDL语句是自动提交的

         1          0 Producer                                    
100800    3742268          0           0         14         0 P000      
                                        1

 

         1          0 Consumer                                    
918843   34171264          0           0         18         11 QC      
                                         1

10 rows selected.

 

2, 并行扫描索引分区

并行可以在分区间的表和索引上执行,前提是提示(hint)里必须有表名,索引名和并行度(DOP).

例如:

 select  /*+ parallel_index(s,SALES_PROD_BIX,3) */  * from sales
s;

 

3,智能化分区连接(partitionwise join)

a,Partial partitionwise join

一个表T1有3个分区,一个表T2没有分区,但是他们是通过ID连接的
T1.id=T2.id,

假设DOP=3,则T1表上三个SERVERS同时并行扫描,然后通过广播的方式扫描T2表,

此时T2表会被动态的分成三份。

b,Full partitionwise join(即两个表示equi-partitioned)

 

4,并行DML

a, 打开alter session enable parallel dml;

b, 先是QUERY,后进行UPDATE

c, 即使DML disable, QUERY并行还是可以的。

d, session 的DML默认是Disable

分区表特别适合做并行

例如:

alter session enable parallel DML;

 

drop table t1 purge;

create table t1 as select * from sales where rownum<5000;

SQL> set autotrace traceonly exp

SQL> update /*+ parallel(t1,4) */ t1 set
amount_sold=amount_sold*1.1;

4999 rows updated.

 

Execution Plan


Plan hash value: 121765358


| Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)|
Time     |    TQ  |IN-OUT| PQ Distrib |


|   0 | UPDATE STATEMENT      |          |  4999 | 64987 |     2   (0)|
00:00:01 |        |      |            |

|   1 |  UPDATE               | T1       |       |       |            |
         |        |      |            |

|   2 |   PX COORDINATOR      |          |       |       |            |
         |        |      |            |

|   3 |    PX SEND QC (RANDOM)| :TQ10000 |  4999 | 64987 |     2   (0)|
00:00:01 |  Q1,00 | P->S | QC (RAND)  |

|   4 |     PX BLOCK ITERATOR |          |  4999 | 64987 |     2   (0)|
00:00:01 |  Q1,00 | PCWC |            |

|   5 |      TABLE ACCESS FULL| T1       |  4999 | 64987 |     2   (0)|
00:00:01 |  Q1,00 | PCWP |            |


Note


   – dynamic sampling used for this statement

#从这里的执行计划可以看到,update语句在PX
COORDINATOR之上,明显是进行串行update。这时我们打开alter session enable
parallel dml开关,如下会报错。因为前面那个事务还没有结束。

SQL> alter session enable parallel DML;

ERROR:

ORA-12841: Cannot alter the session parallel DML state within a
transaction

SQL> rollback;

Rollback complete.

SQL> alter session enable parallel dml;

Session altered.

SQL> update /*+ parallel(t1,4) */ t1 set
amount_sold=amount_sold*1.1;

27 rows updated.

 

Execution Plan


ERROR:

ORA-12838: cannot read/modify an object after modifying it in parallel

 

SP2-0612: Error generating AUTOTRACE EXPLAIN report

#因为这里实现了并行dml,因此针对plan_table的insert也变成并行了,针对同一个事务中,不能查询被并行dml了的表,所以这里报错。

SQL> rollback;

Rollback complete.

SQL> set autotrace off;

SQL>  explain plan for update /*+ parallel(t1,4) */ t1 set
amount_sold=amount_sold*1.1;

Explained.

SQL> select * from table(dbms_xplan.display());

PLAN_TABLE_OUTPUT



Plan hash value: 3991856572


| Id  | Operation             | Name     | Rows  | Bytes | Cost (%CPU)|
Time     |    TQ  |IN-OUT| PQ Distrib |


|   0 | UPDATE STATEMENT      |          |  4999 | 64987 |     2   (0)|
00:00:01 |        |      |            |

|   1 |  PX COORDINATOR       |          |       |       |            |
         |        |      |            |

|   2 |   PX SEND QC (RANDOM) | :TQ10000 |  4999 | 64987 |     2   (0)|
00:00:01 |  Q1,00 | P->S | QC (RAND)  |

|   3 |    UPDATE             | T1       |       |       |            |
         |  Q1,00 | PCWP |            |

|   4 |     PX BLOCK ITERATOR |          |  4999 | 64987 |     2   (0)|
00:00:01 |  Q1,00 | PCWC |            |

|   5 |      TABLE ACCESS FULL| T1       |  4999 | 64987 |     2   (0)|
00:00:01 |  Q1,00 | PCWP |            |

PLAN_TABLE_OUTPUT




Note


   – dynamic sampling used for this statement

16 rows selected.

查看这里真正的并行dml的执行计划,可以看到,update语句是作为PX
COORDINATOR的儿子存在,并且update对应的是PCPW操作,而不是P->S的操作。很明显,这里检索记录使用了并行,同时更新也是用了并行。

SQL> alter session enable parallel dml;

Session altered.

SQL> update /*+ parallel(t1,4) */ t1 set
amount_sold=amount_sold*1.1;

4999 rows updated.

SQL> update t1 set amount_sold=amount_sold*1.1 where rownum=1;

update t1 set amount_sold=amount_sold*1.1 where rownum=1

       *

ERROR at line 1:

ORA-12838: cannot read/modify an object after modifying it in parallel

注意:ORA-12838 错误表示只要是enable parallel
dml,这个时候一个对象被并行更新后(没有commit or rollback)是不能进行read
or update的。当然其他的session
对此表的操作部受影响的。只是对自己的session受影响。当然如果alter session
disable parallel dml; 再进行并行的更新后,是可以进行read or
update的。看下面例子:

SQL> alter session disable parallel dml;

Session altered.

SQL> update /*+ parallel(t1,4) */ t1 set
amount_sold=amount_sold*1.1;

4999 rows updated.

SQL> update t1 set amount_sold=amount_sold*1.1 where rownum=1;

1 row updated.www.2cto.com

第一个SQL做了并行后,我没有commit or
rollback,下面一个SQL语句是可以做更新的。

注意:parallel_adaptive_multi_user设置为true的话,系统会自动的调整你的parallel的值,不会生成你的需要的期望值。设置成false就可以了。

并行DML详解:

update和delete语句的并行分为2部分,一部分是检索数据,而另一部分则是更新数据。

如果在update语句和delete语句里添加parallel提示,但是没有设置alter
session enable parallel
dml。则这时仅仅是update和delete语句中的检索数据的部分

会启用并行,实际更新的时候仍然是串行。但是,如果同时设置了alter session
enable parallel dml,则检索数据和更新数据都会使用并行。

 

 

 

关于并行的一些视图信息:

V$PX_SESSION

V$PX_PROCESS

V$PX_SESSTAT

V$PQ_SESSTAT

 

按照ROWID扫描分区表: select /*+
PARALLEL(SALES,9)*/ * FROM SALES;
V$PQ_TQSTAT:可以查看包含并行执行操作上的统计量.帮助在一个查询中…

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图