Exadata一体机最佳实践.ppt_第1页
Exadata一体机最佳实践.ppt_第2页
Exadata一体机最佳实践.ppt_第3页
Exadata一体机最佳实践.ppt_第4页
Exadata一体机最佳实践.ppt_第5页
已阅读5页,还剩84页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1,a,娄恒: heng.lou APAC Exadata specialist,BOC ACRM数据库物理模型和开发最佳实践,2,a,提纲,数据库空间管理 数据仓库物理表设计(表压缩、表分区) 数据加载 并行执行 开发注意事项(集合、关联操作) 索引管理 统计信息收集,3,a,Tips 1:设置合适的DB_Block_Size,对Exadata而言,MAX_IO_SIZE缺省为1MB 所以推荐DB_BLOCK_SIZE设置为8192 同时推荐DB_FILE_MULTI_BLOCK_READ_COUNT设置为128 因为_ MAX_IO_SIZE = DB_FILE_MULTI_BLOCK_R

2、EAD_COUNT * DB_block_size。,4,a,Tips:采用locally managed, Bigfile创建表空间,5,a,Tips:选择表空间合适的Extent管理方法,采用Auto-Allocate方式,Oracle自动管理表的Extent的大小,开始时初始的Extent大小为64KB(除Partition表外),当表或索引的段(Segment)大小超过1MB,Extent以1MB为单位增长段空间,一旦段大小超过64MB,Extent以8MB为单位增长段空间。 采用Uniform方式,所有段的Extent大小都是统一大小。对于Auto-Allocate方式和Unifor

3、m方式的选择,Oracle推荐采用Auto-Allocate作为Extent的管理方式。,6,a,Sales Table,Uniform Extent:数据并行加载特点,假设有4个并行进程进行数据加载,Uniform extend 大小为8MB,7,a,Auto-Allocate Extent:数据并行加载特点,假设有4个并行进程进行数据加载,initial ,select p1 File #, p2 Block #, p3 Reason Code from v$session_wait where event = buffer busy waits;,为了避免文件头争用情况,可以采用多个Bi

4、g file tablespace来均匀存放Partition table。例如:下面语句使用4个表空间来均匀存放128个Subpartition表:,9,a,Tips:对于分区表(Partition)加载,启用Large Extent,推荐大的对象使用Large Extent方式,以便减少Extent的数量。当设置CELL_PARTITION_LARGE_EXTENTS=TRUE时,所有分区表在创建时,将自动启动Large Extent模式(8MB),即创建时Initial Extent大小为8MB。 限制条件: CELL_PARTITION_LARGE_EXTENTS仅适用于:分区表、lo

5、cally managed和AUTO-ALLOCATE的表空间。 不适合于:非分区表、Uniform的表空间的对象。,10,a,Tips:针对非分区表(Non-Partition)加载,使用Large Extent,如果对于非分区表,想使用Large Extent(8MB)。需要在Create table的DDL中设置INITIAL和NEXT子句。 当对非分区表进行并行数据加载时,数据在Temp段中被生成,然后再合并到要加载的数据表的Extent中,缺省按照64KB Extent大小进行数据增长。但从11.1.0.7开始,在加载数据时(Load),NEXT用来控制新的Extent的大小。所以对

6、于大的非分区表加载,可以直接将INITIAL和NEXT都设置为8MB。SQL如下:,Create Table sales(.) parallel storage (INITIAL 8M NEXT 8M) (.),11,a,Tips:关闭deferred_segment_creation(段延迟创建)功能,从11g R2开始,当在Locally Managed Tablespace上,创建一个非分区表时,缺省情况表的空间分配会启用延迟分配方式,即当首行被Insert到表中时,表的Extent才会被逐渐分配。建议关闭延迟空间空间分配,可以通过如下SQL关闭:,Alter system set de

7、ferred_segment_creation = FALSE scope=both,12,a,Tips : 空间回收Shrinking Segments,HWM,HWM,ALTER TABLE employees SHRINK SPACE COMPACT;,1,ALTER TABLE employees SHRINK SPACE;,2,DML operations and queries can be issued during compaction.,DML operations are blocked when the HWM is adjusted.,13,a,Shrinking Se

