Oracle,SQL语句中/*+*/是什么技术

如题所述

运用的是oracle 中的哈希连接,/*+ */ 相当于代码中的编译指令,要求oracle按照指定的某种轨则执行,而不是使用默认设定use_hash(a,b)是其一一种

当内存能够提供足够的空间时,哈希(HASH)连接是Oracle优化器通常的选择。哈希连接中,优化器根据统计信息,首先选择两个表中的小表,在内存中建立这张表的基于连接键的哈希表;优化器再扫描表连接中的大表,将大表中的数据与哈希表进行比较,如果有相关联的数据,则将数据添加到结果集中。  当表连接中的小表能够完全cache到可用内存的时候,哈希连接的效果最佳。哈希连接的成本只是两个表从硬盘读入到内存的成本。  但是,如果哈希表过大而不能全部cache到可用内存时,优化器将会把哈希表分成多个分区,再将分区逐一cache到内存中。当表的分区超过了可用内存时,分区的部分数据就会临时地写到磁盘上的临时表空间上。因此,分区的数据写磁盘时,比较大的区间(EXTENT)会提高I/O性能。ORACLE推荐的临时表空间的区间是1MB。临时表空间的区间大小由UNIFORM SIZE指定。  当哈希表构建完成后,进行下面的处理:  1) 第二个大表进行扫描  2) 如果大表不能完全cache到可用内存的时候,大表同样会分成很多分区  3) 大表的第一个分区cache到内存  4) 对大表第一个分区的数据进行扫描,并与哈希表进行比较,如果有匹配的纪录,添加到结果集里面  5) 与第一个分区一样,其它的分区也类似处理。  6) 所有的分区处理完后,ORACLE对产生的结果集进行归并,汇总,产生最终的结果。  当哈希表过大或可用内存有限,哈希表不能完全CACHE到内存。随着满足连接条件的结果集的增加,可用内存会随之下降,这时已经CACHE到内存的数据可能会重新写回到硬盘去。如果出现这种情况,系统的性能就会下降。  当连接的两个表是用等值连接并且表的数据量比较大时,优化器才可能采用哈希连接。哈希连接是基于CBO的。只有在数据库初始化参数HASH_JOIN_ENABLED设为True,并且为参数PGA_AGGREGATE_TARGET设置了一个足够大的值的时候,Oracle才会使用哈希边连接。HASH_AREA_SIZE是向下兼容的参数,但在Oracle9i之前的版本中应当使用 HASH_AREA_SIZE。当使用ORDERED提示时,FROM子句中的第一张表将用于建立哈希表。

温馨提示:内容为网友见解,仅供参考
第1个回答  2015-05-29
oracle hint,添加相应的hint语句可以干预sql的执行方式或者执行计划
第2个回答  2015-01-31
请度娘 hint,就帮你到这了

Oracle,SQL语句中\/*+*\/是什么技术
oracle的优化工具,依据加号后面的内容,可以表示不同的意思,或并行或强制索引等。

Oracle,SQL语句中\/*+*\/是什么技术
运用的是oracle 中的哈希连接,\/*+ *\/ 相当于代码中的编译指令,要求oracle按照指定的某种轨则执行,而不是使用默认设定use_hash(a,b)是其一一种当内存能够提供足够的空间时,哈希(HASH)连接是Oracle优化器通常的选择。哈希连接中,优化器根据统计信息,首先选择两个表中的小表,在内存中建立这张表的...

sql中有一些*\/+ \/*之类的符号是什么意思?
Oracle中这种东西叫做hint,是一种优化SQL的工具。不同的hint会导致不同的优化模式。例如一句SQL可能这样写:select a.id, a.name from a, b where a.date=b.date 假如这个语句执行起来很慢。我们就可以用hint指定某一种优化模式,使运行速度加快。比如说指定选用a表的a_indx这个索引,及b表的b_...

oracle 中sql语句怎么加多个强制索引
使用hint技术,表别名+索引名 select\/*+ INDEX(pa IDX_PAGREE_1)INDEX(pi IDX_PITEM_5)INDEX(pd IDX_PRODUCTS_3)\/ from table1 c,table2 pa,table3 pi,table4 pd where pa.customerid = c.customerid and pi.purchaseagreementid = pa.id and pi.productid = pd.id and pd....

谁能讲讲sql硬软解析的区别
一. SQL 解析过程 Oracle对此SQL将进行几个步骤的处理过程:1、语法检查(syntax check): 检查此sql的拼写是否语法。2、语义检查(semantic check): 诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。3、对sql语句进行解析(prase): 利用内部算法对sql进行解析,生成解析树(parse tree)及...

Oracle SQL 单行注释 多行注释 是什么?
与C语言相同的程序注释符号,即“\/**\/”。“\/*”用于注释文字的开头,“*\/”用于注释文字的结尾,可在程序中标识多行文字为注释。格式:\/*注释内容*\/ 例子:DECLARE @myvariable DATETIME \/ The following statements retrieve the current date and time and extract the day of the week from the...

oracle 中\/*+ full(表名)*\/有何犀利之处吗?求高手解答
一般在sql优化中不是尽量避免全表扫描吗? 追答 不是的全表扫描的效率有时候是比索引高的索引就是目录,一本词典使用目录查字会快些但是只有两页的笔记还是一眼扫过去更快些这就是索引和全表扫描的区别兄弟,如果你玩dota的话,你可以理解为你距离血池就5码的距离你还会选择使用回城吗? 肯定是走过去更快啦~ 本...

oracle 中select \/* *\/ from table语法
1、\/* 注释 *\/ 2、\/*+ 提示 *\/ 多个+ 后跟sql hints 来进行sql优化,如果写的HINTS语法错误,也就被忽略为注释了,sql并不会报错。Oracle Hints是一种机制,用来告诉优化器按照我们的告诉它的方式生成执行计划。

在SQL中加入\/*+RULE*\/ 真的会比较快吗
使用rule是你引导oracle建立执行计划,如果sql自动建立的执行计划比你引导建立的执行计划高,那么当然只会更慢了。另外需要说明的是,在对sql内部工作原理不是很清楚,还是不要使用rule,因为oracle一般做的都比你好 并不是加了\/*+RULE*\/一定会快﹐这只是在做SQL优化时﹐首先应该尝试的一种方法 我是...

SQL语句优化 oracle
试试这个。目标是现先对a做全表扫描,因为你没有条件,全表扫描效率最高。然后b也做全表扫描。b应该是代码表吧。a表应该是大表,每条记录嵌套循环查找b表次数太多,导致代价太高,所以也全表扫描b表,最后做哈希连接。你看看执行计划,得到上面描述的执行计划就行了。否则可以自己调整hint,得到合适...

相似回答