ºìÁªLinuxÃÅ»§
Linux°ïÖú

Õë¶ÔOracleÊý¾Ý¿âµÄÓÅ»¯Æ÷Ïêϸ½éÉÜ

·¢²¼Ê±¼ä:2006-12-09 09:27:18À´Ô´:ºìÁª×÷Õß:flycocoon
±¾ÎĵÄÄ¿µÄ£º

1¡¢ËµÒ»ËµOracleµÄOptimizer¼°ÆäÏà¹ØµÄһЩ֪ʶ¡£

2¡¢»Ø´ðÒ»ÏÂΪʲôÓÐʱһ¸ö±íµÄij¸ö×Ö¶ÎÃ÷Ã÷ÓÐË÷Òý,µ±¹Û²ìһЩSQLµÄÖ´Ðмƻ®Ê±,·¢ÏÖÈ·²»×ßË÷ÒýµÄÎÊÌâ¡£

3¡¢Èç¹ûÄã¶Ô FIRST_ROWS¡¢ ALL_ROWSÕâÁ½ÖÖģʽÓÐÒÉ»óʱҲ¿ÉÒÔ¿´Ò»ÏÂÕâƪÎÄÕ¡£

¿ªÊ¼°É:

OracleÔÚÖ´ÐÐÒ»¸öSQL֮ǰ,Ê×ÏÈÒª·ÖÎöÒ»ÏÂÓï¾äµÄÖ´Ðмƻ®,È»ºóÔÙ°´Ö´Ðмƻ®È¥Ö´ÐС£·ÖÎöÓï¾äµÄÖ´Ðмƻ®µÄ¹¤×÷ÊÇÓÉÓÅ»¯Æ÷(Optimizer)À´Íê³ÉµÄ¡£²»Í¬µÄÇé¿ö,Ò»ÌõSQL¿ÉÄÜÓжàÖÖÖ´Ðмƻ®,µ«ÔÚijһʱµã,Ò»¶¨Ö»ÓÐÒ»ÖÖÖ´Ðмƻ®ÊÇ×îÓŵÄ,»¨·Ñʱ¼äÊÇ×îÉٵġ£ÏàÐÅÄãÒ»¶¨»áÓÃPl/sql Developer¡¢ToadµÈ¹¤¾ßÈ¥¿´Ò»¸öÓï¾äµÄÖ´Ðмƻ®,²»¹ýÄã¿ÉÄܶÔRule¡¢Choose¡¢First rows¡¢All rowsÕ⼸ÏîÓÐÒÉÎÊ,ÒòΪÎÒµ±³õÒ²ÊÇÕâÑùµÄ,ÄÇʱÎÒÒ²ÒÉ»óΪʲôѡÁËÒÔÉϵIJ»Í¬µÄÏî,Ö´Ðмƻ®¾Í±äÁË?

1¡¢ÓÅ»¯Æ÷µÄÓÅ»¯·½Ê½

OracleµÄÓÅ»¯Æ÷¹²ÓÐÁ½ÖÖµÄÓÅ»¯·½Ê½,¼´»ùÓÚ¹æÔòµÄÓÅ»¯·½Ê½(Rule-Based Optimization,¼ò³ÆΪRBO)ºÍ»ùÓÚ´ú¼ÛµÄÓÅ»¯·½Ê½(Cost-Based Optimization,¼ò³ÆΪCBO)¡£

A¡¢RBO·½Ê½£ºÓÅ»¯Æ÷ÔÚ·ÖÎöSQLÓï¾äʱ,Ëù×ñÑ­µÄÊÇOracleÄÚ²¿Ô¤¶¨µÄһЩ¹æÔò¡£±ÈÈçÎÒÃdz£¼ûµÄ,µ±Ò»¸öwhere×Ó¾äÖеÄÒ»ÁÐÓÐË÷Òýʱȥ×ßË÷Òý¡£

