如何制定计划计划

33078人阅读
An explain plan is a representation of the access path that is taken when a query is executed within Oracle.
At the physical level Oracle reads blocks of data. The smallest amount of data read is a single Oracle block, the largest is constrained by operating system limits (and multiblock i/o). Logically Oracle finds the data to read by using the following methods:Full Table Scan (FTS)&&& --Index Lookup (unique & non-unique)&&& --Rowid&&& --id
When looking at a plan, the rightmost (ie most inndented) uppermost operation is the first thing that is executed. --ID
1.一个简单的例子:
SQL& select &/*+parallel (e 4)*/ &* &from &emp &e;
Execution Plan
----------------------------------------------------------
&& 0&&&&& SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=82 Bytes=7134)
& &1&&& 0&& TABLE ACCESS* (FULL) OF 'EMP' (Cost=1 Card=82 Bytes=7134):Q5000
--[:Q5000]
&& 1 PARALLEL_TO_SERIAL&&&&&&&&&&& SELECT /*+ NO_EXPAND ROWID(A1) */ A1."EMPNO"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ,A1."ENAME",A1."JOB",A1."MGR",A1."HI
优化模式是CHOOSE的情况下,看Cost参数是否有值来决定采用CBO还是RBO:SELECT STATEMENT [CHOOSE] Cost=1234 --Cost有值,采用CBOSELECT STATEMENT [CHOOSE]&&&&& &&&&&--Cost为空,采用RBO(9I是如此显示的)
2.层次的父子关系的例子:PARENT1**FIRST CHILD****FIRST GRANDCHILD**SECOND CHILD
Here the same principles apply, the FIRST GRANDCHILD is the initial operation then the FIRST CHILD followed by the SECOND CHILD and finally the PARENT collates the output.
Execution Plan
----------------------------------------------------------
0 **SELECT STATEMENT Optimizer=CHOOSE (Cost=3 Card=8 Bytes=248)
1 0 **HASH JOIN (Cost=3 Card=8 Bytes=248)
2 1 ****TABLE ACCESS (FULL) OF 'DEPT' (Cost=1 Card=3 Bytes=36)
3 1 ****TABLE ACCESS (FULL) OF 'EMP' (Cost=1 Card=16 Bytes=304)
左侧的两排数据,前面的是序列号ID,后面的是对应的PID(父ID)。
A shortened summary of this is:
Execution starts with ID=0: SELECT STATEMENT but this is dependand on it's child objects
So it executes its first child step: ID=1 PID=0 HASH JOIN but this is dependand on it's child objects
So it executes its first child step: ID=2 PID=1 TABLE ACCESS (FULL) OF 'DEPT'
Then the second child step: ID=3 PID=2 TABLE ACCESS (FULL) OF 'EMP'
Rows are returned to the parent step(s) until finished
五、表访问方式
1.Full Table Scan (FTS) 全表扫描
In a FTS operation, the whole table is read up to the high water mark (HWM). The HWM marks the last block in the table that has ever had data written to it. If you have deleted all the rows then you will still read up to the HWM. Truncate resets the HWM back to the start of the table. FTS uses multiblock i/o to read the blocks from disk.&& --全表扫描模式下会读数据到表的高水位线(HWM即表示表曾经扩展的最后一个数据块),读取速度依赖于Oracle初始化参数db_block_multiblock_read_count(我觉得应该这样翻译:FTS扫描会使表使用上升到高水位(HWM),HWM标识了表最后写入数据的块,如果你用DELETE删除了所有的数据表仍然处于高水位(HWM),只有用TRUNCATE才能使表回归,FTS使用多IO从磁盘读取数据块).
Query Plan
------------------------------------
SELECT STATEMENT [CHOOSE] Cost=1
**INDEX UNIQUE SCAN EMP_I1& &--如果索引里就找到了所要的数据,就不会再去访问表
2.Index Lookup 索引扫描
There are 5 methods of index lookup:
index unique scan&& --索引唯一扫描
Method for looking up a single key value via a unique index. always returns a single value, You must supply AT LEAST the leading column of the index to access data via the index.
eg:SQL& explain plan for select empno,ename from emp where empno=10;
index range scan&& --索引局部扫描
Index range scan is a method for accessing a range values of a particular column. AT LEAST the leading column of the index must be supplied to access data via the index. Can be used for range operations (e.g. & & && &= &= between) .
eg:SQL& explain plan for select mgr from emp where mgr = 5;
index full scan&& --索引全局扫描
Full index scans are only available in the CBO as otherwise we are unable to determine whether a full scan would be a good idea or not. We choose an index Full Scan when we have statistics that indicate that it is going to be more efficient than a Full table scan and a sort. For example we may do a Full index scan when we do an unbounded scan of an index and want the data to be ordered in the index order.
eg: SQL& explain plan for select empno,ename from big_emp order by empno,
index fast full scan &&--索引快速全局扫描,不带order by情况下常发生
Scans all the block in the index, Rows are not returned in sorted order, Introduced in 7.3 and requires V733_PLANS_ENABLED=TRUE and CBO, may be hinted using INDEX_FFS hint, uses multiblock i/o, can be executed in parallel, can be used to access second column of concatenated indexes. This is because we are selecting all of the index.
eg: SQL& explain plan for select empno,ename from big_
index skip scan& &--索引跳跃扫描,where条件列是非索引的前导列情况下常发生
Index skip scan finds rows even if the column is not the leading column of a concatenated index. It skips the first column(s) during the search.
eg:SQL& create index i_emp on emp(empno, ename);
SQL& select /*+ index_ss(emp i_emp)*/ job from emp where ename='SMITH';
3.Rowid 物理ID扫描
This is the quickest access method available.Oracle retrieves the specified block and extracts the rows it is interested in. --Rowid扫描是最快的访问数据方式
六、表连接方式
七、运算符
1.sort&& &--排序,很消耗资源
There are a number of different operations that promote sorts:
(1)order by clauses (2)group by (3)sort merge join &-这三个会产生排序运算
2.filter& &&--过滤,如not in、min函数等容易产生
Has a number of different meanings, used to indicate partition elimination, may also indicate an actual filter step where one row source is filtering, another, functions such as min may introduce filter steps into query plans.
3.view &&&--视图,大都由内联视图产生(可能深入到视图基表)
When a view cannot be merged into the main query you will often see a projection view operation. This indicates that the 'view' will be selected from directly as opposed to being broken down into joins on the base tables. A number of constructs make a view non mergeable. Inline views are also non mergeable.
eg: SQL& explain plan for
select ename,tot from emp,(select empno,sum(empno) tot from big_emp group by empno) tmp
where emp.empno = tmp.
Query Plan
------------------------
SELECT STATEMENT [CHOOSE]
**HASH JOIN
**TABLE ACCESS FULL EMP [ANALYZED]
****SORT GROUP BY
******INDEX FULL SCAN BE_IX
4.partition view&&&& --分区视图
Partition views are a legacy technology that were superceded by the partitioning option. This section of the article is provided as reference for such legacy systems.
示例:假定A、B、C都是不是小表,且在A表上一个组合索引:A(a.col1,a.col2) ,注意a.col1列为索引的引导列。考虑下面的查询:
select A.col4&& from  A , B , C
where B.col3 = 10  and A.col1 = B.col1 and A.col2 = C.col2 and C.col3 = 5;
Execution Plan
------------------------------------
  0   SELECT STATEMENT Optimizer=CHOOSE
  1  0 MERGE JOIN
  2  1 SORT (JOIN)
  3  2 NESTED LOOPS
  4  3 TABLE ACCESS (FULL) OF 'B'
  5  3 TABLE ACCESS (BY INDEX ROWID) OF 'A'
  6  5 INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE)
  7  1 SORT (JOIN)
  8  7 TABLE ACCESS (FULL) OF 'C'