8、gments by Using SQL,ALTER SHRINK SPACE CASCADE,TABLE OVERFLOW,INDEX,MATERIALIZED VIEW,MATERIALIZED VIEW LOG,MODIFY PARTITION,MODIFY SUBPARTITION,MODIFY LOB,ALTER TABLE employees SHRINK SPACE CASCADE;,ALTER TABLE employees ENABLE ROW MOVEMENT;,1,2,ALTER TABLE employees MODIFY LOB(resume) (SHRINK SPAC

9、E);,3,ALTER TABLE employees OVERFLOW SHRINK SPACE;,4,14,a,提纲,数据库空间管理 数据仓库物理表设计(表压缩、表分区) 数据加载 并行执行 开发注意事项(集合、关联操作) 索引管理 统计信息收集,15,a,Tips:数据仓库设计,一个典型的数据仓库是一个Many Rows System ,但经常会被用Few Rows System的方式来开发(Row By Row) 在大多数情况下,Many Rows System还是Few Rows System可以通过SQL语句的执行频度决定: 1/Sec 代表 many rows 1000/Sec代

10、表 few rows 备注:在Many Rows System中,可能存在一种误导:批量集合操作(Set Based Operation)通过Row By Row的操作方式开发效率更高,16,a,Tips:数据仓库物理模型设计原则,Many Rows 并行(Parallelism) 分区(Partitioning) 压缩(Compression) 集合批量操作(Set-based techniques) 通过数据转换代替实现数据更新(Data modified by transformation) Few Rows 索引(Index design) 物化视图(Materialized view

11、s and aggregates),17,a,Tips:数据压缩考虑,压缩技术是数据仓库物理设计最重要的因素之一 压缩的影响: 极大加速表扫描速度、减少磁盘空间占用、加速数据备份 但是,压缩对大大降低UPDATE和DELETE的效率 一个好的数据仓库模型,对于压缩表而言,将只采用Append方式操作,避免采用修改(Update、Delete、Merge)方式对数据的操作,以保证对压缩表操作的效率 但是如果一些经常更新的大表确实有压缩的需求,可以考虑使用OLTP压缩技术。 无论HCC压缩还是OLTP压缩,其本质都是去重,只是其算法上有些差异。因而如果在数据加载时,对数据预先排序,那么可带来明显的

12、压缩比率的提升。 一般来说,压缩级别QUERY HIGH既可以得到一个理想的压缩比率,也能提供很好的查询性能,可以考虑作为初始测试的压缩级别.,18,a,Tips:EHCC 混合列压缩,EHCC (Exadata Hybrid Columnar Compression) 不是完全的列压缩,而是混合列存储 EHCC具备多种压缩类型 Query low Query high Archive low Archive high 设计用于不频繁修改的数据 设计用于低并发的场景 支持数据库各种功能 DMLs/DDLs, Partitioning, PQ, PDML, Online redefinition

13、, CTAS, IAS, SQL Loader, External tables, Context, MVs etc. 支持索引 只有在数据批量加载时被压缩,19,a,Tips:如何创建EHCC表,CTAS (create table as select) create table foo compress for query as select * from bar1; IDL (insert direct load) create table foo compress for archive low; insert /*+APPEND*/ into foo select * from ba

14、r2; 压缩可以在Segment一级指定: 每个分区可以有不同的压缩类型 例如: create table orders (cid, pid, sid, price, discount, odate) partition by range (cid) (partition p1 values less than (100000) nocompress, partition p2 values less than (200000) compress for archive low, partition p3 values less than (300000) compress for query

15、 high, partition p4 values less than (maxvalue) compress for query low) enable row movement as select * from prev_orders;,20,a,Tips:动态启用或停用表的EHCC,Existing tables/partitions can be converted to use EHCC alter table bar move compress for query high alter table orders modify partition p1 move compress

16、for archive low New data loaded in existing tables/partitions can go to EHCC blocks, keeping the existing data as is alter table bar compress for query high alter table orders modify partition p3 compress for query low EHCC can be disabled alter table bar nocompress alter table bar move nocompress O

