oracle数据库性能优化实务第24讲多表连接_第1页
oracle数据库性能优化实务第24讲多表连接_第2页
oracle数据库性能优化实务第24讲多表连接_第3页
oracle数据库性能优化实务第24讲多表连接_第4页
oracle数据库性能优化实务第24讲多表连接_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

华章培训网、[]华章培训网多表连接的优化要点表连接的顺序表连接的方式多表连接的问题最终被分解为多次双表连接本节关注的和不关注的细节本节关注的内容:复杂表连接优化的思路和方法子查询优化的要点外联接优化CONNECT

BY的优化本节不关注的内容:执行计划分析表连接方式及相关优化要点表连接的顺序的优化建议表连接顺序最好从业务的角度考虑多表连接可以一层一层分析,每次只考虑两张表表连接顺序的选择原则是尽快减少连接结果集的大小表连接优化可能面临的问题无法从业务人员得到所需的信息连接条件十分复杂连接的表很多无法获得绑定变量的值多表连接的分析(1)分析WHERE条件分析WHERE条件了解每张表的过滤条件了解表之间的连接关系分析可能的连接顺序确定最佳连接顺序多表连接的分析(2)分析子查询为了便于分析部分子查询可以改写为表连接注意等价原则常见子查询模式EXISTS/NOT

EXISTSIN/NOT

INselect

d.dname

from

dept

d

where

exists(select

1

from

emp

e where

e.deptno

isnot

nulland

d.deptno=e.deptno

ande.ename

isnot

nulland

e.empno

>

1000)

and

d.deptnoisnot

null;select

d.dname

from

dept

dwhere

d.deptno

in

(select

e.deptno

from

emp

e);select

ename

from

empwhere

deptno

not

in

(select

deptno

from

dept)and

deptno

is

not

null;多表连接的分析(3)分析VIEW和INLINE

VIEWMERGE

VIEW不合理往往导致性能问题大部分INLINE

VIEW可以改写为等价表连接部分VIEW和INLINEVIEW可以用物化视图来优化多表连接的分析(4)分析表连接方式表连接方式对性能影响极大大多数多表连接出现突发性能问题和表连接方式有关主要的表连接方式NESTED

LOOPHASH

JOINSORT

MERGEJOIN案例(1)优化一个复杂SQLselect

acct_id,billing_cycle,bill_item_name,item_source_name,to_

char(sum(amount),'FM999999990.90')

amount,stateName,stateDate

