在日常基于数据库应用的开发过程中,我们经常需要对多个表或者数据源进行关联查询而得出我们需要的结果集.那么Oracle到底存在着哪几种连接方式?优化器内部又是怎样处理这些连接的?哪种连接方式又是适合哪种查询需求的?只有对这些问题有了清晰的理解后,我们才能针对特定的查询需求选择合适的连接方式,开发出健壮的数据库应用程序.选择合适的表连接方法对SQL语句运行的性能有着至关重要的影响.下面我们就Oracle常用的一些连接方法及适用情景做一个简单的介绍.
嵌套循环连接的工作方式是这样的:
①.、 Oracle首先选择一张表作为连接的驱动表,这张表也称为外部表(Outer Table).由驱动表进行驱动连接的表或数据源称为内部表(Inner Table).
Nested loop
Outer loop
Inner loop
我们可以看出这里面存在着两个循环,一个是外部循环,提取驱动表中符合条件的每条记录.另外一个是内部循环,根据外循环中提取的每条记录对内部表进行连接查询相应的记录.由于这两个循环是嵌套进行的,故此种连接方法称为嵌套循环连接.
嵌套循环连接适用于查询的选择性强、约束性高并且仅返回小部分记录的结果集.通常要求驱动表的记录(符合条件的记录,通常通过高效的索引访问)较少,且被驱动表连接列有唯一索引或者选择性强的非唯一索引时,嵌套循环连接的效率是比较高的.
嵌套循环连接驱动表的选择也是连接中需要着重注意的一点,有一个常见的误区是驱动表要选择小表,其实这是不对的.假如有两张表A、B关联查询,A表有1000000条记录,B表有10000条记录,但是A表过滤出来的记录只有10条,这时候显然用A表当做驱动表是比较合适的.所以呢驱动表是由过滤条件限制返回记录最少的那张表,而不是根据表的大小来选择的.
在外连接查询中,如果走嵌套循环连接的话,那么驱动表必然是没有符合条件关联的那张表,也就是后面不加(+)的那张表.这是由于外连接需要提取可能另一张表没符合条件的记录,所以呢驱动表需要是那张我们要返回所有符合条件记录的表.比如下面这个查询,
嵌套循环连接返回前几行的记录是非常快的,这是因为使用了嵌套循环后,不需要等到全部循环结束再返回结果集,而是不断地将查询出来的结果集返回.在这种情况下,终端用户将会快速地得到返回的首批记录,且同时等待Oracle内部处理其他记录并返回.如果查询的驱动表的记录数非常多,或者被驱动表的连接列上无索引或索引不是高度可选的情况,嵌套循环连接的效率是非常低的
-- 删除原表
drop table t1;
-- 建立测试表
create table t1(
)
tablespace CTL
-- 填充测试内容
from dba_tables a, dba_tab_cols b
where a.owner = b.owner
and rownum 10000;
commit;
-- 检查测试内容格式
-- 每条记录都存储在单独的数据块中
select count( distinct sys.dbms_rowid.rowid_block_number(rowid)) from t1;
/*
*/
and rownum 1000;
create index ind_t1_f1 on t1(f1);
--首先我们来看使用nested loop关联方式, 不同表作为驱动时的情况.
and t1.f1 1000;
Execution Plan
----------------------------------------------------------
Cost = outer access cost + (inner access cost * outer cardinality)
Statistics
0 recursive calls
0 db block gets
0 redo size
0 sorts (memory)
0 sorts (disk)
哈希连接分为两个阶段,如下.
①.、 构建阶段:优化器首先选择一张小表做为驱动表,运用哈希函数对连接列进行计算产生一张哈希表.通常这个步骤是在内存(hash_area_size)里面进行的,所以呢运算很快.
哈希连接比较适用于返回大数据量结果集的连接.
使用哈希连接必须是在CBO模式下,参数hash_join_enabled设置为true,
0 physical reads
排序合并连接的方法非常简单.在排序合并连接中是没有驱动表的概念的,两个互相连接的表按连接列的值先排序,排序完后形成的结果集再互相进行合并连接提取符合条件的记录.相比嵌套循环连接,排序合并连接比较适用于返回大数据量的结果.
①., rbo模式;
使用job的所有者账号登陆,通过查询user_jobs视图查看;
我一般只关注三个字段;
LAST_DATE:最后次运行时间;
NEXT_DATE:下次运行时间;
TOTAL_TIME:总用时.具体语句如下:select s.LAST_DATE,s.NEXT_DATE,s.TOTAL_TIME from user_jobss.
日志
日志,是一个汉语词汇,汉语拼音是rì zhì.基本字义是指工作日志.日志主要发表在网络,详细介绍一个过程和经历的记录.
①.、show parameter job_queue_processes;
主要是管理Jobs物件(Jobs页签)
JOB分类有dba_jobs
,
all_jobs
user_jobs
dba_jobs_running
查询所有JOB
SELECT
JOB,
NEXT_DATE,
NEXT_SEC,
FAILURES,
BROKEN
FROM
ALL_JOBS;
或
*
删除JOB
(一个一个删,我不记得有没有一次全删的命令)
begin
dbms_job.remove(:job);
end;
怎么查看oracle前置机上的同步任务
做个数据库链接,A表插入数据以后就往B表插入,用触发器实现
在任何实时数据同步和复制中,需要考虑如下几个关键问题:
事务一致性:在复制目标端需要按照源端相同的事务环境进行提交,确保目标上数据一致性.
以上就是土嘎嘎小编为大家整理的oracle如何查看任务相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!