17、nline redefinition package can be used for enabling/disabling EHCC,21,a,Tips:分区(Partition)设计目的,数据管理 Exchange data in/out Break down operations into smaller pieces 查询优化 Partition pruning Hash based joins and sorts,22,a,Tips :数据仓库分区(Partition)策略,一级分区:首先按日期对大表进行分区 主要目标是启动分区修剪(Partition Pruning),简化数据管理

18、主要对于日期字段进行Range 或interval分区 选择大部分查询查询用到的日期字段作为分区列 这个日期字段(用于分区列)应该是不易变(不被更新) 二级子分区(Subpartition)可以按照: Hash分区,更好地支持join和Sort RANGE或LIST分区,更好的支持分区修剪( Partition Pruning),23,a,Tips:定义合理的Hash分区数量,Oracle推荐大的分区表使用Hash分区作为分区方法,为了保证数据在Hash Partition间均匀分布,Hash分区的数量建议是2的指数幂,或者设置Partition数量为CPU数量的2倍。然而每个hash Par

19、tition应该至少不小于16MB。小于16MB将在并行执行下不会有较好的扫描效率。 首先考虑分区数是2的整数幂的情况:当Oracle的分区数从2个变为4个,Oracle并不需要将所有数据重新打乱,而是将原有的2个分区每个都一分为二。同样的道理,如果将分区数设置为8,Oracle会将原有的4个分区一分为二。 Oracle的HASH分区就像是一棵大的二叉树。每个分区就相当于二叉树的一个叶节点。二叉树的第一层,只有一个根节点,对应只有1个分区的情况。二叉树的第二层,两个叶节点,对应2个分区的情况。二叉树的第三层,4个叶节点,对应4个分区的情况。二叉树的第n层,2(n-1)个叶节点,对应2(n-1)

20、个分区情况。,24,a,Tips:使用Partition-wise joins,对于两个大表关联操作,推荐使用partiton-wise joins来减少并行进程间数据交换,减少查询的执行时间。对于使用full partition-wise join,两个关联的表必须是相同的Partition键值(即两个表必须有相同的Partition列、相同的Partition方法、相同的Partition数量)。如下是采用partiton-wise joins的两个表关联的执行计划,Sales表和Customers表具有相同的并行度、Hash Partition方法(Cust_id列作为Hash Part

21、ition Key)、Join列是Partition Key。,25,a,SELECT sum(amount_sold) FROM sales s, customer c WHERE s.cust_id=c.cust_id;,Both tables have the same degree of parallelism and are partitioned the same way on the join column (cust_id),Sales,Range partition May 18th 2008,Sub part 2,Sub part 3,Sub part 4,Sub part

22、 1,Part 1,Part 2,Part 3,Part 4,Partition Wise join,对于partition-wise join而言,查询的并行度必须是等于或成倍于表分区的数量,26,a,SELECT sum(s.amount_sold) FROM sales s WHERE s.time_id BETWEEN to_date(01-JAN-1999,DD-MON-YYYY) AND to_date(31-DEC-1999,DD-MON-YYYY);,Q: What was the total sales for the year 1999?,Tips:分区裁剪(Partiti

23、on Pruning),SALES_Q4_1998,SALES_Q1_1999,SALES_Q2_1999,SALES_Q3_1999,SALES_Q4_1999,SALES_Q1_2000,27,a,Tips:如何检查分区修剪是否生效,Sample plan,Only 4 partitions are touched 9, 10, 11, ,Overall partition #,range partition #,Sub-partition #,29,a,提纲,数据库空间管理 数据仓库物理表设计(表压缩、表分区) 数据加载 并行执行 开发注意事项(集合、关联操作) 索引管理 统计信息收集,

24、30,a,Tips:使用External Table进行数据加载,Oracle推荐使用External Table方式加载数据,而不第一推荐SQL*Loader,因为SQL*Loader做并行数据加载时,数据首先被加载到TEMP Extent中,只有在transaction 被Commit时,Temp Extent会被合并到实体表的段(Segment)中,而在原来表中的部分满的Extent(partially full extents)会被跳过,所以到导致空间浪费和性能浪费。所以对于大量加载的Partition表,这样可能会导致较大的空间浪费情况。 采用External Table方式加载时,

