¼ò½é
´ó¶àÊýÖ÷ÒªµÄ¹ØÏµÐÍÊý¾Ý¿â¹ÜÀíϵͳ£¬°üÀ¨ DB2 for Linux, UNIX,
and Windows£¬ÒÀÀµÓÚÒ»ÖÖ»ùÓڳɱ¾µÄÓÅ»¯Æ÷Éè¼Æ¡£¸ÃÓÅ»¯Æ÷»ùÓÚһЩÌõ¼þÀ´ÆÀ¹À³É±¾£¬°üÀ¨ CPU ²¢ÐÐÐÔºÍËÙ¶È¡¢I/O
´æ´¢ÌØÕ÷ºÍͨÐÅ´ø¿íµÈÍⲿÌõ¼þ£¬ÒÔ¼° DB2 ×¢²á±í±äÁ¿¡¢DB2 ÓÅ»¯¼¶±ð¡¢Í³¼ÆÐÅÏ¢µÈÄÚ²¿Ìõ¼þ¡£¶øÇÒ£¬ÔÚϵͳÔËÐÐʱÆÚ¼ä£¬ÕâЩÌõ¼þÖÐÐí¶à¶¼ÔÚ²»¶Ï±ä»¯£¬ËùÒÔÑ¡Ôñ×î¼ÑÖ´Ðмƻ®µÄ¹ý³Ì¶ÔÈκÎÊý¾Ý¿âϵͳ¶øÑÔ¶¼ÊÇÒ»¸ö·Ç³£¸´ÔӵĹý³Ì¡£DB2
ÓÅ»¯ÅäÖÃÎļþÊǶÔÓÅ»¯Æ÷µÄÖØÒª²¹³ä¡£¶ÔÓÚÔÚʵÏÖÁËÆäËûµ÷½Úʵ¼ùÖ®ºó²»Âú×ãÐÔÄÜÐèÇóµÄ SQL Óï¾ä£¬¿ÉÒÔʹÓô˹¦ÄÜÐÞ¸ÄĬÈÏÖ´Ðмƻ®¡£Ëü¶ÔÓ¦ÓóÌÐòµ÷ÊÔºÍ
SQL Óï¾äÐÔÄÜÓÅ»¯×îÓÐÓá£
´æ´¢¹ý³ÌÊÇÊý¾Ý¿âϵͳµÄÁíÒ»¸öÓÐÓõŦÄÜ¡£Ê¹Óô洢¹ý³Ì£¬Êý¾Ý¿â¿ÉʵÏÖ´æÔÚÓڸ߼¶±à³ÌÓïÑÔÖеŦÄÜ£¬±ÈÈç±äÁ¿¶¨Òå¡¢Ìõ¼þÉùÃ÷¡¢¿ØÖÆÓï¾äµÈ¡£DB2
ÖеĴ洢¹ý³ÌÊÇʹÓà DB2 SQL ¹ý³ÌÓïÑÔ (SQL PL) ±àдµÄ¡£SQL PL ÊÇ SQL ³Ö¾Ã´æ´¢Ä£¿éÓïÑÔ±ê×¼µÄÒ»¸ö×Ó¼¯¡£ÕâÏî±ê×¼½«Í¨¹ý
SQL ·ÃÎÊÊý¾ÝµÄ·½±ãÐÔÓë±à³ÌÓïÑÔµÄÁ÷¿ØÖƹ¦ÄÜÏà½áºÏ¡£
´æ´¢¹ý³ÌÖÐµÄ SQL Óï¾ä³£³£¾ßÓиü¸´ÔÓµÄÂß¼²¢Çҷdz£ÄÑÒÔµ÷ÊÔ»òµ÷½Ú£¬ÔÚһЩÇé¿öÏ£¬DB2
Ñ¡ÔñµÄ·ÃÎʼƻ®²¢²»ÊÇÄúÏëÒªµÄ£¬ÓÈÆäÊÇÔÚÓ¦ÓóÌÐòµ÷ÊÔÇéÐÎÏ¡£ÔÚʹÓÃËùÓÐ×î¼Ñʵ¼ùºó£¬Èç¹ûÄúÈÔÈ»ÎÞ·¨´Ó´æ´¢¹ý³Ì»ñµÃÏëÒªµÄÐÔÄÜ£¬¿ÉÒÔʹÓÃÓÅ»¯ÅäÖÃÎļþÀ´Ìṩ°ïÖú¡£´æ´¢¹ý³ÌÖеÄ
SQL Óï¾ä¿ÉÄÜÓëÆäËûµØ·½µÄ SQL Óï¾äÉÔ΢²»Í¬£¬ÒòΪËüÃdz£³£°üº¬Ò»Ð©ÊäÈ루Êä³ö£©±äÁ¿¡£µ±ÄúÏ£Íû¶ÔÕâЩÀàÐ͵ÄÓï¾äʹÓÃÓÅ»¯ÅäÖÃÎļþʱ£¬ÄúÐèÒª²ÉȡһЩ¶îÍâµÄ²½Öè²ÅÄܵõ½ÏëÒªµÄ½á¹û¡£±¾ÎĽ«Í¨¹ýÒ»¸öʾÀý£¬½éÉÜÈçºÎʹÓÃÓÅ»¯ÅäÖÃÎļþÐ޸Ĵ洢¹ý³ÌÖеÄ
SQL Óï¾äµÄÖ´Ðмƻ®¡£
ÓÅ»¯ÅäÖÃÎļþ¼ò½é
ÓÅ»¯ÅäÖÃÎļþÊÇÒ»¸ö XML Îĵµ£¬ÆäÖаüº¬Õë¶ÔÒ»¸ö»ò¶à¸öÊý¾Ý²Ù×÷ÓïÑÔ (DML)
Óï¾äµÄÓÅ»¯Ö¸ÄÏ¡£ÓÅ»¯ÅäÖÃÎļþ¿É°üº¬È«¾ÖÖ¸ÄÏ£¬ËüÃÇÊÊÓÃÓÚÔÚÅäÖÃÎļþÉúЧʱִÐеÄËùÓÐ DML Óï¾ä£¬ÓÅ»¯ÅäÖÃÎļþ»¹¿É°üº¬ÊÊÓÃÓÚÒ»¸ö°üÖи÷¸ö
DML Óï¾äµÄÌØ¶¨Ö¸ÄÏ¡£ÓÅ»¯ÅäÖÃÎļþ¿ÉÓÃÓÚÐÞ¸Ä SQL Óï¾äµÄ·ÃÎʼƻ®£¬µ«Õâ²¢²»Òâζ×ÅÄú¿ÉÒÔÈÎÒâΪһ¸öÓï¾äÖ¸¶¨·ÃÎʼƻ®¡£
ÄúÓ¦¸ÃÌØ±ð¹Ø×¢ÒÔÏÂÁ½¸öÎÊÌâ¡£
ÓÅ»¯ÀàÓÅÏÈÓÚÓÅ»¯ÅäÖÃÎļþ¡£Ò²¾ÍÊÇ˵£¬ÓÅ»¯Æ÷Ö»ÓÐÔÚÖ¸ÄÏ·ûºÏµ±Ç°ÓÅ»¯ÀàµÄ¹æÔòʱ£¬²ÅʹÓÃÕâЩָÄÏ¡£ÀýÈ磬Äú²»ÄÜÔÚÓÅ»¯¼¶±ð
0 ÉÏʹÓúϲ¢Á¬½Ó (merge join) »ò¹þÏ£Á¬½Ó (Hash-Join)¡£
Ö»ÓÐÔÚÓÅ»¯Ö¸ÄÏÊÇÓÅ»¯Æ÷ÆÀ¹ÀµÄÒ»Ïî¼Æ»®Ê±£¬²Å»áÌôÑ¡Ëü¡£Èç¹û³öÓÚijÖÖÔÒò£¬ÓÅ»¯Æ÷ûÓÐÆÀ¹ÀÓÅ»¯ÅäÖÃÎļþÖÐÖ¸¶¨µÄ¼Æ»®£¬Ëü½«²»»áʹÓøüƻ®¡£
ÓÅ»¯ÅäÖÃÎļþµÄ»ù±¾¸ñʽÈçÇåµ¥ 1 Ëùʾ¡£
Çåµ¥ 1. ÓÅ»¯ÅäÖÃÎļþµÄʾÀý
<?xml version="1.0" encoding="UTF-8"?> <OPTPROFILE VERSION="9.1.0.0"> <!-- Global optimization guidelines section. Optional but at most one. --> <OPTGUIDELINES> Here is for the global guidelines </OPTGUIDELINES>
<!-- Statement profile section. Zero or more.
-->
<STMTPROFILE ID="profile id">
<STMTKEY>
Here is for the statement that we want to apply
this statement level
optimization guidelines to
</STMTKEY>
<OPTGUIDELINES>
Here is for the optimization guidelines for the
statement defined in the
<STMTKEY> element
</OPTGUIDELINES>
</STMTPROFILE>
</OPTPROFILE> |
OPTPROFILE
ÓÅ»¯ÅäÖÃÎļþ´Ó OPTPROFILE ÔªËØ¿ªÊ¼¡£´ËÔªËØ°üº¬Ò»¸öÃûΪ VERSION µÄÊôÐÔ£¬ËüÖ¸¶¨±¾ÎļþÒª×ñÊØµÄ
XML ģʽ°æ±¾¡£Ò»¸öÓÅ»¯ÅäÖÃÎļþ±ØÐë°üº¬ÇÒ½öÄܰüº¬Ò»¸ö OPTPROFILE ÔªËØ¡£
È«¾ÖÓÅ»¯Ö¸ÄÏ
Ò»¸öÓÅ»¯ÅäÖÃÎļþ¿ÉÓµÓÐ×î¶à 1 ¸öÈ«¾ÖÓÅ»¯Ö¸ÄϽڡ£ÔÚÓÅ»¯ÅäÖÃÎļþÉúЧʱ£¬Ëü½«Ó¦ÓÃÓÚËùÖ´ÐеÄËùÓÐÓï¾ä¡£È«¾ÖÓÅ»¯Ö¸ÄÏÔÚ
OPTGUIDELINES ÔªËØÖж¨Òå¡£ÀýÈ磬Äú¿ÉÒÔÖ¸¶¨Ê¹ÓÃÄĸö MQT¡¢ÓÅ»¯¼¶±ð¡¢²éѯµÄ²¢·¢³Ì¶È£¬µÈµÈ¡£
Óï¾äÅäÖÃÎļþ½Ú
Ò»¸öÓÅ»¯ÅäÖÃÎļþ¿É°üº¬ 0 ¸ö»ò¶à¸öÓï¾äÅäÖÃÎļþ½Ú¡£ÔÚÓÅ»¯ÎļþÉúЧʱ£¬Ëü½«½öÓ¦Óõ½×¼È·Æ¥ÅäµÄ SQL
Óï¾ä¡£Óï¾äÓÅ»¯Ö¸ÄÏÔÚ STMTPROFILE ÔªËØÖж¨Òå¡£Ëü°üº¬Ò»¸ö STMTKEY ÔªËØºÍÒ»¸ö OPTGUIDELINES
ÔªËØ¡£
STMTKEY ÔªËØ¶¨ÒåÓï¾äÓÅ»¯Ö¸ÄϽ«Ó¦Óõ½µÄ SQL Óï¾ä¡£DB2 ʹÓà STMTKEY ÔªËØÖж¨ÒåµÄÄÚÈÝÀ´Æ¥Åä
SQL Óï¾ä¡£Èç¹ûÆ¥Åä³É¹¦£¬Óë´Ë STMTKEY Ïà¹ØµÄÓÅ»¯Ö¸ÄϽ«Ó¦Óõ½´Ë SQL Óï¾ä¡£ÔÚ STMTKEY
ÔªËØÄÚ¶¨ÒåµÄÓï¾ä±ØÐëÓëÒªÓ°Ïìµ½Æä·ÃÎʼƻ®µÄÓï¾ä׼ȷƥÅ䣬ÕâÖÖÆ¥ÅäÊÇÇø·Ö´óСдµÄ¡£ËüÔÊÐí¶àÓàµÄ¿Õ¸ñºÍ¿ØÖÆ×Ö·û£¬±ÈÈç»»ÐÐ×Ö·û¡£µ«ÊÇ£¬Ëü²»ÔÊÐíʹÓÃͨÅä·ûÀ´Æ¥ÅäÓï¾ä×顣ÿ¸öÐèÒªÊܵ½Ó°ÏìµÄÓï¾äÖ»Ó¦ÓÐÒ»¸ö¶ÀÁ¢µÄ
STMTPROFILE ½Ú¡£Èç¹ûÓжàÓÚÒ»¸öÓëÖ´ÐÐÓï¾äÆ¥ÅäµÄ STMTPROFILE£¬ÎÒÃǽ«½öÑ¡Ôñ²¢Ó¦ÓõÚÒ»¸ö¡£
ÔÚ OPTGUIDELINES ÔªËØÄÚ£¬Äú¿ÉÒÔÖ¸¶¨ DB2 ¶Ôij¸ö±íµÄ·ÃÎÊ·½·¨£¨±íɨÃè»òË÷ÒýɨÃ裩£¬ÐÞ¸ÄҪʹÓõÄÁ¬½Ó²Ù×÷ºÍÁ¬½Ó·½·¨µÄ˳Ðò£¬Ö¸¶¨²éÑ¯ÖØÐ´¹æÔò£¬µÈµÈ¡£µ±Ö´ÐеÄ
SQL Óï¾äÓë STMTKEY ÔªËØÖеÄÄÚÈÝ׼ȷƥÅäʱ£¬Ïà¹Ø OPTGUIDELINES ÔªËØÖеÄËùÓÐÓÅ»¯Ö¸ÄϽ«Ó¦ÓÃÓÚ´Ë
SQL Óï¾äµÄ·ÃÎʼƻ®µÄ´´½¨¡£
Ð޸Ĵ洢¹ý³ÌÖÐµÄ SQL Óï¾ä·ÃÎʼƻ®
ÔÚÒ»¸ö´æ´¢¹ý³ÌÄÚʹÓÃµÄ SQL Óï¾ä¿ÉÄܾßÓÐÌØÊâµÄÐÎʽ¡£ÀýÈ磬ËüÃdz£³£°üº¬Ò»Ð©ÊäÈ루Êä³ö£©±äÁ¿¡£ÕâÖÖ
SQL Óï¾ä¿ÉÖ±½Ó¹© STMTKEY ÔªËØÊ¹Óᣵ± DB2 ±àÒëÕâЩÓï¾äʱ£¬Ëü½«ÕâЩ±äÁ¿Ì滻ΪÄÚ²¿ÐÎʽ£¬È»ºóʹÓôËÄÚ²¿ÐÎʽ×÷Ϊ×îÖÕ°æ±¾¡£Èç¹ûʹÓÃ×î³õµÄ
SQL Óï¾ä×÷Ϊ STMTKEY£¬µ± DB2 ʹÓÃÄÚ²¿ÐÎʽ½øÐÐÆ¥Åäʱ£¬²»»á³É¹¦¡£ËùÒÔ£¬ÄúÐèÒªÊ×ÏÈÕÒµ½ÕâЩ
SQL Óï¾äµÄÄÚ²¿ÐÎʽ£¬È»ºóʹÓÃËüÃÇ×÷Ϊ STMTKEY À´´´½¨ÓÅ»¯ÅäÖÃÎļþ¡£ÒÔϸ÷½Ú½«½éÉÜËùÐèµÄ²½Öè¡£
²âÊÔ»·¾³
ÎÒÃÇΪ±¾ÎÄÖеIJâÊÔºÍʾÀýʹÓÃÒÔÏ»·¾³¡£
²Ù×÷ϵͳ£ºAIX 6.1
DB2 for Linux, UNIX, and Windows Version 9.7
Êý¾Ý¿â£ºSAMPLE Êý¾Ý¿â
±¾ÎÄÖеÄËùÓÐʾÀý¶¼»ùÓÚÔÚ AIX 6.1 ²Ù×÷ϵͳÉÏÔËÐÐµÄ DB2 V9.7¡£¶ÔÓÚÆäËû²Ù×÷ϵͳ£¬ÊµÏÖÓ¦¸ÃÏàͬ¡£
×¼±¸²âÊÔÊý¾Ý¿â
Èçͼ 1 Ëùʾ£¬SAMPLE Êý¾Ý¿âÊÇ DB2 ÌṩµÄÒ»¸öСÐÍÊý¾Ý¿â¡£Èç¹ûÔÚ°²×°ÆÚ¼äδ°²×°Ëü£¬Äú¿ÉÒÔÕÒµ½µ±Ç°ÊµÀýµÄ
sqllib/bin Ŀ¼£¬ÔËÐÐ db2sampl ÃüÁîÀ´×Ô¶¯´´½¨Ëü¡£

