posts - 4, comments - 5, trackbacks - 0, articles - 10

2005年12月30日

1、FIRST_ROWS
   指示优化器尽可能快地返回前n行记录,提高响应速度。如果没有指定参数,则返回第一行。该提示对Update和Insert无效,对包含块操作的select语句无效,如排序和group。 这样的语句不能优化最佳响应时间,因为Oracle在返回第一行之前,必须获得所有的记录。如果在这种情况下使用了该提示,优化器会优化最佳吞吐量(相当于ALL_ROWS提示)。
 
2、FULL
   指示优化器执行全表扫描,即使有索引,也不会走索引。
  
    SELECT   /* + FULL(e)  */  employee_id, last_name
      
FROM  hr.employees e  WHERE  last_name  LIKE  :b1;
  
   注意:如果表有别名,则必须使用别名。并且即使表加上了schema名称,在提示中也不能指定schema名称。
 
3、HASH
   指示优化器使用Hash扫描表,只适用于表簇中的表。
 
4、INDEX
   指示优化器适用Index扫描表,适用于函数、域、B树、位图和位图联合索引。
   Index提示遵循以下规范:
   a、如果Index提示指定单个的索引,那么数据库执行该索引上的扫描,优化器不会执行全表扫描或者表上的其他索引。
   b、对于指定了多个索引的组合的Index提示,Oracle推荐使用INDEX_COMBINE而不是INDEX提示,因为它更加通用,如果Index提示指定了index列表,那么优化器会考虑走每个索引的代码,并从中选择代价最小的一条索引,如果扫描多个index的代价最小,那么优化器会扫描该个索引列表。优化器不会走全表扫描或者没有在index列表上的索引。
   c、如果Index提示没有指定Index,优化器会评估扫描每个Index的代价,并选择代价最小的Index,如果组合Index代价最小,那么优化器会选择扫描多个索引,并合并结果集。优化器不会走全表扫描。
 
    SELECT   /* + INDEX (employees emp_department_ix) */   employee_id, department_id
    
FROM  employees  WHERE  department_id  >   50 ;
 
5、INDEX_ASC
   按索引值的升序方向扫描索引,其他参数与INDEX 提示完全一样。
 
6、INDEX_COMBINE
   联合索引提示。索引规则与INDEX提示一样。
  
    SELECT   /* + INDEX_COMBINE(e emp_manager_ix emp_department_ix)  */   *
FROM  employees e
WHERE  manager_id  =   108
OR  department_id  =   110 ;
 
7、INDEX_DESC
  降序INDEX提示。
 
SELECT   /* + INDEX_DESC(e emp_name_ix)  */   *
FROM  employees e;
 
8、INDEX_FFS
  指示优化器执行快速全索引扫描,而不是全表扫描。
 
SELECT   /* + INDEX_FFS(e emp_name_ix)  */  first_name
FROM  employees e;
 
9、INDEX_JOIN
  以INDEX JOIN的方式扫描,必须存在足够少的INDEX,这些索引包含着查询中所有的列。
 
SELECT   /* + INDEX_JOIN(e emp_manager_ix emp_department_ix)  */  department_id
FROM  employees e  WHERE  manager_id  <   110   AND  department_id  <   50 ;
 
10、INDEX_SS
  索引跳跃扫描提示。
 
11、LEADING
  指定特定的表放在执行计划的前面,它比ORDERED提示更加通用。
  如果因为Join路线的依赖关系而不能首先被Join,提示就会被忽略;如果指定了两个或者多个冲突的LEADING提示,则他们都会被忽略;如果指定了ORDERED提示,那么LEADING就会被忽略。
 
12、MERGE
  将视图合并到查询。
  如果视图查询语句包含GROUP BY子句或者SELECT语句中用到了 DISTINCT,那么优化器能够将视图合并到查询语句中,合成的合并也能够合并IN子查询,如果IN子查询没有关联。
 
   SELECT   /* + MERGE(v)  */  e1.last_name, e1.salary, v.avg_salary
FROM  employees e1,
(
SELECT  department_id,  avg (salary) avg_salary
FROM  employees e2
GROUP   BY  department_id) v
WHERE  e1.department_id  =  v.department_id  AND  e1.salary  >  v.avg_salary;
 
13、NOAPPEND
   在并行模式中使用常规插入方法。
 
14、NOCACHE
 
15、NO_EXPAND
 
16、NO_FACT
 
17、NO_INDEX
 
18、NO_INDEX_SS
 
19、NO_MERGE
 
20、NO_PARALLEL
   覆盖了使用DDL语言创建或者更改table的PARALLEL参数的设置。
 
21、NO_PARALLEL_INDEX
   覆盖了使用DDL语言创建或者更改index的PARALLEL参数的设置。
 
22、NO_PUSH_PRED
  
23、NO_PUSH_SUBQ
 
24、NO_PX_JOIN_FILTER
    阻止优化器使用并行联合位图过滤器
 
25、NO_REWRITE
    使查询重写失效
 
26、NO_QUERY_TRANSFORMATION
    跳过所有查询转换,包括但不限于:OR-expansion、视图合并、无嵌套子查询、星型转换和物化视图重写。
 
27、NO_STAR_TRANSFORMATION
 
28、NO_UNNEST
 
29、NO_USE_HASH
 
30、ORDERED
   指示优化器按照FROM子句出现的表顺序join表。Oracle推荐使用LEADING提示。
 