25、会有如下好处: Full usage of SQL capabilities directly on the data Automatic use of parallel capabilities No need to stage the data again in the database Better allocation of space when storing data High watermark brokering Autoallocate tablespace will trim extents after the load Additional capabilities li

26、ke The usage of data pump files The usage of pre-processing,31,a,External Table,32,a,Tips:External Table预处理,允许文件在加载过程中被自动化预处理 例如:对压缩文件进行解压缩、排序等 预处理不支持对文件的自动的小颗粒化 需要提供多份文件,文件的数量决定了处理的并行度 需要授权对目录的读和执行的权限(Grant read, execute privileges directories),CREATE TABLE sales_external () ORGANIZATION EXTERNAL (

27、 TYPE ORACLE_LOADER DEFAULT DIRECTORY data_dir1 ACCESS PARAMETERS (RECORDS DELIMITED BY NEWLINE PREPROCESSOR exec_dir: gunzip OPTIONS -c FIELDS TERMINATED BY | ) LOCATION () );,33,a,Tips:直接路径加载(Direct Path Load),在每次IO异步请求时,数据被直接写入数据库存储 CTAS 语句总是使用 Direct Path 在Insert As Select 语句中使用 APPEND暗示方法也是Dire

28、ct Path Insert /*+ APPEND */ into Sales partition(p2) Select * From ext_tab_for_sales_data; 在一个对象上,只有一个direct path 操作能够起作用 通过指定一个表的分区表的名字方法,可以同时将多个Direct Pach加载操作到一个表,34,a,Tips:并行加载(Parallel Load),为了确保Direct Path加载成为并行操作,需要通过如下方式: 在Hint中指定并行度、或者在表上指定并行度 通过Alter Session语句启动会话级并行 当并行度被指定后,CTAS 会自动并行化加

29、载 IAS 不会自动并行化,他需要parallel DML的支持: ALTER SESSION ENABLE PARALLEL DML;,35,a,Tips:使用Parallel direct path 数据加载,使用“direct path load”可以带来很好的数据加载性能,因为数据会绕过Buffer Cache,直接写入数据库存储。CTAS总会使用“direct path load”,但是Insert As Select (IAS)并不是总会使用“direct path load”,为了使IAS使用“direct path load”,需要在IAS中加入APPEND hint,SQL如

30、下:,Insert /*+ APPEND */ into Sales partition(p2) Select * From ext_tab_for_sales_data;,ALTER SESSION ENABLE PARALLEL DML; Insert /*+ APPEND */ into Sales partition(p2)Select * from ext_tab_for_sales_data;,为了让“direct path load”以并行方式运行,可以以下两种方式设置并行度:1)在CTAS和IAS中加入PARALLEL hint;2)在External table和目标加载Ta

31、ble上,设置PARALLEL子句。一旦设置了并行度,CTAS将自动执行并行化的“direct path load”,而IAS将不会。为了让IAS能够并行化执行“direct path load”,出了设置并行度外,还必须通过alter the session to enable parallel DML。SQL如下:,36,a,Tips:在数据加载时,对于常访问的字段,可以进行排序,以便增加Storage index的效率,对在使用 INSERT /*+ APPEND */ 做数据加载时,可以对查询中Where条件中使用较多的列进行Order By排序,以便增加数据压缩率和Storage i

32、ndex查询效率。,Select name,value/1024/1024 as stat_value from v$mystat s,v$statname n Where S.Statistic#=n.statistic# and name like %cell physical%,Insert into tablea select * from ext_tablea order by col1,col2,可以通过查询v$mystat,v$statname视图,通过看cell physical I0 bytes saved by storage index统计值,来检查多少I/O被减少。SQ

