Oracle SQLÔËÐÐʱ¼äµÄ×îÖ÷ÒªµÄ×é³É²¿·ÖÊÇ»¨ÔÚΪִÐÐ×¼±¸ÐµÄSQLÓï¾äÉϵÄʱ¼ä¡£²»¹ý£¬Èç¹ûÁ˽âÁË¿ÉÖ´Ðмƻ®²úÉúµÄÄÚÔÚ»úÖÆ£¬Äã¾Í¿ÉÒÔ¿ØÖÆOracle»¨·ÑÔÚÆÀ¹À±íµÄÁ¬½Ó˳ÐòµÄʱ¼ä£¬²¢ÔÚ×ÜÌåÉÏÌá¸ß²éѯµÄÐÔÄÜ¡£
×¼±¸ÎªÖ´ÐÐÌṩµÄSQLÓï¾ä
ÔÚÒ»¸öSQLÓï¾ä½øÈëOracle¿âµÄcacheÖ®ºó¡¢¶øÕæÕý±»Ö´ÐÐ֮ǰ£¬½«»áÒÀ´Î·¢ÉúÈçÏÂʼþ£º
Óï·¨¼ì²é----¼ì²é¸ÃSQLÓï¾äµÄƴдºÍ´ÊÐòÊÇ·ñÕýÈ·¡£
ÓïÒå½âÎö----Oracle¸ù¾ÝÊý¾Ý´Êµä£¨data dictionary£©À´ÑéÖ¤ËùÓеıí¸ñ£¨table£©ºÍÁУ¨column£©¡£
Òѱ£´æ¸ÙÒª¼ì²é----Oracle¼ì²é´ÊµäÒÔÈ·È϶ÔÓ¦¸ÃSQLÓï¾äÊÇ·ñÒÑ´æÔÚÒѱ£´æµÄ¸ÙÒª£¨Stored Outline£©¡£
²úÉúÖ´Ðмƻ®----Oracle¸ù¾ÝÒ»ÖÖ·£Öµ£¨cost-based£©ÓÅ»¯Ëã·¨ºÍÊý¾Ý´ÊµäÖеÄͳ¼ÆÊý¾ÝÀ´¾ö¶¨ÈçºÎÉú³É×îÓÅÖ´Ðмƻ®¡£
²úÉú¶þ½øÖÆ´úÂë----OracleÔÚÖ´Ðмƻ®µÄ»ù´¡ÉÏÉú³É¿ÉÖ´ÐеĶþ½øÖÆ´úÂë¡£
Ò»µ©¿ªÊ¼×¼±¸Ö´ÐÐSQLÓï¾ä£¬ÉÏÊöµÄ¹ý³ÌºÜ¿ì¾Í»áÖ´ÐУ¬ÕâÊÇÒòΪOracle¿ÉÒÔʶ±ð³öͬÑùµÄSQLÓï¾ä²¢¶ÔͬÑùµÄSQLÓï¾äÖظ´Ê¹ÓöÔÓ¦µÄ¿ÉÖ´ÐдúÂ롣Ȼ¶ø£¬¶Ô²úÉúad hoc SQLµÄϵͳÒÔ¼°SQLÖÐǶÈëÎı¾Öµ£¨literal value£©µÄÇé¿ö£¬SQLÖ´Ðмƻ®µÄÉú³Éʱ¼ä¾Í»á±äµÃÏ൱³¤£¬¶øÇÒÒÔÇ°µÄÖ´Ðмƻ®Ò²³£³£²»Äܱ»ÔÙ´ÎÀûÓ᣶ÔÄÇЩǣÉæµ½Ðí¶à±í¸ñµÄ²éѯ£¬Oracle¿ÉÄÜÒª»¨ÉϺܳ¤µÄʱ¼äÀ´¾ö¶¨°ÑÁ¬½ÓÕâЩ±í¸ñµÄ˳Ðò¡£
ÆÀ¹ÀÁ¬½Ó±í¸ñµÄ˳Ðò
Éú³É¿ÉÖ´Ðмƻ®µÄʱ¼äÍùÍùÊÇSQLµÄ×¼±¸¹ý³ÌÖÐ×î´óµÄ¿ªÏú×é³É²¿·Ö£¬ÓÈÆäÊÇÔÚ´¦ÀíÓжà¸ö±íµÄÁ¬½ÓµÄ²éѯµÄÇé¿öÏ¡£µ±OracleÆÀ¹À±íµÄÁ¬½Ó˳Ðòʱ£¬Ëü±ØÐ뿼ÂÇÿһÖÖ¿ÉÄܵÄÅÅÐò¡£ÀýÈ磬µ±ÓÐÁù¸ö±í¸ñÐèÒªÁ¬½Óʱ£¬OracleÐèÒª¿¼ÂÇ720ÖÖ£¨6µÄÅÅÁÐÊý£¬¼´6¡Á5¡Á4¡Á3¡Á2¡Á1£½720£©¿ÉÄܵÄÁ¬½ÓÅÅÐò¡£µ±ÐèÒªÁ¬½ÓµÄ±íµÄÊýÁ¿³¬¹ý10ʱ£¬Õâ¸öÅÅÁÐÎÊÌ⽫±äµÃ·Ç³£Í»³ö£ºÈç¹ûÐèÒªÁ¬½ÓµÄ±í¸ñÓÐ15¸ö£¬ÄÇôÐèÒª¿¼ÂǵĿÉÄܵIJéѯÅÅÁÐ˳Ðò³¬¹ýÒ»ÍòÒÚÖÖ£¨¾«È·ÖµÎª1,307,674,368,000£©¡£
ÔÚoptimizer_search_limit²ÎÊýÖÐÉèÖÃÏÞÖÆ
Äã¿ÉÒÔͨ¹ýoptimizer_search_limit²ÎÊýÀ´¿ØÖÆÉÏÊöÎÊÌâµÄ·¢Éú£¬¸Ã²ÎÊýÓÃÀ´Ö¸¶¨ÓÅ»¯Æ÷ÆÀ¹ÀµÄ±í¸ñÁ¬½Ó˳ÐòµÄ×î´óÊýÄ¿¡£ÀûÓÃÕâ¸ö²ÎÊý£¬¾Í¿ÉÒÔ·ÀÖ¹ÓÅ»¯Æ÷ÔÚÆÀ¹ÀËùÓпÉÄܵıí¸ñÁ¬½Ó˳ÐòÖÐËù»¨·ÑµÄ¶àÓàʱ¼ä¡£Èç¹û²éѯÖеıíµÄÊýÁ¿ÉÙÓÚ»òÕßµÈÓÚoptimizer_search_limit£¬ÄÇôÓÅ»¯Æ÷¼ì²éËùÓеĿÉÄܱíµÄÁ¬½Ó·½Ê½¡£
ÀýÈ磬Éæ¼°ÁËÎå¸ö±íµÄ²éѯһ¹²ÓÐ120ÖÖ(5£¡£½5¡Á4¡Á3¡Á2¡Á1£½120)¿ÉÄܵÄÁ¬½Ó˳Ðò£¬ËùÒÔÈç¹û²ÎÊýoptimizer_search_limitµÄÖµÉèÖÃΪ5£¨Ä¬ÈÏÖµ£©£¬ÄÇôÓÅ»¯Æ÷¾Í»á¿¼ÂÇËùÓеÄÕâ120ÖÖ¿ÉÄܵÄÁ¬½Ó˳Ðò¡£optimizer_search_limit²ÎÊý»¹ÓÃÀ´¿ØÖÆÆô¶¯¿ªÊ¼Á¬½Óָʾ£¨star join hint£©µÄãÐÖµ¡£µ±²éѯËùÉæ¼°µÄ±í¸ñÊýÁ¿ÉÙÓÚ²ÎÊýoptimizer_search_limitµÄÉ趨ֵ£¬¿ªÊ¼Á¬½Óָʾ½«±»ÉèÖá£
ÁíÒ»¸ö¹¤¾ß£ºoptimizer_max_permutations²ÎÊý
optimizer_max_permutations³õʼ²ÎÊýÓÃÀ´É趨ÓÅ»¯Æ÷ÓÅ»¯·¶Î§µÄÉϽ磨¼´×î¶à¿¼ÂǶàÉÙÖÖ±í¸ñÁ¬½Ó˳Ðò£©£¬ËüÒÀÀµÓÚ³õʼ²ÎÊýoptimizer_search_limit¡£²ÎÊýoptimizer_max_permutationsµÄĬÈÏֵΪ8000¡£
²ÎÊýoptimizer_search_limit ºÍoptimizer_max_permutationsһͬÓÃÀ´ÉèÖÃÓÅ»¯Æ÷Ëù¿¼ÂǵÄÅÅÁÐÊýµÄÉÏÏÞ¡£ÓÅ»¯Æ÷²»¶ÏµÄ²úÉú¿ÉÄܵıíµÄÁ¬½ÓµÄÅÅÁУ¬Ö±µ½ÅÅÁÐÊý´ïµ½²ÎÊýoptimizer_search_limit»òÕßoptimizer_max_permutationsΪֹ¡£Ò»µ©ÓÅ»¯Æ÷Í£Ö¹²úÉúеĿÉÄÜÁ¬½ÓÅÅÁУ¬Ëü½«»á´ÓÖÐÑ¡Ôñ³öºÄ·Ñ×îСµÄÅÅÁС£
ÓÃÒÑÅÅÐòָʾÀ´Ö¸¶¨Ò»ÖÖÁ¬½ÓÅÅÐò
Äã¿ÉÒÔÉ趨ÓÅ»¯Æ÷ÆÀ¹ÀµÄÅÅÁÐÊýµÄÉÏÏÞ¡£µ«ÊǶԸ´ÔÓµÄÇé¿öÏ£¬¼´Ê¹ÔÊÐíµÄÅÅÁÐÊýºÜ´ó£¬ÓÅ»¯Æ÷Ò²ºÜ¿ÉÄÜÔÚԶԶûÓÐÕÒµ½Ò»¸ö±È½ÏºÏÊʵÄÅÅÁÐÖ®¼ä¾ÍÒѾֹͣÓÅ»¯ÁË¡£Äã²»·Á»ØÍ·¿´¿´ÎÒÇ°Ãæ¾ÙµÄÄǸöÀý×Ó£¨15¸öÐèÒªÁ¬½ÓµÄ±íÓг¬¹ýÒ»ÍòÒÚÖÖÅÅÁУ©¡£Èç¹ûÉ趨ÓÅ»¯Æ÷¿¼ÂÇ80£¬000ÖÖÅÅÁУ¬ÄÇôÕâ½ö½ö¿¼ÂÇÁËËùÓпÉÄÜÐÔµÄ0.000006£¥£¬ÓÅ»¯Æ÷¼«¿ÉÄÜûÓдﵽ×î¼ÑµÄÅÅÁС£
ÔÚOracle SQLÖнâ¾öÕâ¸öÎÊÌâµÄ×îºÃ·½·¨¾ÍÊÇÊÖ¹¤Ö¸¶¨Ò»ÖÖ±í¸ñÁ¬½Ó˳Ðò¡£ÕâÀïÐèÒª×ñѵĴóÔÔò¾ÍÊDZí¸ñÁ¬½Ó˳ÐòÓ¦¸ÃʹµÃ²éѯ¼Æ»®¾¡¿ìµÃÒÔ½¨Á¢£¬Í¨³£ÔÚSQLÓï¾äÖÐʹÓÃWHEREÏÞÖÆ×Ӿ䡣
ÏÂÃæÒÔÒ»¸ö¶ÔÃûΪempµÄ±í¸ñµÄ²¢ÐвéѯΪÀý£¬Àý×ÓÖеĴúÂëÇ¿ÖƲéѯ¼Æ»®Ö´ÐÐÒ»¸öǶÌ×Ñ»·Á¬½Ó£¨nested loop join£©¡£×¢Ò⣬ÎÒʹÓÃÁËÒÑÅÅÐòָʾÀ´Òýµ¼ÓÅ»¯Æ÷À´ÆÀ¹ÀWHERE×Ó¾äÖиø³öµÄ±í¸ñµÄÁ¬½Ó˳Ðò¡£
select /*+ ordered use_nl(bonus) parallel(e, 4) */
e.ename,
hiredate,
b.comm.
from
emp e,
bonus b
where
e.ename = b.ename
;
ÉÏÃæµÄÀý×ÓÒªÇóÓÅ»¯Æ÷°´ÕÕSQLÓï¾äÖÐFROM×Ó¾äÖ¸¶¨µÄ˳ÐòÁ¬½Ó±í¸ñ£¬FROM×Ó¾äÖеÚÒ»¸öµÄ±í¸ñÖ¸¶¨ÎªÇý¶¯±í¸ñ£¨driving table£©¡£ÒÑÅÅÐòָʾ³£³£ÓëÆäËüָʾÁªºÏʹÓÃÒÔÈ·±£¶à¸ö±í¸ñ°´ÕÕÊʵ±µÄ˳ÐòÁ¬½ÓÆðÀ´¡£ÔÚÓöµ½Éæ¼°ËĸöÒÔÉϱí¸ñµÄÊý¾Ý²Ö¿â²éѯʱ³£³£Ò²ÊÇÕâÑù´¦Àí¡£
ÏÂÃæÁí¸ø³öÒ»¸öÀý×Ó£¬ÔÚÕâ¸öÀý×ÓÖУ¬ÎÒÃÇʹÓÃÒ»¸öÒÑÅÅÐòָʾ£¨ordered hint£©À´°Ñ±í¸ñ°´ÕÕÒ»¸öÌض¨µÄ˳Ðò£¨ÏÈÊÇemp£¬È»ºóÊÇdepºÍsal£¬×îºóÊÇbonus£©Á¬½ÓÆðÀ´¡£½øÒ»²½¸Ä½øÖ´Ðмƻ®£¬ÎÒÖ¸¶¨emp±í¸ñµ½dept±í¸ñµÄÁ¬½ÓʹÓÃhashÁ¬½Ó£¬sal±í¸ñµ½bonus±í¸ñʹÓÃǶÌ×Ñ»·Á¬½Ó¡£
select /*+ ordered use_hash (emp, dept) use_nl (sal, bonus) */
from
emp,
dept,
sal,
bonus
where . . .
¶Ôʵ¼ÊÓ¦ÓõĽ¨Òé
ÔÚʵ¼ÊÓ¦Óó¡ºÏÏ£¬¼õСoptimizer_max_permutations²ÎÊý²¢Ê¹ÓÃÒѱ£´æµÄÓÅ»¯¼Æ»®»òÕßÒѱ£´æ¸ÙÒª£¨ÕâÑùÔÚ²éѯÉæ¼°µ½Ðí¶à±í¸ñʱ£¬¾Í¿ÉÒÔ±ÜÃâÖØнâÎö²éѯËù»¨·ÑµÄʵ¼Ê£©»á¸üÓÐЧÂÊ¡£Ò»µ©ÕÒµ½×îºÃµÄ±í¸ñÁ¬½Ó˳Ðò£¬Äã¿ÉÒÔÊÖ¹¤Ö¸¶¨±í¸ñµÄÁ¬½Ó˳Ðò£¨Í¨¹ýÒÑÅÅÐòָʾ£©²¢±£´æ¸ÙÒª£¬ÕâÑù¾ÍÓÀ¾Ã±£´æ¸Ã±í¸ñÁ¬½Ó˳Ðò¡£
µ±Ö´ÐÐÒ»¸öеIJéѯʱ£¬Äã¿ÉÒÔÊ×ÏÈ°Ñoptimizer_search_limitÉèÖÃΪ¸Ã²éѯËùÉæ¼°µÄ±í¸ñÊý£¬ÕâÑùÓÅ»¯Æ÷½«´ÓËùÓеÄÁ¬½Ó˳ÐòÖÐÕÒ³ö×î¼ÑµÄÄÇÖÖ¡£ÒÔºóÖ´Ðиòéѯʱ£¬Äã¾Í¿ÉÒÔÔÚWHERE×Ó¾äÖа´ÕÕ×î¼ÑÁ¬½Ó˳ÐòÅÅÁбí¸ñÃû³Æ£¬²¢ÉèÖÃÒѱ£´æָʾºÍÒѱ£´æ¸ÙÒª£¬ÕâÑù¾Í¿ÉÒÔ°´ÕÕ×î¼Ñ˳ÐòÁ¬½Ó±í¸ñ¶øÎÞÐèÖظ´ÆÀ¹À¸÷ÖÖ¿ÉÄÜÅÅÐò¡£ÕâÑù²éѯµÄËٶȽ«»áµÃµ½ÏÔÖøµÄÌá¸ß¡£
ÒÑÅÅÐòָʾµÄÓÅÏȼ¶¸ßÓÚoptimizer_search_limitºÍ optimizer_max_permutations²ÎÊý¡£Èç¹ûÉèÖÃÁËÒÑÅÅÐòָʾ£¬ÄÇô±í¸ñ¾Í»á°´ÕÕ²éѯÃüÁîÖеÄFROM×Ó¾ä¸ø³öµÄ˳ÐòÁ¬½Ó£¬ÕâÑùÕâ¸ö¹ý³Ì¾ÍûÓÐÓÅ»¯Æ÷ÓÅ»¯±í¸ñµÄÁ¬½Ó˳ÐòÕâÒ»²½ÖèÁË¡£
×÷ΪOracleµÄרҵÈËÊ¿£¬ÄãÓ¦¸ÃÖªµÀSQLÓï¾ä½øÈë¿âcacheÖÐÓÐÒ»¸öÃ÷ÏÔµÄÆðʼÑÓʱ¡£µ«ÊÇ´ÏÃ÷µÄOracleÊý¾Ý¿â¹ÜÀíÔ±ÒÔ¼°Oracle¿ª·¢ÕßÄܸıä±í¸ñµÄËÑË÷ÏÞÖƲÎÊý»òÕßÀûÓÃÒÑÅÅÐòָʾÀ´ÊÖ¹¤Ö¸¶¨±í¸ñµÄÁ¬½Ó˳Ðò£¬ÕâÑù¿ÉÒÔ¼«´óµÄ½µµÍÓÅ»¯ÒÔ¼°Ö´ÐÐвéѯËù»¨·ÑµÄʱ¼ä¡£