B¡¢CBO·½Ê½£ºÒÀ´ÊÒå¿ÉÖª,ËüÊÇ¿´Óï¾äµÄ´ú¼Û(Cost)ÁË,ÕâÀïµÄ´ú¼ÛÖ÷ÒªÖ¸CpuºÍÄÚ´æ¡£ÓÅ»¯Æ÷ÔÚÅжÏÊÇ·ñÓÃÕâÖÖ·½Ê½Ê±,Ö÷Òª²ÎÕÕµÄÊÇ±í¼°Ë÷ÒýµÄͳ¼ÆÐÅÏ¢¡£Í³¼ÆÐÅÏ¢¸ø³ö±íµÄ´óС ¡¢ÓÐÉÙÐС¢Ã¿Ðеij¤¶ÈµÈÐÅÏ¢¡£ÕâЩͳ¼ÆÐÅÏ¢Æð³õÔÚ¿âÄÚÊÇûÓеÄ,ÊÇÄãÔÚ×öanalyzeºó²Å³öÏÖµÄ,ºÜ¶àµÄʱºî¹ýÆÚͳ¼ÆÐÅÏ¢»áÁîÓÅ»¯Æ÷×ö³öÒ»¸ö´íÎóµÄÖ´Ðмƻ®,ÒòЩÎÒÃÇÓ¦¼°Ê±¸üÐÂÕâЩÐÅÏ¢¡£ÔÚOracle8¼°ÒÔºóµÄ°æ±¾,OracleÁÐÍƼöÓÃCBOµÄ·½Ê½¡£

ÎÒÃÇÒªÃ÷ÁË,²»Ò»¶¨×ßË÷Òý¾ÍÊÇÓŵÄ,±ÈÈçÒ»¸ö±íÖ»ÓÐÁ½ÐÐÊý¾Ý,Ò»´ÎIO¾Í¿ÉÒÔÍê³ÉÈ«±íµÄ¼ìË÷,¶ø´Ëʱ×ßË÷ÒýʱÔòÐèÒªÁ½´ÎIO,Õâʱ¶ÔÕâ¸ö±í×öÈ«±íɨÃè(full table scan)ÊÇ×îºÃµÄ¡£

2¡¢ÓÅ»¯Æ÷µÄÓÅ»¯Ä£Ê½(Optermizer Mode)

ÓÅ»¯Ä£Ê½°üÀ¨Rule,Choose,First rows,All rowsÕâËÄÖÖ·½Ê½,Ò²¾ÍÊÇÎÒÃÇÒÔÉÏËùÌá¼°µÄ¡£ÈçÏÂÎÒ½âÊÍһϣº

Rule:²»Óöà˵,¼´×ß»ùÓÚ¹æÔòµÄ·½Ê½¡£

Choolse:ÕâÊÇÎÒÃÇÓ¦¹Û×¢µÄ,ĬÈϵÄÇé¿öÏÂOracleÓõıãÊÇÕâÖÖ·½Ê½¡£Ö¸µÄÊǵ±Ò»¸ö±í»ò»òË÷ÒýÓÐͳ¼ÆÐÅÏ¢,Ôò×ßCBOµÄ·½Ê½,Èç¹û±í»òË÷Òýûͳ¼ÆÐÅÏ¢,±íÓÖ²»ÊÇÌرðµÄС,¶øÇÒÏàÓ¦µÄÁÐÓÐË÷Òýʱ,ÄÇô¾Í×ßË÷Òý,×ßRBOµÄ·½Ê½¡£

First Rows:ËüÓëChoose·½Ê½ÊÇÀàËƵÄ,Ëù²»Í¬µÄÊǵ±Ò»¸ö±íÓÐͳ¼ÆÐÅϢʱ,Ëü½«ÊÇÒÔ×î¿ìµÄ·½Ê½·µ»Ø²éѯµÄ×îÏȵļ¸ÐÐ,´Ó×ÜÌåÉϼõÉÙÁËÏìӦʱ¼ä¡£

All Rows:Ò²¾ÍÊÇÎÒÃÇËù˵µÄCostµÄ·½Ê½,µ±Ò»¸ö±íÓÐͳ¼ÆÐÅϢʱ,Ëü½«ÒÔ×î¿ìµÄ·½Ê½·µ»Ø±íµÄËùÓеÄÐÐ,´Ó×ÜÌåÉÏÌá¸ß²éѯµÄÍÌÍÂÁ¿¡£Ã»ÓÐͳ¼ÆÐÅÏ¢Ôò×ß»ùÓÚ¹æÔòµÄ·½Ê½¡£

3¡¢ÈçºÎÉ趨ѡÓÃÄÄÖÖÓÅ»¯Ä£Ê½

a¡¢Instance¼¶±ð