33、L如下:,37,a,Tips:通过表分区交换做数据加载(Partition exchange load),Oracle建议对大的数据表采用分区表,分区表的好处之一就是可以通过分区交换方式(Partition Exchange)进行数据加载,这样可以最小化的对业务影响情况下进行快速数据加载。Partition Exchange可以允许用户交换非分区表数据到一个表的分区中。分区交换命令并不真正移动两个表的数据,而是简单的Update数据字典信息。由于没有进行数据移动,所以数据非分区表需要与分区表有相同的存储结构(存储在合适的表空间、相同的Extent Size)。SQL如下:,Create Tab

34、le tmp_sales2(.) parallel storage (INITIAL 8M NEXT 8M) tablespace main_fact_tbs . Alter table Sales exchange partition p2 with table tmp_sales2 including indexes without validation;,38,a,DBA,Tips:Partition Exchange loading操作过程,39,a,提纲,数据库空间管理 数据仓库物理表设计(表压缩、表分区) 数据加载 并行执行 开发注意事项(集合、关联操作) 索引管理 统计信息收集,

35、40,a,Tips:并行执行的适用情况,并行执行是Exadata最强大的能力之一,充分利用Exadata的并行计算能力可以极大提高系统利用率。但是我们必须要确认并行使用的时机,以及并行使用的程度。 并行适用场景: 并行执行应该在所有的资源密集型操作中被使用,例如:复杂查询、大量数据处理DML、大表建索引、收集统计信息、大量数据加载等。只有在表数据小于64MB或者同时有上百个并发用户执行操作时,不建议使用并行执行操作。 并行不适用场景: 短交易(几秒钟或更少)。在这些环境中并行执行是没有什么用处,因为协调并行执行服务器会增加相关的成本,这种协调的成本可能超过并行带来的好处。 已经大量使用CPU、

36、内存或I / O资源的环境。并行执行旨在利用其它可用的硬件资源,如果没有这样的资源可用,那么并行执行不产生任何效益,并且可能损害性能。,41,a,Tips:并行执行工作过程,用户连接到数据库,User,后台进程被派生,当用户发出一个并行SQL,后台进程就变成为QC(Query Coordinator),Messages,QC connection,Parallel server connection,42,a,Producers,Consumers,Query coordinator,Hash join 会首先选择小表作为驱动表,进行扫描,在这个例子中Customers表示小表,4个Produ

37、cer 并行进程并行扫描,并且返回就过给Consumers进程,P8,P7,P6,P5,SALES Table,CUSTOMERS Table,SELECT c.cust_last_name, s.time_id, s.amount_sold FROM sales s, customers c WHERE s.cust_id = c.cust_id;,并行执行的工作机制,43,a,Producers,Consumers,Query coordinator,一旦4个Producer进程完成了小表的扫描,他们开始对大表(Sales表)进行并行扫描,并返回结果给Consumer进程,P8,P7,P6

38、,P5,SALES Table,CUSTOMERS Table,SELECT c.cust_last_name, s.time_id, s.amount_sold FROM sales s, customers c WHERE s.cust_id = c.cust_id;,并行执行的工作机制,44,a,Producers,Consumers,P8,P7,P6,P5,一旦Consumer进程收到了两个表的数据,他们开始做并行的Join操作,一旦完成join操作,就将结果返回给QC进程,Query coordinator,SALES Table,CUSTOMERS Table,SELECT c.c

39、ust_last_name, s.time_id, s.amount_sold FROM sales s, customers c WHERE s.cust_id = c.cust_id;,并行执行的工作机制,45,a,SELECT c.cust_last_name, s.time_id, s.amount_sold FROM sales s, customers c WHERE s.cust_id = c.cust_id;,Tips:检查并行执行情况,46,a,select sum(revenue), store from line_items Where profit(price,unit

40、s) 0.2 order by store,Data on Disk,Query Servers,scan,scan,scan,sort A-K,sort L-S,sort T-Z,dispatch work; assemble results,Producers or scanners,Consumers Or Aggregators),Coordinator,并行进程的任务,47,a,Tips:不同操作并行方式Group by,Order by,进程1,进程2,进程3,进程4,进程5,进程6,进程1,进程2,进程3,进程4,进程5,进程6,Hash分布,Hash key 1,Hash ke