ͼ 1. ´´½¨²âÊÔÊý¾Ý¿â
´´½¨ËµÃ÷±í (Explain table)
ÄúÐèҪʹÓà DB2 Explain ¹¤¾ß²é¿´ÓÅ»¯Ö¸ÄÏÊÇ·ñÒÑÑ¡Ôñ£¬SQL Óï¾äµÄ·ÃÎʼƻ®ÊÇ·ñÒÑÐ޸ġ£Explain
¹¤¾ßµÄÊä³ö½«ÏÔʾÓÅ»¯ÅäÖÃÎļþµÄÃû³ÆºÍʹÓõÄÓÐЧָÄÏ¡£Òò´Ë£¬ÄúÐèÒª´´½¨ Explain ¹¤¾ßËùÐèµÄ±í¡£ÔÚĬÈÏÇé¿öÏ£¬DB2
²»»á´´½¨ÕâЩ±í¡£
ÈçÇåµ¥ 2 Ëùʾ£¬´Óµ±Ç°ÊµÀýËùÓÐÕßµÄ sqllib/misc Ŀ¼£¬Ö´ÐÐÎļþ EXPLAIN.DDL
À´Íê³ÉËùÓÐ Explain ±íµÄ´´½¨¹¤×÷¡£
Çåµ¥ 2. ´´½¨ Explain ±íµÄ½Å±¾
db2 connect sample db2 -tvf EXPLAIN.DDL db2 connect reset |
ÔËÐÐÇ°ÃæµÄÃüÁîºó£¬ÖØÐÂÁ¬½ÓÊý¾Ý¿â²¢ÔËÐÐ db2 list tables¡£Äú¿ÉÒÔÔÚϵͳĿ¼Öп´µ½ËùÓоßÓÐ
EXPLAIN ǰ׺µÄд´½¨µÄ±í£¬Èçͼ 2 Ëùʾ¡£ËùÓÐÕâЩ±íÓÉ Explain ¹¤¾ßÓÃÓÚ´æ´¢ÐÅÏ¢¡£

