µ±ÄãÔËÓà SQL ÓïÑÔ£¬ÏòÊý¾Ý¿â·¢²¼Ò»Ìõ²éѯÓï¾äʱ£¬ ORACLE ½«°éËæ²úÉúÒ»¸ö¡°Ö´Ðмƻ®¡±£¬Ò²¾ÍÊǸÃÓï¾ä½«Í¨¹ýºÎÖÖÊý¾ÝËÑË÷·½°¸Ö´ÐУ¬ÊÇͨ¹ýÈ«±íɨÃè¡¢»¹ÊÇͨ¹ýË÷ÒýËÑÑ°µÈÆäËü·½Ê½¡£ËÑË÷·½°¸µÄÑ¡ÓÃÓë ORACLE µÄÓÅ»¯Æ÷ϢϢÏà¹Ø¡£
SQL Óï¾äµÄÖ´Ðв½Öè¡£
1 Óï·¨·ÖÎö ·ÖÎöÓï¾äµÄÓï·¨ÊÇ·ñ·ûºÏ¹æ·¶£¬ºâÁ¿Óï¾äÖи÷±í´ïʽµÄÒâÒå¡£
2 ÓïÒå·ÖÎö ¼ì²éÓï¾äÖÐÉæ¼°µÄËùÓÐÊý¾Ý¿â¶ÔÏóÊÇ·ñ´æÔÚ£¬ÇÒÓû§ÓÐÏàÓ¦µÄȨÏÞ¡£
3 ÊÓͼת»» ½«Éæ¼°ÊÓͼµÄ²éѯÓï¾äת»»ÎªÏàÓ¦µÄ¶Ô»ù±í²éѯÓï¾ä¡£
4 ±í´ïʽת»» ½«¸´Ô SQL ±í´ïʽת»»Îª½Ï¼òµ¥µÄµÈЧÁ¬½Ó±í´ïʽ¡£
5 Ñ¡ÔñÓÅ»¯Æ÷ ²»Í¬µÄÓÅ»¯Æ÷Ò»°ã²úÉú²»Í¬µÄ¡°Ö´Ðмƻ®¡±
6 Ñ¡ÔñÁ¬½Ó·½Ê½ ORACLE ÓÐÈýÖÖÁ¬½Ó·½Ê½£¬¶Ô¶à±íÁ¬½Ó ORACLE ¿ÉÑ¡ÔñÊʵ±µÄÁ¬½Ó·½Ê½¡£
7 Ñ¡ÔñÁ¬½Ó˳Ðò ¶Ô¶à±íÁ¬½Ó ORACLE Ñ¡ÔñÄÄÒ»¶Ô±íÏÈÁ¬½Ó£¬Ñ¡ÔñÕâÁ½±íÖÐÄĸö±í×öΪԴÊý¾Ý±í¡£
8 Ñ¡ÔñÊý¾ÝµÄËÑË÷·¾¶ ¸ù¾ÝÒÔÉÏÌõ¼þÑ¡ÔñºÏÊʵÄÊý¾ÝËÑË÷·¾¶£¬ÈçÊÇÑ¡ÓÃÈ«±íËÑË÷»¹ÊÇÀûÓÃË÷Òý»òÊÇÆäËûµÄ·½Ê½¡£
9 ÔËÐС°Ö´Ðмƻ®¡±¡£
ORACLE µÄÓÅ»¯Æ÷
ORACLE ÓÐÁ½ÖÖÓÅ»¯Æ÷£º»ùÓÚ¹æÔòµÄÓÅ»¯Æ÷£¨ RBO £¬ Rule Based Optimizer £©£¬ºÍ»ùÓÚ´ú¼ÛµÄÓÅ»¯Æ÷£¨ CBO £¬ Cost Based Optimizer £©¡£
RBO ×Ô ORACLE 6 °æÒÔÀ´±»²ÉÓã¬ÓÐ×ÅÒ»Ì×ÑϸñµÄʹÓùæÔò£¬Ö»ÒªÄã°´ÕÕËüȥд SQL Óï¾ä£¬ÎÞÂÛÊý¾Ý±íÖеÄÄÚÈÝÔõÑù£¬Ò²²»»áÓ°Ïìµ½ÄãµÄ¡°Ö´Ðмƻ®¡±£¬Ò²¾ÍÊÇ˵¶ÔÊý¾Ý²»¡°Ãô¸Ð¡±£¬ ORACLE ¹«Ë¾ÒѾ²»ÔÙ·¢Õ¹ÕâÖÖ¼¼ÊõÁË¡£
CBO ×Ô ORACLE 7 °æ±»ÒýÈ룬 ORACLE ×Ô 7 °æÒÔÀ´²ÉÓõÄÐí¶àм¼Êõ¶¼ÊÇ»ùÓÚ CBO µÄ£¬ÈçÐÇÐÍÁ¬½ÓÅÅÁвéѯ£¬¹þÏ£Á¬½Ó²éѯ£¬ºÍ²¢ÐвéѯµÈ¡£ CBO ¼ÆËã¸÷ÖÖ¿ÉÄÜ¡°Ö´Ðмƻ®¡±µÄ¡°´ú¼Û¡±£¬¼´ cost £¬´ÓÖÐÑ¡Óà cost ×îµÍµÄ·½°¸£¬×÷Ϊʵ¼ÊÔËÐз½°¸¡£¸÷¡°Ö´Ðмƻ®¡±µÄ cost µÄ¼ÆËã¸ù¾Ý£¬ÒÀÀµÓÚÊý¾Ý±íÖÐÊý¾ÝµÄͳ¼Æ·Ö²¼£¬ ORACLE Êý¾Ý¿â±¾Éí¶Ô¸Ãͳ¼Æ·Ö²¼²¢²»Çå³þ£¬ÐëÒª·ÖÎö±íºÍÏà¹ØµÄË÷Òý£¬²ÅÄÜËѼ¯µ½ CBO ËùÐèµÄÊý¾Ý¡£
Ò»°ã¶øÑÔ£¬ CBO ËùÑ¡ÔñµÄ¡°Ö´Ðмƻ®¡±¶¼²»»á±È RBO µÄ¡°Ö´Ðмƻ®¡±²î£¬¶øÇÒÏà¶Ô¶øÑÔ£¬ CBO ¶Ô³ÌÐòÔ±µÄÒªÇóûÓÐ RBO ÄÇô¿Á¿Ì£¬½ÚÊ¡Á˳ÌÐòԱΪÁË´Ó¶à¸ö¿ÉÄܵġ°Ö´Ðмƻ®¡±ÖÐÑ¡ÔñÒ»¸ö×îÓŵķ½°¸¶ø»¨·ÑµÄµ÷ÊÔʱ¼ä£¬µ«ÔÚijЩ³¡ºÏÏÂÒ²»á´æÔÚÎÊÌâ¡£
½ÏµäÐ͵ÄÎÊÌâÓУºÓÐʱ£¬±íÃ÷Ã÷½¨ÓÐË÷Òý£¬µ«²éѯ¹ý³ÌÏÔȻûÓÐÓõ½Ïà¹ØµÄË÷Òý£¬µ¼Ö²éѯ¹ý³ÌºÄʱÂþ³¤£¬Õ¼ÓÃ×ÊÔ´¾Þ´ó£¬ÎÊÌâµ½µ×³öÔÚÄĶùÄØ£¿°´ÕÕÒÔÏÂ˳Ðò²éÕÒ£¬»ù±¾ÉÏÄÜ·¢ÏÖÔÒòËùÔÚ¡£
²éÕÒÔÒòµÄ²½Öè
Ê×ÏÈ£¬ÎÒÃÇҪȷ¶¨Êý¾Ý¿âÔËÐÐÔÚºÎÖÖÓÅ»¯Ä£Ê½Ï£¬ÏàÓ¦µÄ²ÎÊýÊÇ£º optimizer_mode ¡£¿ÉÔÚ svrmgrl ÖÐÔËÐС° show parameter optimizer_mode" À´²é¿´¡£ ORACLE V7 ÒÔÀ´È±Ê¡µÄÉèÖÃÓ¦ÊÇ "choose" £¬¼´Èç¹û¶ÔÒÑ·ÖÎöµÄ±í²éѯµÄ»°Ñ¡Ôñ CBO £¬·ñÔòÑ¡Ôñ RBO ¡£Èç¹û¸Ã²ÎÊýÉèΪ¡° rule ¡±£¬Ôò²»ÂÛ±íÊÇ·ñ·ÖÎö¹ý£¬Ò»¸ÅÑ¡Óà RBO £¬³ý·ÇÔÚÓï¾äÖÐÓà hint Ç¿ÖÆ¡£
Æä´Î£¬¼ì²é±»Ë÷ÒýµÄÁлò×éºÏË÷ÒýµÄÊ×ÁÐÊÇ·ñ³öÏÖÔÚ PL/SQL Óï¾äµÄ WHERE ×Ó¾äÖУ¬ÕâÊÇ¡°Ö´Ðмƻ®¡±ÄÜÓõ½Ïà¹ØË÷ÒýµÄ±ØÒªÌõ¼þ¡£
µÚÈý£¬¿´²ÉÓÃÁËÄÄÖÖÀàÐ͵ÄÁ¬½Ó·½Ê½¡£ ORACLE µÄ¹²ÓÐ Sort Merge Join £¨ SMJ £©¡¢ Hash Join £¨ HJ £©ºÍ Nested Loop Join £¨ NL £©¡£ÔÚÁ½ÕűíÁ¬½Ó£¬ÇÒÄÚ±íµÄÄ¿±êÁÐÉϽ¨ÓÐË÷Òýʱ£¬Ö»ÓÐ Nested Loop ²ÅÄÜÓÐЧµØÀûÓõ½¸ÃË÷Òý¡£ SMJ ¼´Ê¹Ïà¹ØÁÐÉϽ¨ÓÐË÷Òý£¬×î¶àÖ»ÄÜÒòË÷ÒýµÄ´æÔÚ£¬±ÜÃâÊý¾ÝÅÅÐò¹ý³Ì¡£ HJ ÓÉÓÚÐë×ö HASH ÔËË㣬Ë÷ÒýµÄ´æÔÚ¶ÔÊý¾Ý²éѯËٶȼ¸ºõûÓÐÓ°Ïì¡£
µÚËÄ£¬¿´Á¬½Ó˳ÐòÊÇ·ñÔÊÐíʹÓÃÏà¹ØË÷Òý¡£¼ÙÉè±í emp µÄ deptno ÁÐÉÏÓÐË÷Òý£¬±í dept µÄÁÐ deptno ÉÏÎÞË÷Òý£¬ WHERE Óï¾äÓÐ emp.deptno=dept.deptno Ìõ¼þ¡£ÔÚ×ö NL Á¬½Óʱ£¬ emp ×öΪÍâ±í£¬Ïȱ»·ÃÎÊ£¬ÓÉÓÚÁ¬½Ó»úÖÆÔÒò£¬Íâ±íµÄÊý¾Ý·ÃÎÊ·½Ê½ÊÇÈ«±íɨÃ裬 emp.deptno ÉϵÄË÷ÒýÏÔÈ»ÊÇÓò»ÉÏ£¬×î¶àÔÚÆäÉÏ×öË÷ÒýȫɨÃè»òË÷Òý¿ìËÙȫɨÃè¡£
µÚÎ壬ÊÇ·ñÓõ½ÏµÍ³Êý¾Ý×Öµä±í»òÊÓͼ¡£ÓÉÓÚϵͳÊý¾Ý×Öµä±í¶¼Î´±»·ÖÎö¹ý£¬¿ÉÄܵ¼Ö¼«²îµÄ¡°Ö´Ðмƻ®¡±¡£µ«ÊDz»ÒªÉÃ×Ô¶ÔÊý¾Ý×Öµä±í×ö·ÖÎö£¬·ñÔò¿ÉÄܵ¼ÖÂËÀËø£¬»òϵͳÐÔÄÜϽµ¡£
µÚÁù£¬ÊÇ·ñ´æÔÚDZÔÚµÄÊý¾ÝÀàÐÍת»»¡£È罫×Ö·ûÐÍÊý¾ÝÓëÊýÖµÐÍÊý¾Ý±È½Ï£¬ ORACLE »á×Ô¶¯½«×Ö·ûÐÍÓà to_number() º¯Êý½øÐÐת»»£¬´Ó¶øµ¼ÖµÚÁùÖÖÏÖÏóµÄ·¢Éú¡£
µÚÆߣ¬ÊÇ·ñΪ±íºÍÏà¹ØµÄË÷ÒýËѼ¯×ã¹»µÄͳ¼ÆÊý¾Ý¡£¶ÔÊý¾Ý¾³£ÓÐÔö¡¢É¾¡¢¸ÄµÄ±í×îºÃ¶¨ÆÚ¶Ô±íºÍË÷Òý½øÐзÖÎö£¬¿ÉÓà SQL Óï¾ä¡° analyze table xxxx compute statistics for all indexes;" ¡£ ORACLE ÕÆÎÕÁ˳ä·Ö·´Ó³Êµ¼ÊµÄͳ¼ÆÊý¾Ý£¬²ÅÓпÉÄÜ×ö³öÕýÈ·µÄÑ¡Ôñ¡£
ÎÔÁú ÓÚ 2007-01-16 00:30:11·¢±í:
µÚ°Ë£¬Ë÷ÒýÁеÄÑ¡ÔñÐÔ²»¸ß¡£ ÎÒÃǼÙÉèµäÐÍÇé¿ö£¬Óбí emp £¬¹²ÓÐÒ»°ÙÍòÐÐÊý¾Ý£¬µ«ÆäÖÐµÄ emp.deptno ÁУ¬Êý¾ÝÖ»ÓÐ 4 ÖÖ²»Í¬µÄÖµ£¬Èç 10 ¡¢ 20 ¡¢ 30 ¡¢ 40 ¡£ËäÈ» emp Êý¾ÝÐÐÓкܶ࣬ ORACLE ȱʡÈ϶¨±íÖÐÁеÄÖµÊÇÔÚËùÓÐÊý¾ÝÐоùÔÈ·Ö²¼µÄ£¬Ò²¾ÍÊÇ˵ÿÖÖ deptno Öµ¸÷ÓÐ 25 ÍòÊý¾ÝÐÐÓëÖ®¶ÔÓ¦¡£¼ÙÉè SQL ËÑË÷Ìõ¼þ DEPTNO=10 £¬ÀûÓà deptno ÁÐÉϵÄË÷Òý½øÐÐÊý¾ÝËÑË÷ЧÂÊ£¬ÍùÍù²»±ÈÈ«±íɨÃèµÄ¸ß£¬ ORACLE ÀíËùµ±È»¶ÔË÷Òý¡°ÊÓ¶ø²»¼û¡±£¬ÈÏΪ¸ÃË÷ÒýµÄÑ¡ÔñÐÔ²»¸ß¡£ µ«ÎÒÃÇ¿¼ÂÇÁíÒ»ÖÖÇé¿ö£¬Èç¹ûÒ»°ÙÍòÊý¾ÝÐÐʵ¼Ê²»ÊÇÔÚ 4 ÖÖ deptno Öµ¼äƽ¾ù·ÖÅ䣬ÆäÖÐÓÐ 99 ÍòÐжÔÓ¦×ÅÖµ 10 £¬ 5000 ÐжÔÓ¦Öµ 20 £¬ 3000 ÐжÔÓ¦Öµ 30 £¬ 2000 ÐжÔÓ¦Öµ 40 ¡£ÔÚÕâÖÖÊý¾Ý·Ö²¼Í¼°¸ÖжԳýֵΪ 10 ÍâµÄÆäËü deptno ÖµËÑË÷ʱ£¬ºÁÎÞÒÉÎÊ£¬Èç¹ûË÷ÒýÄܱ»Ó¦Óã¬ÄÇôЧÂÊ»á¸ß³öºÜ¶à¡£ÎÒÃÇ¿ÉÒÔ²ÉÓöԸÃË÷ÒýÁнøÐе¥¶À·ÖÎö£¬»òÓà analyze Óï¾ä¶Ô¸ÃÁн¨Á¢Ö±·½Í¼£¬¶Ô¸ÃÁÐËѼ¯×ã¹»µÄͳ¼ÆÊý¾Ý£¬Ê¹ ORACLE ÔÚËÑË÷Ñ¡ÔñÐԽϸߵÄÖµÄÜÓÃÉÏË÷Òý¡£
µÚ¾Å£¬Ë÷ÒýÁÐÖµÊÇ·ñ¿ÉΪ¿Õ£¨ NULL £©¡£Èç¹ûË÷ÒýÁÐÖµ¿ÉÒÔÊÇ¿ÕÖµ£¬ÔÚ SQL Óï¾äÖÐÄÇЩÐèÒª·µ»Ø NULL ÖµµÄ²Ù×÷£¬½«²»»áÓõ½Ë÷Òý£¬Èç COUNT £¨ * £©£¬¶øÊÇÓÃÈ«±íɨÃè¡£ÕâÊÇÒòΪË÷ÒýÖд洢ֵ²»ÄÜΪȫ¿Õ¡£
µÚʮһ£¬¿´ÊÇ·ñÓÐÓõ½²¢Ðвéѯ£¨ PQO £©¡£²¢Ðвéѯ½«²»»áÓõ½Ë÷Òý¡£ÈçÎÒÃÇÏëÒªÓõ½ A ±íµÄ IND_COL1 Ë÷ÒýµÄ»°£¬¿É²ÉÓÃÒÔÏ·½Ê½£º
¡° SELECT /*+ INDEX £¨ A IND_COL1 £© */ * FROM A WHERE COL1 = XXX;"
×¢Ò⣬עÊÍ·û±ØÐë¸úÔÚ SELECT Ö®ºó£¬ÇÒ×¢ÊÍÖеġ° + ¡±Òª½ô¸ú×Å×¢ÊÍÆðʼ·û¡° /* ¡±»ò¡° -- ¡±£¬·ñÔò hint ¾Í±»ÈÏΪÊÇÒ»°ã×¢ÊÍ£¬¶Ô PL/SQL Óï¾äµÄÖ´Ðв»²úÉúÈκÎÓ°Ïì¡£
Ò»ÖÖÊÇ EXPLAIN TABLE ·½Ê½¡£Óû§±ØÐëÊ×ÏÈÔÚ×Ô¼ºµÄģʽ£¨ SCHEMA £©Ï£¬½¨Á¢ PLAN_TABLE ±í£¬Ö´Ðмƻ®µÄÿһ²½Ö趼½«¼Ç¼ÔڸñíÖУ¬½¨±í SQL ½Å±¾ÎªÔÚ ${ORACLE_HOME}/rdbms/admin/ Ï嵀 utlxplan.sql ¡£
´ò¿ª SQL*PLUS £¬ÊäÈë¡° SET AUTOTRACE ON ¡±£¬È»ºóÔËÐдýµ÷Ê﵀ SQL Óï¾ä¡£ÔÚ¸ø³ö²éѯ½á¹ûºó£¬ ORACLE ½«ÏÔʾÏàÓ¦µÄ¡°Ö´Ðмƻ®¡±£¬°üÀ¨ÓÅ»¯Æ÷ÀàÐÍ¡¢Ö´Ðдú¼Û¡¢Á¬½Ó·½Ê½¡¢Á¬½Ó˳Ðò¡¢Êý¾ÝËÑË÷·¾¶ÒÔ¼°ÏàÓ¦µÄÁ¬Ðø¶Á¡¢ÎïÀí¶ÁµÈ×ÊÔ´´ú¼Û¡£
Èç¹ûÎÒÃDz»ÄÜÈ·¶¨ÐèÒª¸ú×ٵľßÌå SQL Óï¾ä£¬±ÈÈçij¸öÓ¦ÓÃʹÓÃÒ»¶Îʱ¼äºó£¬ÏìÓ¦ËٶȺöÈ»±äÂý¡£ÎÒÃÇÕâʱ¿ÉÒÔÀûÓà ORACLE ÌṩµÄÁíÒ»¸öÓÐÁ¦¹¤¾ß TKPROF £¬¶ÔÓ¦ÓõÄÖ´Ðйý³ÌÈ«³Ì¸ú×Ù¡£ÎÒÃÇÒªÏÈÔÚϵͳÊÓͼ V$SESSION ÖУ¬¿É¸ù¾Ý USERID »ò MACHINE £¬²é³öÏàÓ¦µÄ SID ºÍ SERIAL# ¡£ÒÔ SYS »òÆäËûÓÐÖ´ÐÐ DBMS_SYSTEM ³ÌÐò°üµÄÓû§Á¬½ÓÊý¾Ý¿â£¬Ö´ÐС° EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION £¨ SID £¬ SERIAL# £¬ TRUE £©£»¡±¡£
È»ºóÔËÐÐÓ¦ÓóÌÐò£¬ÕâʱÔÚ·þÎñÆ÷¶Ë£¬Êý¾Ý¿â²ÎÊý¡° USER_DUMP_DEST ¡±Ö¸Ê¾µÄĿ¼Ï£¬»áÉú³É ora__xxxx.trc Îļþ£¬ÆäÖÐ xxxx Ϊ±»¸ú×ÙÓ¦ÓõIJÙ×÷ϵͳ½ø³ÌºÅ¡£
Ó¦ÓóÌÐòÖ´ÐÐÍê³Éºó£¬ÓÃÃüÁî tkprof ¶Ô¸ÃÎļþ½øÐзÖÎö¡£ÃüÁîʾÀý£º¡° tkprof tracefile outputfile explain=userid/password" ¡£ÔÚ²Ù×÷ϵͳ ORACLE Óû§Ï£¬¼üÈë¡° tkprof ¡±£¬»áÓÐÏêϸµÄÃüÁî°ïÖú¡£·ÖÎöºóµÄÊä³öÎļþ outputfile ÖУ¬ÓÐÿһÌõ PL/SQL Óï¾äµÄ¡°Ö´Ðмƻ®¡±¡¢ CPU Õ¼Óá¢ÎïÀí¶Á´ÎÊý¡¢Âß¼¶Á´ÎÊý¡¢Ö´ÐÐʱ³¤µÈÖØÒªÐÅÏ¢¡£¸ù¾ÝÊä³öÎļþµÄÐÅÏ¢£¬ÎÒÃÇ¿ÉÒԺܿ췢ÏÖÓ¦ÓÃÖÐÄÄÌõ PL/SQL Óï¾äÊÇÎÊÌâµÄÖ¢½áËùÔÚ¡£