ORACLE技术文档oracle 驱动表包含 hint使用 nested loop hash join sortmergegate方式Word下载.docx
- 文档编号:16025693
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:13
- 大小:18.71KB
ORACLE技术文档oracle 驱动表包含 hint使用 nested loop hash join sortmergegate方式Word下载.docx
《ORACLE技术文档oracle 驱动表包含 hint使用 nested loop hash join sortmergegate方式Word下载.docx》由会员分享,可在线阅读,更多相关《ORACLE技术文档oracle 驱动表包含 hint使用 nested loop hash join sortmergegate方式Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
分析:
假设a表10行记录,b表1000行记录,两个表都有id列,查询时使用id列进行关联
Select*froma,bwherea.id=b.idanda.id=100;
A表作为驱动表比较合适,假设a.id=100只有1行,即使全表扫描a表也就几个块,假设a表占用10个块。
B表的id假如非唯一,如果b表的id列有索引,b表占用100个块,每个块10行记录,id列索引占用10个块,并且id为100有2条记录,在两个块中
那么这条语句的成本(以块计算,下同):
A表(10个块)*b表索引(10个块)+b表id为100的2个块=102个块
如果b表没有索引,成本为:
A表(10个块)*b表(100个块)=1000个块
如果a,b表都没有索引,可以看出不管哪个表作为驱动表,语句的执行成本都是一样的。
如果a,b表id列都有索引,a表id列索引占2个块,成本为:
A表id列索引(2个块)*b表id列索引(10个块)+b表id为100的2个块=22个块
如果B表的记录很长,可以作为驱动表的情况比较复杂,大家可以自己想象适合的场景。
可以看出,在连接中,如果连接列有索引是多么的重要。
实验支撑
SQL>
createtablea(id,name)asselectobject_id,object_namefromall_objectswhererownum<
200;
Tablecreated.
createtablebasselect*fromall_objects;
selectcount(*)froma;
COUNT(*)
----------
199
selectcount(*)fromb
89083
execdbms_stats.gather_table_stats('
TEST'
'
A'
);
PL/SQLproceduresuccessfullycompleted.
B'
两个表都没有索引
Selectcount(*)froma,bwherea.id=b.object_id
Anda.id=53
执行计划:
(B表驱动)
Selectcount(*)froma,bwherea.id=b.object_id
2Anda.id=53
3/
1
ExecutionPlan
----------------------------------------------------------
Planhashvalue:
319234518
----------------------------------------------------------------------------
|Id|Operation|Name|Rows|Bytes|Cost(%CPU)|Time|
|0|SELECTSTATEMENT||1|9|420
(1)|00:
00:
01|
|1|SORTAGGREGATE||1|9|||
|*2|HASHJOIN||1|9|420
(1)|00:
|*3|TABLEACCESSFULL|B|1|5|417
(1)|00:
|*4|TABLEACCESSFULL|A|1|4|3(0)|00:
PredicateInformation(identifiedbyoperationid):
---------------------------------------------------
2-access("
A"
."
ID"
="
B"
OBJECT_ID"
)
3-filter("
=53)
4-filter("
Statistics
1recursivecalls
0dbblockgets
1506consistentgets
0physicalreads
0redosize
542bytessentviaSQL*Nettoclient
543bytesreceivedviaSQL*Netfromclient
2SQL*Netroundtripsto/fromclient
0sorts(memory)
0sorts(disk)
1rowsprocessed
A表作为驱动表
Select/*+ordereduse_nl(a)*/count(*)froma,bwherea.id=b.object_id
2Anda.id=53;
1rowselected.
1397777030
|*3|TABLEACCESSFULL|A|1|4|3(0)|00:
|*4|TABLEACCESSFULL|B|1|5|417
(1)|00:
发现上面两个语句的代价是一样的
/*+Ordereduse_nl(table_name)*/--使用hint强制表作为驱动表,只使用/*+use_nl(table1,table2)是无法强制驱动表顺序的,另外,这里使用的use_nl,但是走的是hashjoin,说明在没有索引的情况下,oracle优化器更倾向hashjoin,因为nestedloop并不一定会提前返回数据。
执行计划下,hashloop下第一个表为驱动表。
表Bobject_id列有索引的情况
createindexid_b_object_idonb(object_id);
Indexcreated.
execdbms_stats.gather_table_stats(ownname=>
'
TABNAME=>
CASCADE=>
TRUE);
31681896
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ORACLE技术文档oracle 驱动表包含 hint使用 nested loop hash join sortmergegate方式 ORACLE 技术 文档 驱
链接地址:https://www.bdocx.com/doc/16025693.html