ͼ 2. д´½¨µÄ Explain ±í
´´½¨ SYSTOOLS.OPT_PROFILE ±í
ÈçÇåµ¥ 3 Ëùʾ£¬Äú¶¨ÒåµÄËùÓÐÓÅ»¯ÅäÖÃÎļþ½«´æ´¢ÔÚģʽ SYSTOOLS Ï嵀 OPT_PROFILE
±íÖС£Ä¬ÈÏÇé¿öÏ£¬DB2 ²»»á´´½¨´Ë±í¡£Èç¹ûÄúÏ£ÍûʹÓÃÓÅ»¯ÅäÖÃÎļþÀ´ÐÞ¸Ä SQL Óï¾äµÄ·ÃÎʼƻ®£¬ÄúÐèÒª×ÔÐд´½¨Ëü¡£
Çåµ¥ 3. ´´½¨ SYSTOOLS.OPT_PROFILE ±íµÄ SQL
CREATE TABLE SYSTOOLS.OPT_PROFILE ( SCHEMA VARCHAR(128) NOT NULL, NAME VARCHAR(128) NOT NULL, PROFILE BLOB (2M) NOT NULL, PRIMARY KEY ( SCHEMA, NAME ) ); |
´Ë±íÖаüº¬ÒÔÏ 3 ÁС£
ÁÐ SCHEMA Ö¸ÓÅ»¯ÅäÖÃÎļþµÄģʽÃû³Æ¡£
ÁÐ NAME Ö¸ÓÅ»¯ÅäÖÃÎļþµÄÃû³Æ¡£
ÁÐ PROFILE ´æ´¢ÓÅ»¯ÅäÖÃÎļþµÄÄÚÈÝ¡£
SCHEMA.NAME ¿ÉÓÃÓÚΩһ±êʶÊý¾Ý¿âÖеÄÒ»¸öÓÅ»¯ÅäÖÃÎļþ¡£ÈçÇåµ¥ 4 ÖÐËùʾ£¬½«Ö®Ç°µÄ½Å±¾±£´æµ½Îļþ
SYSTOOLS.OPT_PROFILE.DDL Öв¢ÖØÐÂÁ¬½ÓÊý¾Ý¿â¡£
Çåµ¥ 4. ´´½¨ SYSTOOLS.OPT_PROFILE ±íµÄ½Å±¾
db2 connect to sample db2 -tvf SYSTOOLS.OPT_PROFILE.DDL db2 connect reset |
ÔËÐнű¾ºó£¬Äú½«Íê³É´Ë±íµÄ´´½¨¹¤×÷£¬Èçͼ 3 Ëùʾ¡£