ÎÒÃÇ¿ÉÒÔͨ¹ýÔÚinit.oraÎļþÖÐÉ趨OPTIMIZER_MODE=RULE¡¢OPTIMIZER_MODE=CHOOSE¡¢OPTIMIZER_MODE=FIRST_ROWS¡¢OPTIMIZER_MODE=ALL_ROWSȥѡÓÃ3ËùÌáµÄËÄÖÖ·½Ê½,Èç¹ûÄãûÉ趨OPTIMIZER_MODE²ÎÊýÔòĬÈÏÓõÄÊÇChooseÕâÖÖ·½Ê½¡£

B¡¢Sessions¼¶±ð

ͨ¹ýSQL> ALTER SESSION SET OPTIMIZER_MODE=;À´É趨¡£

C¡¢Óï¾ä¼¶±ð

ÕâЩÐèÒªÓõ½Hint,±ÈÈç:


¡¡¡¡
¡¡¡¡SQL> SELECT /*+ RULE */ a.userid,
¡¡¡¡2¡¡¡¡ b.name,
¡¡¡¡3¡¡¡¡ b.depart_name
¡¡¡¡4¡¡¡¡¡¡FROM tf_f_yhda a,
¡¡¡¡5¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡¡tf_f_depart b
¡¡¡¡6¡¡¡¡ WHERE a.userid=b.userid;
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 1 ÌõÆÀÂÛ

  1. flycocoon ÓÚ 2006-12-09 09:27:41·¢±í:

    4¡¢ÎªÊ²Ã´ÓÐʱһ¸ö±íµÄij¸ö×Ö¶ÎÃ÷Ã÷ÓÐË÷Òý,µ±¹Û²ìһЩÓïµÄÖ´Ðмƻ®È·²»×ßË÷ÒýÄØ£¿ÈçºÎ½â¾öÄØ£¿

    A¡¢²»×ßË÷Òý´óÌåÓÐÒÔϼ¸¸öÔ­Òò:

    ¡âÄãÔÚInstance¼¶±ðËùÓõÄÊÇall_rowsµÄ·½Ê½£»

    ¡âÄãµÄ±íµÄͳ¼ÆÐÅÏ¢(×î¿ÉÄܵÄÔ­Òò)£»

    ¡âÄãµÄ±íºÜС,ÉÏÎÄÌáµ½¹ýµÄ,OracleµÄÓÅ»¯Æ÷ÈÏΪ²»ÖµµÃ×ßË÷Òý¡£

    B¡¢½â¾ö·½·¨£º

    ¡â¿ÉÒÔÐÞ¸Äinit.oraÖеÄOPTIMIZER_MODEÕâ¸ö²ÎÊý,°ÑËü¸ÄΪRule»òChoose,ÖØÆðÊý¾Ý¿â¡£Ò²¿ÉÒÔʹÓÃ4ÖÐËùÌáµÄHint£»

    ¡âɾ³ýͳ¼ÆÐÅÏ¢SQL>analyze table table_name delete statistics£»

    ¡â±íС²»×ßË÷ÒýÊǶԵÄ,²»Óõ÷µÄ¡£

    5¡¢ÆäËüÏà¹Ø

    A¡¢ÈçºÎ¿´Ò»¸ö±í»òË÷ÒýÊÇ·ñÊÇͳ¼ÆÐÅÏ¢


    ¡¡¡¡
    ¡¡¡¡SQL>SELECT * FROM user_tables
    ¡¡¡¡2¡¡ WHERE table_name=
    ¡¡¡¡3 AND num_rows is not null;
    ¡¡¡¡
    ¡¡¡¡SQL>SELECT * FROM user_indexes
    ¡¡¡¡2¡¡ WHERE table_name=
    ¡¡¡¡3¡¡¡¡ AND num_rows is not null;


    ¡¡¡¡
    b¡¢Èç¹ûÎÒÃÇÏÈÓÃCBOµÄ·½Ê½,ÎÒÃÇÓ¦¼°Ê±È¥¸üбíºÍË÷ÒýµÄͳ¼ÆÐÅÏ¢,ÒÔÃâÉúÐβ»ÇкÏʵµÄÖ´Ðмƻ®¡£


    ¡¡¡¡
    ¡¡¡¡SQL> ANALYZE TABLE table_name COMPUTE STATISTICS;
    ¡¡¡¡SQL> ANALYZE INDEX index_name ESTIMATE STATISTICS;


    ¡¡¡¡
    ¾ßÌåµÄANALYZEÓï¾äÇë²ÎÕÕOracle8i/9i µÄrefrenceÎĵµ¡£