Statistics(统计信息参数,参见另外个转载的文章)
--------------------------------------
     0 recursive calls(归调用次数)
     8 db block gets(从磁盘上读取的块数,即通过update/delete/select for update读的次数)
     6 consistent gets(从内存里读取的块数,即通过不带for update的select 读的次数)
     0 physical reads(物理读&从磁盘读到数据块数量,一般来说是'consistent gets' + 'db block gets')
     0 redo size&&&& &(重做数&&执行SQL的过程中,产生的重做日志的大小)
    551 bytes sent via SQL*Net to client
    430 bytes received via SQL*Net from client
     2 SQL*Net roundtrips to/from client
     2 sorts (memory) (在内存中发生的排序)
     0 sorts (disk)&& (在硬盘中发生的排序)
     6 rows processed
  在表做连接时,只能2个表先做连接,然后将连接后的结果作为一个row source,与剩下的表做连接,在上面的例子中,连接顺序为B与A先连接,然后再与C连接:
B   &---& A &---&  C
col3=10       col3=5
如果没有执行计划,分析一下,上面的3个表应该拿哪一个作为第一个驱动表?从SQL语句看来,只有B表与C表上有限制条件,所以第一个驱动表应该为这2个表中的一个,到底是哪一个呢?
B表有谓词B.col3 = 10,这样在对B表做全表扫描的时候就将where子句中的限制条件(B.col3 = 10)用上,从而得到一个较小的row source, 所以B表应该作为第一个驱动表。而且这样的话,如果再与A表做关联,可以有效利用A表的索引(因为A表的col1列为leading column)。
  上面的查询中C表上也有谓词(C.col3 = 5),有人可能认为C表作为第一个驱动表也能获得较好的性能。让我们再来分析一下:如果C表作为第一个驱动表,则能保证驱动表生成很小的row source,但是看看连接条件A.col2 = C.col2,此时就没有机会利用A表的索引,因为A表的col2列不为leading column,这样nested loop的效率很差,从而导致查询的效率很差。所以对于NL连接选择正确的驱动表很重要。
  因此上面查询比较好的连接顺序为(B - - & A) - - & C。如果数据库是基于代价的优化器,它会利用计算出的代价来决定合适的驱动表与合适的连接顺序。一般来说,CBO都会选择正确的连接顺序,如果CBO选择了比较差的连接顺序,我们还可以使用ORACLE提供的hints来让CBO采用正确的连接顺序。如下所示