ͼ 3. ´´½¨ SYSTOOLS.OPT_PROFILE ±í
´´½¨´æ´¢¹ý³Ì
¹ØÓÚ´æ´¢¹ý³ÌµÄÏêϸÓï·¨£¬Äú¿ÉÒÔ²ÎÔÄ IBM DB2 9.7 ÐÅÏ¢ÖÐÐÄÖÐµÄ ¡°´æ´¢¹ý³Ì¡± Ò»½Ú£¬Çë²ÎÔÄ
²Î¿¼×ÊÁÏ Ò»½Ú¡£ÈçÇåµ¥ 5 Ëùʾ£¬Äú½«´´½¨Ò»¸öÃûΪ GET_EMP_NUM µÄ¼òµ¥´æ´¢¹ý³ÌÀ´Íê³ÉËùÓÐʾÀý¡£´Ë´æ´¢¹ý³ÌʹÓÃÑùÀýÊý¾Ý¿âÖеÄ
DEPARTMENT ±íºÍ EMPLOYEE ±í¡£ËüÓÐÁ½¸ö²ÎÊý£¬Ò»¸öÃûΪ DEPT_NO£¨²¿ÃÅ ID£©µÄÊäÈë²ÎÊýºÍÒ»¸öÃûΪ
EMP_NUM£¨´Ë²¿ÃÅÖеÄÔ±¹¤Êý£©µÄÊä³ö²ÎÊý¡£´Ë´æ´¢¹ý³ÌµÄ¹¦ÄÜÊÇ»ùÓÚÓû§ÊäÈëµÄ²¿ÃÅ ID£¬¼ÆËãÒ»¸ö²¿ÃÅÖеÄÔ±¹¤Êý¡£
Çåµ¥ 5. ¶¨Òå´æ´¢¹ý³ÌµÄ½Å±¾
CONNECT TO SAMPLE%
CALL SYSPROC.SET_ROUTINE_OPTS('EXPLAIN ALL')%
CREATE PROCEDURE GET_EMP_NUM(
IN DEPT_NO CHAR(50),
OUT EMP_NUM INTEGER)
LANGUAGE SQL
BEGIN
SELECT COUNT(*) INTO EMP_NUM
FROM DEPARTMENT, EMPLOYEE
WHERE DEPARTMENT.DEPTNO = EMPLOYEE.WORKDEPT
AND DEPARTMENT.DEPTNAME = DEPT_NO;
END%
CONNECT RESET% |
µ÷Óà SYSPROC.SET_ROUTINE_OPTS ´æ´¢¹ý³ÌÀ´ÉèÖÃÔ¤±àÒëºÍ°ó¶¨Ñ¡ÏȻºóÔÙ¶¨Òå GET_EMP_NUM
´æ´¢¹ý³Ì¡£ÄúÒ²¿ÉÒÔÐÞ¸Ä DB2_SQLROUTINE_PREPOPTS ×¢²á±í±äÁ¿À´ÊµÏÖÏàͬ¹¦ÄÜ¡£Èç¹ûµ÷ÓÃ
SYSPROC.SET_ROUTINE_OPTS ´æ´¢¹ý³Ì£¬Ëü½«¸²¸Ç´Ë×¢²á±í±äÁ¿µÄÖµ¡£ÔÚÕâÀォ²ÎÊý EXPLAIN
ALL µÄÖµ´«µÝ¸ø SYSPROC.SET_ROUTINE_OPT ´æ´¢¹ý³Ì¡£Ëü±íÃ÷ÔÚ´´½¨´æ´¢¹ý³ÌÆÚ¼ä£¬ÆäÖеÄËùÓÐ
SQL Óï¾äµÄ·ÃÎʼƻ®½«±£´æÔÚ Explain ±íÖС£
½«Ö®Ç°µÄ½Å±¾±£´æµ½Îļþ create_procedure.ddl ÖУ¬ÈçÇåµ¥ 6 Ëùʾ£¬È»ºóÔËÐÐͼ 4
ÖÐËùʾµÄÃüÁîÀ´Íê³É´æ´¢¹ý³ÌµÄ´´½¨¹¤×÷¡£Çë×¢Ò⣬ÄúÓ¦¸ÃÊ×ÏÈÔÚÕâÁ½¸ö±íÉÏÖ´ÐÐ RUNSTATS£¬È»ºóÔÙ´´½¨´æ´¢¹ý³Ì£¬ÒÔ±ã
DB2 ½«Ê¹ÓÃ×îеÄͳ¼ÆÐÅÏ¢À´Éú³É¸üÓÐЧµÄ·ÃÎʼƻ®¡£
Çåµ¥ 6. ´´½¨´æ´¢¹ý³ÌµÄ½Å±¾
db2 connect to sample db2 'runstats on table db2inst1.department and indexes all' db2 'runstats on table db2inst1.employee and indexes all' db2 connect to reset db2 -td% -vf create_procedure.ddl |