41、y 2,Hash key 3,Hash key 4,Hash key 5,Hash key 6,进程1,进程2,进程3,进程4,进程5,进程6,进程1,进程2,进程3,进程4,进程5,进程6,Range分布,A-H,I-M,N-R,S-U,V-X,Y-Z,Group By,Order By,Hash分区效率最高,Range分区效率最高,48,a,Tips:数据分布的例子,select count(*) from yellow y, green g where y.deptno = g.deptno,49,a,Tips:并行进程中不同的数据分布方式,50,a,Tips:并行度设置,建议采用默认传

42、统手工管理方式 (PARALLEL_DEGREE_POLICY=LIMITED/MANUAL)。在这种情况下需要对数据量有一个预估,然后设置的并行度应该给每个进程分配到的至少为上百兆数据。一个典型的初始预估模式: 200MB以下的小对象:不并行 200MB-5GB的对象:并行度4 5GB以上的大对象:并行度32 * 最终采用的并行度需要经过测试才能确定,51,a,Tips:启用并行执行,1.在表上执行并行,alter table sales parallel ; alter table customers parallel ;,select /*+ parallel(c) parallel(s

43、) */ c.state_province, sum(s.amount) revenue from customers c, sales s where s.customer_id = c.id,/并行查询 alter session force/enable parallel query ; alter session disable parallel query ; /并行DML alter session force/enable parallel DML; alter session disable parallel dml; /并行DDL alter session force/en

44、able parallel DDL; alter session disable parallel DDL;,2.在SQL级使用Hint启用并行,3.在会话(Session)上,启用并行,52,a,Tips:如何检查并行执行的情况,1.检查系统并行进程使用情况: 2.检查系统各个并行任务分布情况 3.检查并行的系统统计,Select inst_id,status,count(*) from gv$px_process group by inst_id,status; INST_ID STATUS PX_SERVERS# - - - 1 AVAILABLE 4 1 IN USE 12 2 AVA

45、ILABLE 8 2 IN USE 8,Select inst_id,sid,degree,req_degree,server# from gv$px_session;,select name,value from v$sysstat where upper(name) like %PARALLEL OPERATIONS% or upper(name) like %PARALLELIED or upper(name) like %PX%;,53,a,Tips:并行服务相应的参数,54,a,提纲,数据库空间管理 数据仓库物理表设计(表压缩、表分区) 数据加载 并行执行 开发注意事项(集合、关联操

46、作) 索引管理 统计信息收集,55,a,Tips:表Join方法(1)-Sort Merge Join,1.排序合并连接(sort merge join): 排序合并连接(sort merge join):是一个集合操作,分类合并连接应该在索引不能用于查询的情况下考虑. 在于把两个大表读入内存并进行排序的成本,成本计算如下:cost of merge join = access cost of A + access cost of B + (sort cost of A + sort cost of B) 适用于查询整体返回大量结果集,两个大表做连接,且表已经排过序的情况下。当两个表已经排过序

47、时,使用排序合并连接的性能可能会优于散列连接。HASH_AREA_SIZE和SORT_AREA_SIZE设置过小,可能会导致优化器避开散列连接而选择排序合并连接。使用HINTS:use_merge,可以是表使用Sort Merge Join关联。,56,a,Tips:表Join方法(2)-Nested Loop Join,2.嵌套循环连接(nested loop join): 嵌套循环连接(nested loop join):是一个行操作,这种连接是OLTP应用中最常见的连接操作,并且通常很有效,但对于批量数据操作往往效率不高。因为此连接方法高度利用了索引。在于外表返回的每一行都要在内表中进行

48、匹配的成本,成本计算如下:cost of nested loop = access cost of outer + (number of rows from outer * access cost of inner) 适用于外表有效基数较小,内表连接字段含有索引,且查询整体返回结果集不太大(小于1万行)的情况下。使用HINTS:use_nl可以使执行计划按照Nested Loop方式执行。,57,a,Tips:表Join方法(3)-Hash Join,3.散列连接(hash join): 几乎是使用被连接表的全表扫描而来完成的.散列连接对于大表的相互连接,或者一个小表和一个超大型表的连接. 在