select /*+ ordered */ A.col4
from  B,A,C
where B.col3 = 10&& and  A.col1 = B.col1&& and  A.col2 = C.col2&& and  C.col3 = 5
既然选择正确的驱动表这么重要,那么让我们来看一下执行计划,到底各个表之间是如何关联的,从而得到执行计划中哪个表应该为驱动表:
在执行计划中,需要知道哪个操作是先执行的,哪个操作是后执行的,这对于判断哪个表为驱动表有用处。判断之前,如果对表的访问是通过rowid,且该rowid的值是从索引扫描中得来得,则将该索引扫描先从执行计划中暂时去掉。然后在执行计划剩下的部分中,判断执行顺序的指导原则就是:最右、最上的操作先执行。具体解释如下:
得到去除妨碍判断的索引扫描后的执行计划:Execution Plan
-------------------------------------
  0   SELECT STATEMENT Optimizer=CHOOSE
  1  0 MERGE JOIN
  2  1 SORT (JOIN)
  3  2 &&&NESTED LOOPS
  4  3 &&&&&&TABLE ACCESS (FULL) OF 'B'
53 &&&&&&TABLE ACCESS (BY INDEX ROWID) OF 'A'
6  5 &&&&&& &INDEX (RANGE SCAN) OF 'INX_COL12A' (NON-UNIQUE)
  7  1 SORT (JOIN)
  8  7 &&&TABLE ACCESS (FULL) OF 'C'
  看执行计划的第3列,即字母部分,每列值的左面有空格作为缩进字符。在该列值左边的空格越多,说明该列值的缩进越多,该列值也越靠右。如上面的执行计划所示:第一列值为6的行的缩进最多,即该行最靠右;第一列值为4、5的行的缩进一样,其靠右的程度也一样,但是第一列值为4的行比第一列值为5的行靠上;谈论上下关系时,只对连续的、缩进一致的行有效。
  从这个图中我们可以看到,对于NESTED LOOPS部分,最右、最上的操作是TABLE ACCESS (FULL) OF 'B',所以这一操作先执行,所以该操作对应的B表为第一个驱动表(外部表),自然,A表就为内部表了。从图中还可以看出,B与A表做嵌套循环后生成了新的row source ,对该row source进行来排序后,与C表对应的排序了的row source(应用了C.col3 = 5限制条件)进行SMJ连接操作。所以从上面可以得出如下事实:B表先与A表做嵌套循环,然后将生成的row source与C表做排序&合并连接。