ͼ 4. ´´½¨ GET_EMP_NUM ´æ´¢¹ý³Ì
²é¿´ÔÚ´æ´¢¹ý³ÌÖж¨Òå SQL Óï¾äµÄÄÚ²¿ÐÎʽ
¶ÔÓÚÔÚ´æ´¢¹ý³ÌÖж¨ÒåµÄÕâЩ SQL Óï¾ä£¬DB2 ½«ÊäÈ루Êä³ö£©±äÁ¿Ì滻ΪËüµÄÄÚ²¿ÐÎʽ¡£Äú¿ÉʹÓÃÇåµ¥
7 ÖÐËùʾµÄ SQL Óï¾ä²é¿´ÕâЩÓï¾äµÄÄÚ²¿ÐÎʽ¡£
Çåµ¥ 7. ²é¿´ÔÚ´æ´¢¹ý³ÌÖж¨ÒåµÄ SQL Óï¾äµÄÄÚ²¿ÐÎʽµÄ SQL
SELECT PKGNAME, S.TEXT FROM SYSCAT.STATEMENTS AS S, SYSCAT.ROUTINEDEP AS D, SYSCAT.ROUTINES AS R WHERE PKGSCHEMA = BSCHEMA AND PKGNAME = BNAME AND BTYPE = 'K' AND R.SPECIFICNAME = D.SPECIFICNAME AND R.ROUTINESCHEMA = D.ROUTINESCHEMA AND R.ROUTINENAME = 'GET_EMP_NUM' AND R.ROUTINESCHEMA = 'DB2INST1' ORDER BY STMTNO; |
ÄúÓ¦¸Ã½« R.ROUTINESCHEMA µÄÖµÌæ»»ÎªÄúʹÓõĴ洢¹ý³ÌµÄģʽÃû£¨ÔÚ±¾ÀýÖÐΪ DB2INST1£©£¬²¢½«
R.ROUTINENAME µÄÖµÌæ»»Îª´æ´¢¹ý³ÌµÄÃû³Æ£¨ÔÚ±¾ÀýÖÐΪ GET_EMP_NUM£©¡£ÔÚÕâÖ®ºó£¬½«½Å±¾±£´æµ½Îļþ
get_routine_sqls.sql ÖУ¬Á¬½ÓÊý¾Ý¿âÀ´Ö´Ðиýű¾£¬ÈçÇåµ¥ 8 Ëùʾ¡£
Çåµ¥ 8. ²é¿´´æ´¢¹ý³ÌÖж¨ÒåµÄ SQL Óï¾äµÄÄÚ²¿ÐÎʽµÄ½Å±¾
db2 connect to sample db2 -tvf get_routine_sqls.sql db2 connect reset |
ÉÏÊö SQL Óï¾äµÄÊä³ö°üº¬Á½ÁС£Ò»ÁÐÊÇÓë´æ´¢¹ý³ÌÏà¹ØµÄ°üÃû³Æ£¬ÁíÒ»ÁÐÊÇ SQL Óï¾äµÄÄÚ²¿ÐÎʽ¡£ÔËÐиýű¾Ö®ºó£¬Êä³öÈçͼ
5 Ëùʾ¡£