49、于将小表读入内存分成若干散列表,然后由大表对每个散列表都进行一次匹配的成本,成本计算如下:cost of hash join = access cost of smaller + (access cost of bigger * number of hash partitions of smaller) 适用于查询整体返回大量结果集,且有较小的连接表可以放入内存作为散列表的情况下。适用散列连接要注意HASH_AREA_SIZE要足够大,可以容下散列表。如果散列表无法完全放入内存,要设置较大的临时段,从而尽量提高I/O性能。HINTS:use_hash,58,a,Tips:修改Row by Ro

50、w 操作为集合操作,declare cur rec_cur; rec type_table%rowtype; begin open cur for select * from table1; loop fetch cur into if condition(rec) then insert into table2 else insert into table3 end if; end loop; end;,Move away from row by row processing,insert /*+ append */ into table2 select * from table1 wher

51、e condition insert /*+ append */ into table3 select * from table1 where not condition ,insert /*+ append */ first when condition then into table2 values else into table3 values select * from table1,To set based processing,59,a,Tips:改写Delete操作,60,a,Tips:改写UPDATE 操作,61,a,Tips:对Merge的改写,62,a,Tips:多表Ins

52、ert Unconditional INSERT ALL,INSERT ALL INTO sal_history VALUES(EMPID,HIREDATE,SAL) INTO mgr_history VALUES(EMPID,MGR,SAL) SELECT employee_id EMPID, hire_date HIREDATE, salary SAL, manager_id MGR FROM employees WHERE employee_id 200; 8 rows created.,63,a,Tips:多表Insert Conditional INSERT ALL,INSERT A

53、LL WHEN SAL 10000 THEN INTO sal_history VALUES(EMPID,HIREDATE,SAL) WHEN MGR 200 THEN INTO mgr_history VALUES(EMPID,MGR,SAL) SELECT employee_id EMPID,hire_date HIREDATE, salary SAL, manager_id MGR FROM employees WHERE employee_id 200; 4 rows created.,64,a,Tips:多表Insert Conditional INSERT FIRST,INSERT

54、 FIRST WHEN SAL 25000 THEN INTO special_sal VALUES(DEPTID, SAL) WHEN HIREDATE like (%00%) THEN INTO hiredate_history_00 VALUES(DEPTID,HIREDATE) WHEN HIREDATE like (%99%) THEN INTO hiredate_history_99 VALUES(DEPTID, HIREDATE) ELSE INTO hiredate_history VALUES(DEPTID, HIREDATE) SELECT department_id DE

55、PTID, SUM(salary) SAL, MAX(hire_date) HIREDATE FROM employees GROUP BY department_id; 8 rows created.,65,a,Tips:多表Insert Pivoting INSERT,INSERT ALL INTO sales_info VALUES (employee_id,week_id,sales_MON) INTO sales_info VALUES (employee_id,week_id,sales_TUE) INTO sales_info VALUES (employee_id,week_i

56、d,sales_WED) INTO sales_info VALUES (employee_id,week_id,sales_THUR) INTO sales_info VALUES (employee_id,week_id, sales_FRI) SELECT EMPLOYEE_ID, week_id, sales_MON, sales_TUE, sales_WED, sales_THUR,sales_FRI FROM sales_source_data; 5 rows created.,66,a,Tips:避免关联子查询,Correlated subqueries are used for

57、 row-by-row processing. Each subquery is executed once for every row of the outer query.,GET candidate row from outer query,EXECUTE inner query using candidate row value,USE values from inner query to qualify or disqualify candidate row,67,a,关联子查询,The subquery references a column from a table in the

58、 parent query.,SELECT column1, column2, . FROM table1 WHERE column1 operator (SELECT column1, column2 FROM table2 WHERE expr1 = .expr2);,outer,outer,68,a,SELECT last_name, salary, department_id FROM employees outer WHERE salary (SELECT AVG(salary) FROM employees WHERE department_id = outer.department_id);,Tips:改写关联子查询,Find all employees who earn more than the average salary in their department.,Each time a row from the outer query is processed,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论