31、PARALLEL
   指示优化器使用指定数目的服务器去执行并行操作,包括SELECT、INSERT、MERGE、UPDATE和DELETE部分的语句和表扫描部分都可使用。
   注意:如果发生sort或者group,那么服务器的数量应该是提示指定的两倍。
   如果任何并行都被禁止,那么提示就会被忽略。
   如果指定了DEFAULT或者没有指定任何值,那么查询器就会去检查初始参数的设置来决定并行度。
   临时表上的该提示将会被忽略。
 
32、PARALLEL_INDEX
   为分区索引指定并行索引扫描的数量。示例:
    SELECT /*+ PARALLEL_INDEX(table1, index1, 3) */
 
33、PQ_DISTRIBUTE
 
34、PUSH_PRED
 
35、PUSH_SUBQ
 
36、REWRITE
    对物化视图使用查询重写。

posted @ 2006-11-16 17:05 勇敢的心 阅读(2178) | 评论 (1)编辑 收藏

(1)、Oracle插入数据有两种方式:
a、常规插入:重新使用table中的自由空间,在已有数据中插入新数据;维护引用完整性约束。
b、Direct-Path插入:在表中已有数据之后插入新数据;数据直接插入数据文件,绕过buffer cache;已有数据中的自由空间没有被重新利用;忽略了引用完整性约束。
 
(2)、连续模式:一个进程执行sql语句;
       并行模式:多个进程同时执行一个sql语句,即并行执行。
 
(3)Direct-Path插入的优点:
1、可以disable redo log和undo log;而常规插入却不可以如此,并且重用自由空间和维护引用完整性。
2、通过CREATE TABLE...AS SELECT 语句可以从现有表中创建新表,使用Direct-Path插入可以在插入时更新定义在目标表上的任意索引。
3、Direct-Path插入能保证事务的原子性,即使在并行模式下。使用SQL*Loader在并行模式加载中不能保证原子性。
4、当并行Direct-Path加载发生错误时,索引被标志成UNUSABLE。
5、如果想使用表压缩的压缩格式存储数据,必须使用Direct-Path插入。
 
 
(4)使用Direct-Path插入:
 
在连续模式中,在Insert语句中指定“APPEND”提示,在INSERT关键字之后,或者在INSERT子查询中的SELECT关键字之后。
在并行DML模式中,默认的就是DIRECT-PATH插入,为了运行并行DML模式,必须满足以下条件:
a、必须是Oracle企业版;
b、必须在session中使并行DML生效,执行以下sql语句:
ALTER SESSION { ENABLE | FORCE } PARALLEL DML;
c、必须指定table的并行属性,在创建的时候或者其他时候,或者在insert操作时使用“PARALLEL”提示。
 
为了使Direct-Path Insert模式失效,在INSERT语句中指定“NOAPPEND”提示,覆盖并行DML模式。
 
(5)、Direct-Path INSERT 是如何工作的
 
在分区表和非分区表都可以使用Direct-Path INSERT
 
连续Direct-Path INSERT到分区和非分区表
  单个进程插入数据到高水位标志之上,当执行完commit之后,高水位标志得到更新。
 
并行Direct-Path INSERT到分区表
  类似于serial Direct-Path INSERT,每个并行操作分配给一个或者多个分区,每个并行操作插入数据到各自的分区段的高水位标志之上,commit之后,用户就能看到更新的数据。
 
并行Direct-Path INSERT到非分区表
  每个并行执行分配一个新的临时段,并插入数据到临时段。当commit运行后,并行执行协调者合并新的临时段到主表段,用户就能看到更新的数据。
 
为Direct-Path INSERT指定的Log模式
   Direct-Path INSERT可以使用Log或者不使用Log。
 
(6)、其他需要注意的地方:
    索引维护:Oracle在Direct-Path INSERT 操作末尾,对具有索引的表执行索引维护,这样就避免了在drop掉索引后,再rebuild。
    使用的空间:Direct-Path INSERT比常规的插入需要更多的空间。因为它将数据插入在高水位之上。并行插入非分区表需要更多的空间,因为它需要为每一个并行创建临时段。
    锁:在插入期间,数据库在表上获得排他锁,用户不能在表上执行并行插入、更新或者删除操作,并行的索引创建和build也不被允许。但却可以并行查询,但查询返回的是插入之前的结果集。

posted @ 2006-11-14 09:22 勇敢的心 阅读(2455) | 评论 (0)编辑 收藏

在Liferay的CMS中articles、structures和templates是三个重要的概念。

article:可以通过article显示Liferay Portal页面的内容,如首页默认的就是Home Index这个article。 article可以由template驱动,即article的内容和展示样式都由template描述的xslt模板所决定,当然article也可不由template驱动,这时article的内容可以由Liferay内置的Rich Html Editor编写,但是可重用性较差。

structure:定义了xml的格式(Schema ),它与article没有直接的关联,structure被应用到template中,从而影响article的内容。Liferay可以可视化地编辑Schema 。

template:article的模板,决定article的内容和显示样式,此外Liferay还定义了一些tag,可以方便地应用到模板中,如"<runtime-portlet name="58" />",就是在加载模板时动态地将Login Portlet加载到xml。

此外在编写article或者template,输入中文会显示乱码,我们的解决方法是修改了Liferay的
com.liferay.util.xml.XMLFormatter 的toString()方法
和com.liferay.portlet.journal.util.JournalUtil 的transform()方法
使用StringWriter来进行输出,而不是ByteArrayOutputStream。

后记:写得有点乱,欢迎有兴趣的朋友批评指正,交流学习。

posted @ 2005-12-30 10:59 勇敢的心 阅读(1312) | 评论 (0)编辑 收藏