⑴ 请教一个sql使用parallel hint的问题
测试了第一种方式:
设置了index的parallel degree后
在9.2.0.1和9.2.0.8下
select count(1) from xx_test;如果使用这个语句的话,则不会并发(10g后就会并发)
select /*+ parallel(t,4) count(1) from xx_test t;可以并发查询,但是需要在enable parallel query之后可以并行.
在10.2.0.1数据库下
select count(1) from xx_test;
select /*+ parallel(t,4) count(1) from xx_test t;
上面两个都会并行查询,前提都是要enable parallel query.
对于使用parallel_index hint的第二种方法
我在10g中测试没有问题,但是在9i中我使用下面的语句却不会并行
select /*+ parallel_index(xx_test,4) */ count(1) from xx_test;
第三种方法在两个版本中都没有问题
select /*+ parallel(t,4)full(t) */
⑵ 我的sql语句不走索引。(求Oracle高手帮助)
有时候不走索引更快些
select sum(decode(sign(a306-1.5),1,1))/sum(1) from a03;
这个语句执行看看.如果返回的值大于0.1 不用索引是正常的.
⑶ SQL语句中INDEX函数
1。这是oracle语法
2。 /*+ INDEX(SLMS_TRALOG_T SLMS_TRALOG_CALLED_IDX ) */ 意思是,在这个查询中使用SLMS_TRALOG_T表的SLMS_TRALOG_CALLED_IDX索引,当然后边的where条件中会用到这个索引
补充一点,这个不叫INDEX函数,叫强制使用索引
⑷ 使用事务为什么会使sql得到优化
1. 在长时间运行的查询和短查询中使用事务
如果预期有一个长时间运行的查询,并且有大量的数据输出时,开发者就应该在BEGIN TRAN 和END TRAN之间使用事务。
这样事务会在缓冲区缓存为独立事务,并会被分配特定内存,以此来提高处理速度。
2. 不要使用SELECT *
如果使用SELECT * 来选择表中的所有记录,那么一些不必要的记录也被读取、缓存,增加了磁盘的I/O和内存消耗。
3. 避免在WHERE子句中使用显式或隐式函数,比如Convert ()
4. 避免在触发器中执行长时间的操作
5. 适当使用临时表和表变量
当结果集较小的时候,请尽量使用表变量;当结果集相当大时,使用临时表。
6. 使用连接(JOIN)代替子查询(Sub-Queries)
子查询通常作为内联代码来使用,而连接(JOIN)则作为表来使用,这样速度会更快。所以,应尽量避免在连接中使用子查询。
7. 连接条件中表的顺序
在连接条件中,应尽量首先使用较小的表,然后逐步使用较大的表。
8. 循环优化
如果操作在循环内部没有任何影响,那么应尽量将操作放到循环外面,这样可以减少不必要的重复工作。因为,SQL Server优化器不会自动识别这种低效率的代码,更不会自动优化(其他一些语言的编译器可以)。
9. 参数探测
不要在正执行的SP(存储过程)中使用SP参数,这样会导致参数探测(Parameter Sniffing)。应该在声明和设置后再使用SP参数。由于这个原因,SP的行为在每次运行期间都不相同。
10. 当使用条件语句时,可以使用Index(索引)Hint(提示)
比如在SQL Server 2008中,可以使用Index hint,也可以使用fixed plan hint强制在查询中使用hint,以提高运行速度。
⑸ 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_indx这个索引,可以写作
select
/*+
index(a
a_indx)
index(b
b_indx)
*/
a.id,
a.name
from
a,
b
where
a.date
=
b.date
这样就实现了对SQL的优化。除了index这个hint以外,还有all_rows,
first_rows,等等。
这个网站提供一个教程:http://oracle.chinaitlab.com/optimize/14380.html
⑹ 如何写好复杂sql的hint
你这个问题有点难回答,就oracle的hints来说,有的时候使用起来反而效果不好,所以一般并不指定hints,而交给oracle自行选择优化方案来处理。如果确实需要,也是具体分析并反复实验才能找到最佳方法。比如
/*+ INDEX_FFS(TABLE INDEX_NAME) */
对指定的表执行快速全索引扫描,而不是全表扫描的办法
/*+ INDEX_DESC(TABLE INDEX_NAME)*/
表明对表选择索引降序的扫描方法.
/*+ INDEX(TABLE INDEX_NAME) */
表明对表选择索引的扫描方法.
。。。。。等等。
使用hints只能作为优化查询的措施之一,从根本上解决还要想其他办法,如使用负载均衡、分区表、物化视图、合理的索引等等。
⑺ 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_indx这个索引,可以写作
select /*+ index(a a_indx) index(b b_indx) */
a.id, a.name
from a, b
where a.date = b.date
这样就实现了对SQL的优化。除了index这个hint以外,还有all_rows, first_rows,等等。
这个网站提供一个教程:http://oracle.chinaitlab.com/optimize/14380.html
⑻ oracle 的hint有什么用
相对而言ORACLE优化器已经非常智能,产生的执行计划也是最优的,但是ORACLE还是提供了一些hint供用户显示的控制执行计划,因为大千世界各种各样的业务都有,ORACLE优化器生成的执行计划并不一定适用于所有业务,同时hint对于DBA而言更是一件利器,我们可以通过hint看到优化后的执行计划,总结一下常用hint。1.全表扫描hintfull(table_name)相对而言,全表扫描hint使用场合较少,但是要知道,全表扫描并不一定比索引效率低,特别是查询表中80%以上的数据库,全表扫描的效率要高于索引扫描。2.索引hintindex(table_nameindex_name)这两种hint一个是强制使用索引,另一个是强制执行计划不要走索引,什么用呢?常用于SQL调优过程中对比索引和非索引扫描。3.索引快速扫描hintindex_ffs(table_nameindex_name)这种索引称之为索引快速扫描,常用于统计索引列键值的个数,如count(object_id),跟全表扫描很像,但效率要比全表扫描要高很多,也就是执行计划中看到的FASTFULLSCN。4.索引跳跃扫描hintindex_ss(table_nameindex_name)该hint在执行计划中就是传说中的INDEXSKIPSCAN这个对新手而言不太好理解,举个例子索引有两个列(A,B)类型组合索引,但是查询中where条件只有B没有Aselect*fromwhereb=1,此时ORACLE优化器走的索引就是所谓的索引跳跃扫描,只在CBO下适用,在RBO不适用。5.表关联hintuser_nl(table_name1table_name2)此hint是表之间关联效率最高的一种,通常用于一大一小两表之间进行关联查询,小表作驱动表进行全表扫描,大表上要求有索引,走索引扫描,代价最低。6.表关联hintuse_hash(table_name1table_name2)如果两个表一大一小,但是大表没有索引就会选择HASH,如果两个结果集比较小还可以承受,但是如果两个较大的表HASH的话,会直接将数据库HANG住,最好避免这种算法7.表关联hintuser_merge(table_name1table_name2)两个表进行关联,分别对全个表进行全表扫描后排序然后进行合并,排序既消耗内存又消耗CPU,总之代价比较大,常通过在两个表上创建索引避免此类连接的发生。因此对比后发现,只有nested_loop方式进行关联是最优的。8.表顺序hintleading(table_name1table_name2)在RBO模式下,我们常常通过考虑from后面表的先后顺序来进行SQL优化,但是此方法对RBO模式不再适用,CBO模式下按照顺序选择驱动表9.数据加载hintappend()直接路径加载,对于大表操作极为有用,原理是什么呢?打个比方,好比两个超市理货员,一人一箱货需要上架到货架上,一个人去找货架中空闲位置去放,可能需要找N个空闲位,另一个人找一个空的货架直接放上去,那个效果最高?当然是第二个,此hint的作用就是让ORACLE找一个大空亲块直接存放新数据,而不是挤空闲位置去放新数据,如果此hint同时加上nologing联合使用效果更高,常用于数据迁移项目中。10.dblink处理端hintdriving_site(table_name)此hint常用于通过dblink连接处理数据的业务,它的作用是将本地表推送到远端数据库进行关联然后将结果返回,常用于本地表较小,远端表较大的情况,效果很是不错。11.数据返回模式hintfirst_rows该hint是影响数据返回模式hint,添加后ORACLE将边处理边返回,数据仓库中用的比较多,但是在OLTP系统中也常见,上次系统优化就因为一兄弟在添加hint时,添加后发现执行计划没变,于是将原有的hintfirst_rows然后添加hintdriving_site(),执行计划是变了,变化是因去去掉first_rows引起的,并且通过dblink远端数据库执行时查询全变成的全表扫描,导致两个业务大表hash,业务高峰直接将数据库宕机,因此该hint添加或删除一定要看远端执行计划有无发生变化,否则后果不开设想(切记)。