ͼ 5. ²éѯ´æ´¢¹ý³ÌÖж¨ÒåµÄ SQL Óï¾äµÄÄÚ²¿ÐÎʽ
Äú¿ÉÒÔ¿´µ½£¬Êä³ö²ÎÊý EMP_NUM ÒÑÌæ»»Îª :HV00009 :HI00009£¬ÊäÈë²ÎÊý DEPT_NO
ÒÑÌæ»»Îª :HV00008 :HI00008¡£ËüÓë֮ǰÔÚ´æ´¢¹ý³ÌÖж¨ÒåµÄ SQL Óï¾äÓкܴó²»Í¬¡£ÒòΪÕâ¸öÐÂÐÎʽÊÇ
DB2 ÔÚ±àÒëʱºÍÖ´ÐÐʱ½«Ö´ÐеÄÐÎʽ£¬ËùÒÔÕâÊÇÄú½«ÔÚ STMTKEY ÔªËØÖÐʹÓõÄÐÎʽ¡£´ËÍ⣬¸Ã½á¹ûµÄµÚÒ»ÁÐÊÇÓë´Ë´æ´¢¹ý³ÌÏà¹ØµÄ°üÃû³Æ£¨ÔÚ±¾ÀýÖУ¬ËüΪ
P1513856£©¡£ÄúÐèÒªÔÚÉÔºóµÄ²éѯÖÐʹÓôËÐÅÏ¢¼ìË÷´Ë´æ´¢¹ý³ÌµÄ·ÃÎʼƻ®¡£
²é¿´Ä¬ÈÏ·ÃÎʼƻ®
ҪȷÈϸÃÓÅ»¯ÅäÖÃÎļþ½«ÐÞ¸Ä DB2 µÄĬÈÏ·ÃÎʼƻ®£¬ÄúÐèÒªÊ×ÏÈ»ñµÃ SQL Óï¾äµ±Ç°µÄ·ÃÎʼƻ®¡£Ê¹ÓÃ
db2exfmt ¹¤¾ß£¬¨Cn Ñ¡ÏîÓë°üÃû³ÆÏà¹Ø¡£¹ØÓڴ˹¤¾ßµÄÿ¸öÑ¡ÏîµÄÏêϸÐÅÏ¢£¬Äú¿ÉÒÔ²ÎÔÄ IBM DB2
9.7 ÐÅÏ¢ÖÐÐÄÖеÄÏà¹Ø²¿·Ö£¬Çë²ÎÔÄ ²Î¿¼×ÊÁÏ Ò»½Ú¡£ÈçÇåµ¥ 9 ºÍͼ 6 Ëùʾ£¬Äú½«Ôʼ·ÃÎʼƻ®±£´æÔÚÎļþ
orig_plan.out ÖС£
Çåµ¥ 9. ²é¿´ SQL Óï¾äµÄÔʼ·ÃÎʼƻ®µÄ½Å±¾
db2exfmt -d sample -e db2inst1 -g -l -n 'P1513856' -s db2inst1 -o orig_plan.out -w -1 -# 0 -v % |