&&&&&& 通过分析上面的执行计划,我们不能说C表一定在B、A表之后才被读取,事实上,B表有可能与C表同时被读入内存,因为将表中的数据读入内存的操作可能为并行的。事实上许多操作可能为交叉进行的,因为ORACLE读取数据时,如果就是需要一行数据也是将该行所在的整个数据块读入内存,而且有可能为多块读。
 && 看执行计划时,我们的关键不是看哪个操作先执行,哪个操作后执行,而是关键看表之间连接的顺序(如得知哪个为驱动表,这需要从操作的顺序进行判断)、使用了何种类型的关联及具体的存取路径(如判断是否利用了索引)
在从执行计划中判断出哪个表为驱动表后,根据我们的知识判断该表作为驱动表(就像上面判断ABC表那样)是否合适,如果不合适,对SQL语句进行更改,使优化器可以选择正确的驱动表。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:263518次
积分:3761
积分:3761
排名:第3829名
原创:115篇
转载:51篇
评论:103条
(1)(1)(3)(4)(1)(4)(4)(8)(7)(6)(1)(5)(1)(2)(5)(3)(3)(4)(3)(4)(3)(3)(2)(3)(8)(6)(6)(1)(5)(3)(3)(5)(5)(8)(4)(4)(2)(2)(5)(4)(2)(2)(4)(3)(4)如何制定合理的采购计划? - 南方交易网
&&|&&&&|&&&&|&&&&|&&&&|&&加入收藏
中国第二代互联网交易平台、中国第一家“电子合同在线订立”试点示范基地、广东省“广货网上行”十大电商服务企业、深圳“深商e天下”十大电商服务企业!
热门关键字: &&|&&
您的当前位置:
如何制定合理的采购计划?
来源:南方交易网&&&&
资讯类型:商圈&&&&
上传时间: 16:25:06
市场的千变万化,采购过程的繁杂,那么就要求采购部门要制定一份合理、完善地知道采购管理计划,采购计划好比采购管理这盘棋的一颗重要的棋子,采购计划做好了,采购管理才能做的更成功,如果其中一颗棋子走错了,可能就会导致满盘皆输。
想要制定合理的采购计划,应该从三个方面入手。
首先企业要认真分析自身的情况,要制定好的采购计划,必须充分分析企业自身的实际情况,例如企业在行业中所处的地位,现有供应商的情况、生产能力等,尤其是要把握企业长远发展计划和发展战略。
一般来说,企业发展战略反映着一个企业的发展方向和宏观目标,计划如果没有贯彻、落实企业的发展战略,可能就会导致采购管理和企业的发展战略不协调,造成企业发展中的“南辕北辙”,脱离企业发展战略的采购计划,就好像无根的浮萍,既缺乏科学依据,又可能使得采购部门丧失方向,因此,只有充分了解企业自身的情况,制定出切实可行的采购计划才能走的更加长远。
其次要进行充分的市场调查,在制定采购计划时,应对企业面临的市场进行认真的市场调查,市场调查的内容应该包括经济发展形势、与采购相关的政策法规、行业发展状况、竞争对手的采购策略以及供应商的情况等等。只有做好充分的准备工作,才能保证采购假话的顺利完成。否则,无论理论上多么合理,最终还是难以经受得起市场的考验,它要么过于保守造成市场机会的丧失和企业可利用资源的最大浪费,要么过于激进计划不切实际,无法实现而成为一纸空文。
最后,就是要广开言路,集思广益,群策群力,许多采购组织在制定采购计划时,经常是由采购经理来制定,没有相关部门和基层采购人员的智慧支持,从而失去了实际的资料和最有创造性的建议,而且缺乏采购人员的普遍共识,导致采购计划因不够完善而影响采购运作的顺利进行。
一个企业制定合理的采购计划,一定是从企业自身出发,知己知彼百战不殆,了解自身的优势和劣势,再对比分析竞争对手的优势,因地适宜地制定采购计划,才是企业发展的不竭动力。
扩展阅读:
资讯热点排行榜posts - 75,&
comments - 268,&
trackbacks - 0
& & & 很多朋友都问过我优化SQL的事情。我觉得在我不断地鼓励下,很多朋友现在都知道优化SQL之前要先看看执行计划,也在优化中获得了很多快乐。但是今天有人问我执行计划应该怎么看。我觉得这是个值得写一写的东西。
& & & 日增加:
& & & 我下面的执行计划是怎么打印出来的,很多朋友还是不知道。其实语句只有三条:
explain plan for 你要查看的SQL语句;
select * from table(dbms_xplan.display);
& & & -----分割线----------------------------------
& & & 先告诉大家一个原则,看执行计划的时候,从第一行开始向右下看,一直到最右边。如果有并列的,那么先上再下。如果没并列,右边的先执行。
& & & 闲话少说,先上图吧:
& & & 这是一个简单的SQL的执行计划,这个执行计划告诉我们,id=2的最先执行,然后是id=3的,然后执行id=1的。
& & & 首先对test进行一次全表扫描,这一步返回rows=2,CPU的消耗为2。接下来对test1进行一次全表扫描,这一次返回的rows为2,CPU的消耗为3。接下来对这两个结果进行一次哈希连接(hash join),返回rows=1,这里的CPU消耗为6,但是需要注意,这次是我的语句赶寸了,6=2X3,但是哈希连接需要的CPU COST绝对不会恰恰是之前执行的操作的CPU COST之积,特别说明一下。至此,我们的oracle对这个语句的执行计划结束。
& & & 这个执行计划是怎么得到的?既然是计划,那么绝对不是把这个语句先执行一遍,然后把这个计算出来,那样的话这个执行计划就成了事后诸葛亮了。这个执行计划是oracle根据统计信息得到的。那么这个执行计划就有可能不准,请大家看看我的语句以及执行出来的结果:
SELECT A.SER_ID, B.OWNER FROM TEST A, TEST1 B WHERE A.AREA_ID = B.OWNER;
& & & 结果如图:
& & &怎么样?绝对不是6行那么点点东西吧?这个表的统计信息看来非常非常旧了。于是我对两个表重新进行统计:
ANALYZE TABLE TEST COMPUTE STATISTICS;ANALYZE TABLE TEST1 COMPUTE STATISTICS;
& & &然后再看看执行计划:
& & & 肿么样,这样就不是那么小了吧?test有12M行的返回。test1的owner字段只有两条记录:911和290。那么对应的test中area_id=290/911的有多少条记录呢?count一下:8485760,那么为什么是12M行呢?因为是全表扫描:
SELECT COUNT(*)/1024/1024 FROM TEST;
& & &结果就是12。
& & &现在可以总结一下了:执行计划的准确性(主要指数据返回,数据量大小)由统计信息的准确性决定。
阅读(...) 评论()如何写工作计划
来源:学习啦整理 | 作者:未知 | 本文已影响
&&& 一、为什么要写
<span style="color: #、计划是提高工作效率的有效手段
工作有两种形式:
一、消极式的工作(救火式的工作:灾难和错误已经发生后再赶快处理)
二、积极式的工作(防火式的工作
:预见灾难和错误,提前计划,消除错误)
写工作计划实际上就是对我们自己工作的一次盘点。让自己做到清清楚楚、明明白白。计划是我们走向积极式工作的起点。&&
2、计划能力是各级干部管理水平的体现&&
个人的发展要讲长远的,对于一个不断发展壮大,人员不断增加的企业和组织来说,计划显得尤为迫切。企业小的时候,还可以不用写计划。因为企业的问题并不多,沟通与协调起来也比较简单,只需要少数几个领导人就把发现的问题解决了。但是企业大了,人员多了,部门多了,问题也多了,沟通也更困难了,领导精力这时也显得有限。计划的重要性就体现出来了。
记得当时,总经理在中高层干部的例会上问大家:&有谁了解就业部的工作&,现场顿时鸦雀无声,没有人回答。几秒钟后,才有位片区负责人举起手来,然后又有一位部门负责人迟疑的举了一下手;总经理接着又问大家:&又有谁了解咨询部的工作&,这一次没有人回答;接连再问了几个部门,还是没有人回答。现场陷入了沉默,大家都在思考:为什么企业会出现那么多的问题。
这时,总经理说话了:&为什么我们的工作会出现那么多问题,为什么我们会抱怨其他部门,为什么我们对领导有意见&&&,停顿片刻&,&因为&&我们的工作是无形的,谁都不知道对方在做什么,平级之间不知道,上下级之间也不知道,领导也不知道,这样能把工作做好吗?能没有问题吗?显然不可能。问题是必然会发生的。所以我们需要把我们的工作&化无形为有形&,如何化,工作计划就是一种很好的工具!&。参加了这次例会的人,听了这番话没有不深深被触动的。&&&&
<span style="color: #、通过工作计划变被动等事做变为自动自发式的做事(个人驱动&系统驱动)&&&&
有了工作计划,我们不需要再等主管或领导的吩咐,只是在某些需要决策的事情上请示主管或领导就可以了。我们可以做到整体的统筹安排,个人的工作效率自然也就提高了。通过工作计划变个人驱动的为系统驱动的管理模式,这是企业成长的必经之路。&&
二、怎样写好工作计划&&
首先要申明一点:工作计划不是写出来的,而是做出来的。计划的内容远比形式来的重要。我们拒绝华丽的词藻,欢迎实实在在的内容。简单、清楚、可操作是工作计划要达到的基本要求。
如何才能做出一分良好的工作呢?总结当时会议上大家的发言和后来的一些说话,主要是要做到写出工作计划的四个要素。
工作计划的四大要素:&&&&&&&&
(<span style="color: #)工作内容 (做什么:WHAT)
(2)工作方法 (怎么做:HOW)
(3)工作分工 (谁来做:WHO)
(4)工作进度 (什么做完:WHEN&&)&&&
&&&缺少其中任何一个要素,那么这个工作计划就是不完整的、不可操作的,不可检查的的。最后就会走入形式主义,陷入&为了写计划而写计划,丧失写计划的目的&。在企业里难免就会出现&没什么必要写计划的声音&,我们改变自己的努力就可能会走入失败。
三、如何保证工作计划得到执行
工作计划写出来,目的就是要执行。执行可不是人们通常所认为的&我的方案已经拿出来了,执行是执行人员的事情。出了问题也是执行人员自身的水平问题&。执行不力,或者无法执行跟方案其实有很大关系,如果一开始,我们不了解现实情况,没有去做足够的调查和了解。那么这个方案先天就会给其后的执行埋下隐患。同样的道理,我们的计划能不能真正得到贯彻执行,不仅仅是执行人员的问题,也是写计划的人的问题。
首先,要调查实际情况,根据本部门结合企业现实情况,做出的计划才会被很好执行。
其次,各部门每月的工作计划应该拿到例会上进行公开讨论。目的有两个:其一、是通过每个人的智慧检查方案的可行性;其二、每个部门的工作难免会涉及到其他部门,通过讨论赢得上级支持和同级其他部门的协作。
另外,工作计划应该是可以调整的。当工作计划的执行偏离或违背了我们的目的时,需要对其做出调整,不能为了计划而计划。
还有,在工作计划的执行过程中,部门主管要经常跟踪检查执行情况和进度。发现问题时,就地解决并继续前进。因为中层干部既是管理人员,同时还是一个执行人员。不应该仅仅只是做所谓的方向和原则的管理而不深入问题和现场。
最后,修订后的工作计划应该有企业领导审核与签字,并负责跟踪执行和检
[]文章推荐
【】热门文章
个人学习计划范文_个人学习计划书范
左脑右脑测试_左右脑测试_左脑型右脑
Excel表格的基本操作教程免费下载
[] 精选热门文章
最新推荐文章

我要回帖

更多关于 计划管理软件 的文章

 

随机推荐