from(

select

a.acct_id

,c.billing_cycle,d.bill_item_name,

item_source_name,a.amount,

stateName,to_char(a.state_date,'yyyy-mm-dd

hh24:mi:ss')

stateDate

from

(select

acct_item_type_id

,billing_cycle_id,acct_id,item_source_id,state,state_date,sum

(amount/100)

amount

from(

select

*

from

acct_item

where

acct_id

=165440341

and

serv_id

=169002286374

and

billing_cycle_id

in(10906)

)

group

by

acct_item_type_id,billing_cycle_id,acct_id,item_source_id,state

,state_date)

a,

(select

billing_cycle_id

,to_char(cycle_end_date

-1,'yyyy-mm')

billing_cycle

from

billing_cycle

where

state

in('10A','10R','10E','10D')

and

billing_cycle_idin(10906))c

,(select

x.acct_item_type_id

,y.bill_item_name,x.item_source_id

from

bill_item_acct_item

x

,bill_item

y

,

(selectdistinct

invoice_require_id

from

serv_acct

where

acct_id=165440341andserv_id

=169002286374

)

ee

,

bill_requement

ff,bill_format_bill_item

gg

where

x.bill_item_type_id

=

y.bill_item_type_idand

ee.invoice_require_id

=

ff.require_id

and

y.classify='55A'and

ff.bill_format_id

=

gg.bill_format_id

and

gg.bill_item_type_id

=

x.bill_item_type_id)d

,acct_item_source

e,

(select

domain,name

from

v_domain

where

table_name

='ACCT_ITEM'

andfield_name='STATE'

)

f

where

a.billing_cycle_id

=

c.billing_cycle_id

and

a.acct_item_type_id=

d.acct_item_type_id

and

a.item_source_id

=

d.item_source_id

and

a.item_source_id

=e.item_source_id

and

e.item_source_type='52A'

and

a.state=f.domain

)

group

by

acct_id

,billing_cycle,bill_item_name,item_source_name,stateName,stateDate

order

by

billing_cycle一个SQL的分析过程(1)格式化文本select acct_id,billing_cycle,bill_item_name,item_source_name,

to_char(sum(amount),'FM999999990.90')amount,stateName,stateDateFrom(

select a.acct_id

,c.billing_cycle,d.bill_item_name,

item_source_name,a.amount,stateName,to_char(a.state_date,'yyyy-mm-dd

hh24:mi:ss')

stateDatefrom(select

acct_item_type_id

,billing_cycle_id,acct_id,item_source_id,state,state_date,sum(amount/100)

amount

from (

select

*

from

acct_item

where

acct_id

=165440341

and

serv_id

=169002286374

andbilling_cycle_id

in

(10906) )

group

by

acct_item_type_id,billing_cycle_id,acct_id,item_source_id,state

,state_date )

a,(select

billing_cycle_id

,to_char(cycle_end_date

-1,'yyyy-mm')

billing_cycle from

billing_cyclewhere

state

in('10A','10R','10E','10D')

and billing_cycle_id

in(10906) )c

,(select

x.acct_item_type_id

,y.bill_item_name,x.item_source_id from

bill_item_acct_item

x

,bill_item

y

,(select

distinct

invoice_require_id

from

serv_acct

where

acct_id=165440

341

and

serv_id

=169002286374)

ee,

bill_requement

ff,bill_form

at_bill_item

ggwhere

x.bill_item_type_id

=

y.bill_item_type_id

and

ee.invoice_require_id

=

ff.require_id

and

y.classify='55A'

and

ff.bill_format_id

=

gg.bill_format_id

and gg.bill_item_type_id

=

x.bill_item_type_id)d

,acct_item_source

e,(select

domain,name

from

v_domain

where

table_name

='ACCT_ITEM'

and

field_name='STATE'

)

fwherea.billing_cycle_id

=

c.billing_cycle_id

anda.acct_item_type_id=

d.acct_item_type_id

anda.item_source_id

=

d.item_source_id

anda.item_source_id

=e.item_source_id

and

e.item_source_type='52A'

anda.state=f.domain

)group

by

acct_id

,billing_cycle,bill_item_name,item_source_name,stateName,stateDateorder

by

billing_cycle一个SQL的分析过程(2)截取子查询select a.acct_id

,c.billing_cycle,d.bill_item_name,

item_source_name,a.amount,stateName,to_char(a.state_date,'yyyy-mm-dd

hh24:mi:ss')

stateDatefrom(select

acct_item_type_id

,billing_cycle_id,acct_id,item_source_id,state,state_date,sum(amount/100)

amount

from (

select

*

from

acct_item

where

acct_id

=165440341

and

serv_id

=169002286374

andbilling_cycle_id

in

(10906) )

group

by

acct_item_type_id,billing_cycle_id,acct_id,item_source_id,state

,state_date )

a,(select

billing_cycle_id

,to_char(cycle_end_date

-1,'yyyy-mm')

billing_cycle from

billing_cyclewhere

state

in('10A','10R','10E','10D')

and billing_cycle_id

in(10906) )c

,(select

x.acct_item_type_id

,y.bill_item_name,x.item_source_id from

bill_item_acct_item

x

,bill_item

y

,(select

distinct

invoice_require_id

from

serv_acct

where

acct_id=165440

341

and

serv_id

=169002286374)

ee

,

bill_requement

ff,bill_form

at_bill_item

ggwhere

x.bill_item_type_id

=

y.bill_item_type_id

and

ee.invoice_require_id

=

ff.require_id

and

y.classify='55A'

and

ff.bill_format_id

=

gg.bill_format_id

and gg.bill_item_type_id

=

x.bill_item_type_id)d

,acct_item_source

e,(select

domain,name

from

v_domain

where

table_name

='ACCT_ITEM'

and

field_name='STATE'

)

fwherea.billing_cycle_id

=

c.billing_cycle_id

anda.acct_item_type_id=

d.acct_item_type_id

anda.item_source_id

=

d.item_source_id

anda.item_source_id

=e.item_source_id

and

e.item_source_type='52A'

anda.state=f.domain一个SQL的分析过程(3)识别行源视图1:(select

acct_item_type_id

,billing_cycle_id,acct_id,item_source_id,state,state_date,sum(amount/100)

amount

from (

select

*

from

acct_item

where

acct_id

=165440341

and

serv_id

=169002286374and billing_cycle_id

in

(10906) )

group

by

acct_item_type_id,billing_cycle_id,acct_id,item_source_id,state

,state_date)

a,视图2:(select

billing_cycle_id

,to_char(cycle_end_date

-1,'yyyy-mm')

billing_cyclefrom

billing_cyclebilling_cycle_id

in(10906)where

state

in('10A','10R','10E','10D')

and)c视图3:(select

x.acct_item_type_id

,y.bill_item_name,x.item_source_id

from

bill_item_acct_item

x

,bill_item

y

,(select

distinct

invoice_require_id

from

serv_acct

where

acct_id=165440

341

and

serv_id=169002286374)

ee

,bill_requement

ff,bill_form

at_bill_item

ggwhere

x.bill_item_type_id

=

y.bill_item_type_id

and

ee.invoice_require_id

=

ff.require_id

andgg.bill_item_type_id

=

x.bill_item_type_idy.classify='55A'

and

ff.bill_format_id

=

gg.bill_format_id

and)d表1:acct_item_sourcee,视图4:(select

domain,name

from

v_domain

where

table_name

='ACCT_ITEM'

and

field_name='STATE'

)

f一个SQL的分析过程(4)识别连接条件a.billing_cycle_id

=

c.billing_cycle_id

anda.acct_item_type_id=

d.acct_item_type_id

anda.item_source_id

=

d.item_source_id

anda.item_source_id

=e.item_source_id

ande.item_source_type='52A'anda.state=f.domain以A核心,其他表均通过A进行连接A上无过滤条件,唯一的过滤条件是E上的e.item_source_type='52A‘连接顺序应该是首选A+E连接,再考虑和其他表连接一个SQL的分析过程(5)分析A+E连接(selectacct_item_type_id

,billing_cycle_id,acct_id,item_source_id,state,state_date,sum(amount/100)

amount

from (

select

*

from

acct_item

where

acct_id

=165440341

andserv_id=169002286374and billing_cycle_id

in

(10906) )

group

by

acct_item_type_id,billing_cycle_id,acct_id,

item_source_id,state

,state_date)

aacct_item_source

eA+E连接的等价SQLselect

acct_item_type_id

,billing_cycle_id,acct_id,item_source_id,state,state_date,sum(amount/100)

amount

from(

select

*from

acct_item

X1,

acct_item_source

X2wherex1.acct_id

=165440341

andx1.serv_id

=169002286374

andx1.billing_cycle_id

in

(10906)

andx2.

item_source_type='52A‘

andx1.item_source_id

=x1.item_source_id)

group

by

acct_item_type_id,billing_cycle_id,acct_id,

item_source_id,state

,state_date一个SQL的分析过程(6)分析第一层连接select

acct_item_type_id,billing_cycle_id,acct_id,item_source_id,state,state_date,sum(amount/100)amount

from(

select

*fromacct_item

X1,

acct_item_source

X2where

x1.acct_id

=165440341

andx1.serv_id

=169002286374

andx1.billing_cycle_id

in

(10906)

andx2.

item_source_type='52A‘

andx1.item_source_id

=x1.item_source_id)

group

by

acct_item_type_id,billing_cycle_id,acct_id,

item_source_id,state

,state_date分析表连接的方式分析结果集的大小一个SQL的分析过程(7)创建用于分析的临时表CREATE

TABLE

TMP_TBL1ASselect

acct_item_type_id,billing_cycle_id,acct_id,item_source_id,state,state_date,sum(amount/100)amount

from(

select

*fromacct_item

X1,

acct_item_source

X2where

x1.acct_id

=165440341

andx1.serv_id

=169002286374

andx1.billing_cycle_id

in

(10906)

andx2.

item_source_type='52A‘

andx1.item_source_id

=x1.item_source_id)

group

by

acct_item_type_id,billing_cycle_id,acct_id,

item_source_id,state

,state_date;EXEC

DBMS_STATS.GATHER_TABLE_STATS(OWNNAME=>’…’,TABNAME=>’TMP_TBL1);一个SQL的分析过程(8)测试T+C的连接select

c.*(select

billing_cycle_id

,to_char(cycle_end_date

-1,'yyyy-mm')

billing_cyclefrom

billing_cyclewhere

state

in('10A','10R','10E','10D')

andbilling_cycle_id

in(10906))c

,tmp_tbl

twheret.billing_cycle_id

=

c.billing_cycle_id一个SQL的分析过程(9)测试T+D的连接select

d.*(select

x.acct_item_type_id

,y.bill_item_name,x.item_source_idfrom

bill_item_acct_item

x

,bill_item

y

,(select

distinct

invoice_require_id

from

serv_acct

where

acct_id=165440

341

andserv_id

=169002286374)

ee

,

bill_requement

ff,bill_form

at_bill_item

ggwherex.bill_item_type_id

=

y.bill_item_type_id

and

ee.invoice_require_id=

ff.require_idandy.classify='55A'

and

ff.bill_format_id

=

gg.bill_format_id

andgg.bill_item_type_id

=

x.bill_item_type_id)

d

,tmp_tbl1

twheret.acct_item_type_id=

d.acct_item_type_id

andt.item_source_id

=

d.item_source_id一个SQL的分析过程(10)测试T+F的连接select

d.*(select

domain,name

from

v_domainwhere

table_name

='ACCT_ITEM'

and

fi

温馨提示

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

评论

0/150

提交评论