ͼ 6. Ôʼ·ÃÎʼƻ®
´ÓÒÔǰµÄ·ÃÎʼƻ®£¬Äú¿ÉÒÔ¿´µ½ DB2 ĬÈÏÑ¡ÔñÁËÒ»¸öǶÌ×µÄÑ»·Á¬½ÓÀ´Ö´ÐдËÓï¾ä¡£ÌôÑ¡ÁË DEPARTMENT
×÷ΪÍⲿ±í£¨Ê¹ÓñíɨÃè·½·¨£©£¬ÌôÑ¡ EMPLOYEE ×÷ΪÄÚ²¿±í£¨Ê¹ÓÃË÷ÒýɨÃè·½·¨£¬XEMP2 ÊDZí EMPLOYEE
µÄÒ»¸öË÷Òý£©¡£ÔÚÒÔÏÂʾÀýÖУ¬Äú½«Ê¹ÓÃÓÅ»¯ÅäÖÃÎļþÐÞ¸ÄÕâ¸öÁ¬½ÓÐòÁУ¨Èà EMPLOYEE ³ÉΪÍⲿ±í£¬ÈÃ
DEPARTMENT ³ÉΪÄÚ²¿±í£©¡£ÕâÑù×öµÄÄ¿µÄ²»ÊÇʵÏÖ¸ü¸ßµÄÐÔÄÜ£¬Ö»ÊÇΪÁ˱íÃ÷ÓÅ»¯ÅäÖÃÎļþÒÑÓ¦ÓÃÓÚ SQL
Óï¾ä¡£
´´½¨ÓÅ»¯ÅäÖÃÎļþ
ÈçÇåµ¥ 10 Ëùʾ£¬Ê¹Óô洢¹ý³ÌÖж¨ÒåµÄ SQL Óï¾äµÄÄÚ²¿ÐÎʽ´´½¨ÓÅ»¯ÅäÖÃÎļþ¡£
Çåµ¥ 10. ÓÅ»¯ÅäÖÃÎļþµÄ½Å±¾
<?xml version='1.0' encoding='UTF-8'?> <OPTPROFILE VERSION='9.1.0.0'> <STMTPROFILE ID='example profile'> <STMTKEY> <![CDATA[SELECT COUNT(*) INTO :HV00009 :HI00009 FROM DEPARTMENT, EMPLOYEE WHERE DEPARTMENT.DEPTNO = EMPLOYEE.WORKDEPT AND DEPARTMENT.DEPTNAME = :HV00008 :HI00008]]> </STMTKEY> <OPTGUIDELINES> <NLJOIN> <ACCESS TABLE='EMPLOYEE'/> <ACCESS TABLE='DEPARTMENT'/> </NLJOIN> </OPTGUIDELINES> </STMTPROFILE> </OPTPROFILE> |
ÔÚÉÏÒ»¸ö½Å±¾ÖУ¬Ò»¶¨ÒªÌرð×¢ÒâÒÔϼ¸µã¡£
STMTPROFILE ÔªËØµÄ ID ÊôÐÔ£ºID ÊôÐÔµÄÖµÊÇ´ËÓÅ»¯ÅäÖÃÎļþÖÐÕâ¸öÓï¾ä¼¶ÓÅ»¯Ö¸ÄϵÄΩһ±êʶ·û¡£Èç¹û½«´ËÓÅ»¯Ö¸ÄÏÓ¦ÓÃÓÚijÌõ
SQL Óï¾ä£¬Äú¿ÉÒÔ´ÓÓï¾äµÄ·ÃÎʼƻ®Öп´µ½´Ë±êʶ·û¡£
STMTKEY ÔªËØ£ºÄú±ØÐëʹÓà SQL Óï¾äµÄÄÚ²¿ÐÎʽ×÷Ϊ STMTKEY£¬·ñÔòËüÎÞ·¨³É¹¦Æ¥Å䡣ͨ³££¬ÄúʼÖÕʹÓÃ
<![CDATA[]]> °ü×°Óï¾ä¡£
NLJOIN ÔªËØ£º´ËÔªËØÖ¸¶¨Á¬½ÓµÄ˳Ðò¡£ÕâÀÄúʹÓà EMPLOYEE ×÷ΪÍⲿ±í£¬Ê¹Óà DEPARTMENT
×÷ΪÄÚ²¿±í¡£
½«ÓÅ»¯ÅäÖÃÎļþ²åÈëÊý¾Ý¿âÖÐ
¶¨ÒåÓÅ»¯ÅäÖÃÎļþÖ®ºó£¬½«Ëü±£´æµ½Îļþ test_profile.prof ÖС£È»ºó½«´ËÊý¾Ý¼ÓÔØµ½±í SYSTOOLS.OPT_PROFILE
ÖУ¬½Ó×ÅÔÙʹÓõ¼ÈëÃüÁîÍê³É´Ë²Ù×÷¡£
Ê×ÏÈ£¬Ê¹ÓÃÃû³Æ profile_file.load ¶¨Òåµ¼ÈëµÄÊý¾ÝÔ´Îļþ¡£ÈçÇåµ¥ 11 Ëùʾ£¬´ËÎļþÖ¸¶¨ÓÅ»¯ÅäÖÃÎļþµÄģʽÃû³ÆÎª
Test£¬ÓÅ»¯ÅäÖÃÎļþµÄÃû³ÆÎª OPTPROF£¬ÓÅ»¯ÅäÖÃÎļþµÄÏêϸÄÚÈݰüº¬ÔÚ test_profile.prof
ÎļþÖС£
Çåµ¥ 11. µ¼ÈëµÄÊý¾ÝÔ´Îļþ
"TEST","OPTPROF","test_profile.prof" |
È»ºóÔËÐе¼ÈëÃüÁÈçÇåµ¥ 12 ºÍͼ 7 Ëùʾ£©½«Êý¾Ý¼ÓÔØµ½Êý¾Ý¿âÖС£
Çåµ¥ 12. µ¼ÈëÃüÁîµÄ½Å±¾
db2 "IMPORT FROM profile_file.load OF DEL MODIFIED BY LOBSINFILE INSERT_UPDATE INTO SYSTOOLS.OPT_PROFILE" |

ͼ 7. µ¼ÈëÃüÁî
Ð޸Ĵ洢¹ý³ÌµÄ¶¨ÒåÎļþÒÔʹÓôËÓÅ»¯ÅäÖÃÎļþ
Èç¹ûÄúÏ£ÍûÔÚ´æ´¢¹ý³ÌÖÐʹÓÃÓÅ»¯ÅäÖÃÎļþ£¬³ýÁËÉèÖÃÇ°ÃæµÄ×¢²á±í±äÁ¿À´ÆôÓô˹¦ÄÜ£¬Äú»¹ÐèÒªµ÷Óà SYSPROC.SET_ROUTINE_OPTS
ϵͳ´æ´¢¹ý³ÌÀ´ÉèÖÃģʽÃû³Æ£¬È»ºóÉèÖý«ÔÚÔ¤±àÒëºÍ°ó¶¨Ê±Ê¹ÓõÄÓÅ»¯ÅäÖÃÎļþµÄÃû³Æ£¬ÈçÇåµ¥ 13 Ëùʾ¡£ÄúÐèÒªÔÚ
SYSPROC.SET_ROUTINE_OPTS ²ÎÊýÖÐÖ¸¶¨ OPTPROFILE Ñ¡ÏËüµÄֵΪ TEST.OPTPROF¡£ËùÒÔÄúÒÔǰ¶¨ÒåµÄÓÅ»¯ÅäÖÃÎļþ½«ÔÚΪ´Ë´æ´¢¹ý³ÌÖеÄ
SQL Óï¾ä´´½¨·ÃÎʼƻ®Ê±Ê¹Óᣵ±È»£¬Äú¿ÉÒÔÉèÖà DB2_SQLROUTINE_PREPOPTS ×¢²á±í±äÁ¿»ñµÃÏàͬµÄ½á¹û¡£
Çåµ¥ 13. Ð޸ĵĴ洢¹ý³Ì
CONNECT TO SAMPLE%
CALL SYSPROC.SET_ROUTINE_OPTS('EXPLAIN ALL OPTPROFILE
TEST.OPTPROF')%
CREATE PROCEDURE GET_EMP_NUM(
IN DEPT_NO CHAR(50),
OUT EMP_NUM INTEGER)
LANGUAGE SQL
BEGIN
SELECT COUNT(*) INTO EMP_NUM
FROM DEPARTMENT, EMPLOYEE
WHERE DEPARTMENT.DEPTNO = EMPLOYEE.WORKDEPT
AND DEPARTMENT.DEPTNAME = DEPT_NO;
END%
CONNECT RESET% |
ÈçÇåµ¥ 14 Ëùʾ£¬¶ªÆúÒÑ´´½¨µÄ´æ´¢¹ý³Ì£¬È»ºóÖØÐ´´½¨Ëü¡£
Çåµ¥ 14. ÖØÐ´´½¨´æ´¢¹ý³Ì
db2 connect to sample db2 drop procedure GET_EMP_NUM db2 -td% -vf create_procedure.ddl |
²é¿´Ð·ÃÎʼƻ®ÒÔ¼ì²éÒÑʹÓÃÁËÓÅ»¯ÅäÖÃÎļþ
Òª¼ì²éÓÅ»¯ÅäÖÃÎļþÊÇ·ñÒѳɹ¦Ê¹Óã¬ÄúÐèÒª¶Ô±ÈÔʼ·ÃÎʼƻ®ÓëзÃÎʼƻ®¡£
Ê×ÏÈ£¬ÒòΪ´æ´¢¹ý³ÌÒÑÖØÐ´´½¨£¬DB2 ½«ÎªËü·ÖÅäÒ»¸öаü¡£ÔËÐÐÇåµ¥ 15 ºÍͼ 8 ÖÐËùʾµÄÃüÁ»ñµÃ´Ë´æ´¢¹ý³ÌµÄÏà¹ØµÄ°üÃû³Æ¡£
Çåµ¥ 15. »ñµÃ´æ´¢¹ý³ÌµÄ°üÃû³Æ
db2 connect to sample db2 -tvf get_routine_sqls.sql |

ͼ 8. ÖØÐ´´½¨µÄ´æ´¢¹ý³ÌµÄаüÃû³Æ
È»ºóʹÓÃÇ°ÃæµÄ°üÃû³Æ²é¿´´æ´¢¹ý³ÌµÄзÃÎʼƻ®£¬½«½á¹û±£´æÔÚÎļþ curr_plan.out ÖУ¬ÈçÇåµ¥
16 Ëùʾ¡£
Çåµ¥ 16. »ñµÃзÃÎʼƻ®
db2exfmt -d sample -e db2inst1 -g -l -n 'P2270199' -s db2inst1 -o curr_plan.out -w -1 -# 0 -v % |
´ÓзÃÎʼƻ®£¬Äú¿ÉÒÔ¿´µ½ÓÐÒ»¸ö¸½¼ÓµÄ Profile Information ²¿·Ö£¬Èçͼ 9 Ëùʾ¡£Ëü°üº¬Ä£Ê½Ãû³Æ£¬ÓÃÓÚÉú³É´Ë
SQL Óï¾äµÄ·ÃÎʼƻ®µÄÓÅ»¯ÅäÖÃÎļþ£¨ÔÚ±¾ÀýÖÐΪ TEST.OPTPROF£©£¬ÒÔ¼°Óë¸ÃÓï¾äÆ¥ÅäµÄÓï¾ä¼¶ÓÅ»¯Ö¸ÄϵÄ
ID¡£Õâ¸ö ID ÔÚ¶¨ÒåÓÅ»¯ÅäÖÃÎļþʱָ¶¨¡£

ͼ 9. stored procedure_1 µÄзÃÎʼƻ®
Óë´Ëͬʱ£¬´ÓзÃÎʼƻ®ÖУ¬Äú¿ÉÒÔ¿´µ½Á¬½ÓµÄ˳ÐòÒѸı䣬Èçͼ 10 Ëùʾ¡£ÏÖÔÚ£¬Íⲿ±íΪ EMPLOYEE
±í£¬ÄÚ²¿±íΪ DEPARTMENT ±í¡£ËùÒÔÄú¿ÉÒÔÖ¤Ã÷£¬ÓÅ»¯ÅäÖÃÎļþÒÑÓÃÀ´³É¹¦Éú³ÉÁË´æ´¢¹ý³ÌÖÐµÄ SQL
Óï¾äµÄ·ÃÎʼƻ®¡£

ͼ 10. stored procedure_2 µÄзÃÎʼƻ®
½áÊøÓï
´æ´¢¹ý³ÌÊÇ DB2 µÄÒ»Ïî·Ç³£ÓÐÓõŦÄÜ¡£Ò»¸ö´æ´¢¹ý³ÌÖж¨ÒåµÄ SQL Óï¾äͨ³£·Ç³£¸´ÔÓ£¬²¢ÇÒÄÑÒÔµ÷ÊԺ͵÷½Ú¡£ÔÚһЩÇéÐÎÏ£¬DB2
Ñ¡ÔñµÄ·ÃÎʼƻ®¿ÉÄܲ»ÊÇÄúÏëҪʹÓõģ¬ÓÈÆäÊǵ±µ÷ÊÔÐÔÄÜÎÊÌâʱ¡£Í¨¹ýʹÓÃÓÅ»¯ÅäÖÃÎļþ£¬Äú¿ÉÒÔÓ°Ïì SQL Óï¾äµÄ·ÃÎʼƻ®£¬¶øÎÞÐè¸ü¸ÄÓ¦ÓóÌÐòºÍÊý¾Ý¿âÉèÖá£ËüÊÇÒ»¸öµ÷ÊÔÓ¦ÓóÌÐòºÍÓÅ»¯
SQL µÄ·Ç³£ÓÐЧµÄ¹¤¾ß¡£
|