¨}¦nSQL«ü¥Oªº¼¶¼g-Performance Tuning¦A±´
1.
Schema³]p
¦b«e±ªº³¹¸`¤¤¡AµÛ²´¦bÀRºAªºSchema½Õ¾ã¡A¤£·íªºschema³]p¡A·|¨Ï±oSQL«ü¥OÅܱo¿ð½w¦ÓµL®Ä²v¡AY±z¤w¾\Ū¹L¡uªì±´¡v¤@¤å¡A§ÚÌ¥i¥H°²³]±z¤w¹ïSchemaªº³]p¦³¤F³Ì°ò¥»ªº¤F¸Ñ¡A³oùئA±N«ÂIºK¿ý¦p¤U¡G
- Schema¬OSQL«ü¥O°õ¦æªºÀô¹Ò¡A¦nªºÀô¹Ò¤~¦³¦nªº®Ä²v
-
Index¥i¥[³tSQL«ü¥Oªº¬d¸ß³t²v¡A¦ýIndexªº«Ø¥ß¥²¶·¾A±o¨ä©Ò
-
Indexªº«Ø¥ß¥²¶·»P°õ¦æªºSQL¬Û·f°t¡A¦]¦¹¨Æ«e§¹¾ãªºSQL»`¶°Åܱo·¥¬°«n
-
²Õ¦X¦¨IndexªºÄæ¦ì¡A¥²¶·¦³¦nªº±Æ°£®ÄªG¡FY¬°½Æ¦XÁä¡A¦¸§Ç±Æ¦CÀ³¥H±Æ°£®ÄªG¤jªº¬°¥ý¡A»P·f°tªºSQL«ü¥O¤@¨Ö¦Ò¶q
-
¦Ò¶q²Õ¦XIndexªº¦UÄæ¦ì¤ÎIndex¥»¨ªºªø«×¤j¤p¡Aì«h¤W¬O¾¨¶qÅýIndex¶¦h©ñ°O¿ý¡A¦]¦¹ÁäȪø«×»Ý¾¨¶q²µu¡A¦p¦¹Indexªº¶¥¼h´N·|¸ûµu¡A·j´M´N·|¸û§Ö
¥»¤å±N·|µÛ«¦bSQL«ü¥O°ÊºA°õ¦æ®É¡A¹ïperformance©Ò³y¦¨ªº¼vÅT¡A¦Ü©óµwÅé¤Î¨t²Î»PDB®Ä¯àªºÃö«Y¡A·|¦b¡uPerformance¤T±´¡v¤¤±´°Q¡C
2.
»`¶°§¹¾ãªºSQL«ü¥O
º¥ýn§@ªº°Ê§@¬O»`¶°§¹¾ãªºSQL«ü¥O¡A§Y¨Ï¤£¬O¥þ³¡ªº¡A¤]n¾¨¶q¯à»`¶°±o·U§¹¾ã·U¦n¡A¦³®ÉÔ¬°¤F¥[§Ö¤@ÓSQL«ü¥Oªº³t²v¡A¤Ï¦Ó·|³y¦¨¨ä¥LSQL«ü¥OÅܱo¿ð½w¡A¨âªÌ¤§¶¡nÅv¿Å±o©y¡C
³o¤]´N¬O¦b¨t²Î«Ø¸m¤§ªì¡ADBA»PAP¶·n±K¶°·¾³q°Q½×¡A³oÓ®ÉÔDBA¯à°÷¾A®É¦a°w¹ï¤£·íªºSQL«ü¥O¶i¦æ«ØÄ³»P½Õ¾ã¡A¥B¦b«Ø¸m¤§ªì¡AÁÙ¥i½ÐAP¤Hû¶i¦æ§ï¼gSQL«ü¥O¤Îµ{¦¡¡ADBA¤]¥i½Õ¾ãDB
Schema¨Ó°t¦X¡FY¬O¨t²Î¤w¤W½u¦n¤@°}¤l¡A¥u¦³°õ¦æÀÉ¥i¨Ñ°Ñ¦Ò¡A¦¹®É¥u¯à¥ÑDB³oÃä¨Ó¶i¦æ½Õ¾ã¡A¦³¨Ç¦a¤è´N¤£§K¬I¤£¤W¤O¨Ó¡C
¨Ï¥ÎDBMaker¡A¥i¥Î¨Ó»`¶°§¹¾ãSQL«ü¥Oªº¤u¨ã¦³¤T¡A¤À§O¬°dmSQL¡BODBC_LOG¤ÎAUDIT_TRAIT¡A³o¤T¶µ¤u¨ã¡A¤£¶È¥i¥Î¨Ó»`¶°SQL¡A¤]¥i¥Î¨Ó¹ïAP¤ÎÀô¹Ò§@ºÊ´ú¡C
(1) §Q¥Îdmsql
dmsql«ü¥O¬ODBMaker¥Î¨Ó»PServer·¾³qªº¤@¶µ¤u¨ã¡A¥¦¥»¨¤]ÄÝ©ó¤@¤ä«È¤áºÝÀ³¥Îµ{¦¡¡A¦P®É¥i¥Î¨ÓÂ^¨úServer¤Wªº«n¸ê®Æ¡A¶i¦æºûÅ@¥\¯à¡C
DBMaker¦³¤@¨Ç¥H¡uSYS¡v¶}ÀYªºµêÀÀªí®æ¡AY¯à¾A·í¦a¥hÂ^¨ú³o¨Ç¸ê°T¡A¦³§U©ó¤F¸Ñ¦øªA¾¹ªºÀô¹Òª¬ªp¡C¥i¦b³s±µ¸ê®Æ®w«á¡A¨Ï¥Î¡G¡uSelect
* from SYSUSER;¡v«ü¥O¡A¨ÓÂ^¨ú¨Ï¥ÎªÌ¬ÛÃö¸ê°T¡A¥]¬A¤F¡Gµn¿ýªº¹q¸£¦WºÙ¡BIP¦ì¸m¡B©Ò¤UªºSQL«ü¥O¡A¤Î¨Ï¥Îªº®É¶¡µ¥µ¥¸ê°T¡A¥Ñ©ó§ÚÌ¥u¹ï«È¤áºÝ©Ò¤U¹FªºSQL«ü¥O¦³¿³½ì¡A¬G¥i¥Î¡uselect
SQL_CMD from SYSUSER¡v¡A°õ¦æ³oÓ©R¥O±`·|µo²{¥X²{ªº®æ¦¡¬Û·í¯¿¶Ã¦Ó¤£©ö¸ÑŪ¡A¦]¦¹´NÓ¤H¦Ó¨¥¡A³q±`·|±N¿é¥Xªºµ²ªG¡A¥ý¾É¦V¨ì¥t¤@Ó¤å¦rÀÉ¡A¾ãÓ¹Lµ{¦p¤U¡G
|
Set printto C:\SQLCollection1008.txt;
Select SQL_CMD from SYSUSER;
(µ¥«Ý¼Æ¤ÀÄÁ«á)
Select SQL_CMD from SYSUSER;
(µ¥«Ý¼Æ¤ÀÄÁ«á)
¡K
Set printto off;
|
³o¼Ëªº§@ªk¡Aµ§ªÌ±`À¸ºÙ¬O¡u¿ý»sSQL¡v¡A¨Ï¥Î³oÓ¤èªk¨Ó¿ý»sªºSQL¶°¡A¥Ñ¤Wz¹Lµ{«Kª¾¬O¦³¨ä¦º¨¤ªº¡A¦]¬°¦³¨Ç³øªíµ{¦¡¡A¥i¯à¤@Ó¤ë¤~°õ¦æ¤@¦¸¡A³oӤ覡´N¥i¯àº|±µ¤F³o¨ÇSQL«ü¥O¡F¦AªÌ¡A¦bDBMaker
4.0«e¡A¥iÅã¥ÜªºSQLªø«×¥u¦³512¡A¦p¦¹¡A©ÒÂ^¨úªºSQL«ü¥O·|¦]ªø«×¤Óªø¦Ó¶È®·®»¨ìSQLªº«e¥b³¡¡A³o¼ËªºSQL«ü¥O¬OµLªk§@¶i¤@¨B¤ÀªRªº¡C
§Y¨Ï¦p¦¹¡A¨Ï¥Î³oÓ¤èªk¨ÓÂ^¨úSQL«ü¥O¡AÓ¤Hı±o¤Q¤À²³æ¥B¨¬°÷¤F¡A°£«D·Pı¨ì®»¨ìªº¹ê¦b¬O¤£¥þ¡AÓ¤H¤~·|¨Ï¥Î¤U¤èªº¥t¥~¨âÓ¤u¨ã¡C
(2) ³z¹LODBC_LOG
DBMaker¦b3.71«á¦Û¦æ´£¨Ñ¤FODBC_LOG¥\¯à¡AMicroSoft¥»¨¤]´£¨Ñ¤FODBCªº°lÂÜ¥\¯à¡A¥i¬O¤£ª¾¦ó¬G¡Aµ§ªÌ¬Æ¤Ö¤@¦¸³]©w«K¯à¦¨¥\¦a¶}©l§ì¨úODBC
Function Code¡A§Y¨Ï¨ì²{¦b¡A¨Ï¥ÎMicrosoftªºODBC°lÂÜ¥\¯à¡A¡u½ä¹B®ð¡vªº¦¨¥÷ÁÙ¬O«Ü«¡C
DBMakerªºODBC_LOG»PMicroSoftªºODBC°lÂÜ¥\¯à¤Q¤À¬Û¦ü¡A¥u¬ODBMakerªºlogÂ^¨ú¤@©w·|¦¨¥\¡A³]©w¤è¦¡¤Q¤À²³æ¡A¥un¦b¡u«È¤áºÝ¡v¤Wªºdmconfig.ini¡A§@¦p¤U³]©w¡G
|
[DM_COMMON_OPTION]
LG_TRACE=1
LG_PATH=J:\TEST\LOGTEST.LOG
|
OK¡A±q¤W±ªº±Ôz¡A´N·|µo²{ODBC_LOGªº´XÓ¯ÊÂI¡A²Ä¤@¡B¦bdmconfig.iniªº³]©w¤W¡A±z·|µo²{¸Ó¤@Ósection¬O¿W¥ß©ó¨ä¥L¸ê®Æ®wªº(¤]¥Î¤¤¨í¸¹¨Ó¬A¥ÜDM_COMMON_OPTION)¡A©Ò¥H¦b³o¤@¥x«È¤áºÝ¤Wªº¥ô¦ó¸ê®Æ®w³s±µ¡A³£·|³Q°O¿ý¡A¨Ò¦p¡G
|
[DM_COMMON_OPTION]
LG_TRACE=1
LG_PATH=J:\TEST\LOGTEST.LOG
[DB1]
DB_SvAdr = 10.133.1.56
DB_PtNum = 9998
[DB2]
DB_SvAdr = 10.133.1.57
DB_PtNum = 9998
|
Y¬O³o¤@¥x«È¤áºÝ¦P®É³s±µ¨ìDB1¤ÎDB2¡A³£·|³Q¤@¨Ö³QÂ^¨ú¤U¨Ó¡A³o¹ï¥u·Q³æ¯Â§ì¥XDB1ªº°ÝÃD®É¡AµLºÝ¼W¥[³\¦h³Â·Ð¡C
²Ä¤G¡BODBC_LOG³]©w¦b¡u«È¤áºÝ¡v¡A§ì¨úªº¸ê®Æ¬O±q³o¥x«È¤áºÝ©¹¦øªA¾¹¥á¥hªºODBC Function
Code¡A¦ý¬O§Ṳ́j¦h¬O·Q§ì¨ì¦øªA¾¹©Ò±µ¦¬¨ìªº©Ò¦³«È¤áºÝ«ü¥O¡A¦Ó¤£¬O¥u¦³¡u³o¥x¡v«È¤áºÝ¥á¥X¨Óªº«ü¥O
²Ä¤T¡BODBC Function Code¤ñ¸ûÃøÀ´¡A§ÚÌ©TµM¥i¥H¥uª`·N§t¦³SQL«ü¥Oªº¤ùÂ_¡A¦ý¤£¥iÁ×§Kªº¡An¦b¼Æ¤d¡B¼Æ¸UÓ²`ÀßÃøÀ´ªºODBC
Function¤¤¡A§ì¨ìSQL«ü¥O¡A¦³¨Ç®ö¶O®É¶¡¡C
¦]¦¹¡A¥ÎODBC_LOG¨Ó§ìSQL«ü¥O¡A¦³¨Ç¦Y¤O¤£°Q¦n¡A¦ý¦³®ÉAPªº¤@¨Ç©Ç²§¦æ¬°¡A¥´¶}ODBC_LOG´N¤Q¤À¦³¥Î¡A©Ò¥Hµ§ªÌ¦h¼Æ¬O¨Ï¥Î³oÓ¤u¨ã¨Ó§ì«È¤áºÝªºAP°ÝÃD¡C
(3) §Q¥ÎAUDIT TRAIT
AUDIT TRAIT¬O¤Wz¨âªÌªºµ²¦XÅé¡A¥¦¬OÂ^¨úServerºÝ©Ò±µ¦¬¨ìªº«H¸¹¡A¨Ã¨Ï¥ÎDBMaker©Ò¯S¦³ªº°O¿ý¤è¦¡°O¿ý¡F¦ýAUDIT
TRAITªºDISPLAY¥\¯à¡A¦b4.0«á¤è´£¨Ñ¡C
§ÚÌ¥i©¿²¤¦h¼Æ¹ï½Õ®Õ¨S¦³¤°»ò·N¸qªºfunction¡A¥u»`¶°SQL«ü¥O¡A¥¦ªº³]©w¤Q¤À²³æ¡A¥un¦b¡u¦øªA¾¹¡vºÝªºdmconfig.ini³]©w¡G
«K¥i¦b[DBMAKER_HOME]/BIN©³¤U¡A§ä¨ì[DB_NAME].LOG¡A¤§«á«K¥i¨Ï¥ÎDBMakerªº¤u¨ã¨ÓÀ˵ø³oÓLOGÀɮסC
AUDIT_TRAIT§ì¤U¨Óªº¸ê®Æ¬O³Ì§¹¾ãªº¡A¦ý¤]¬O¦³¨ä¯ÊÂI¡A¨Ò¦p¡G¤@Ó¤ë°õ¦æ¤@¦¸ªº³øªíµ{¦¡¡AY¦bºÊ·þ´Á¶¡¥¼°õ¦æªº¸Ü¡A¤´µM¬O§ì¨ú¤£¨ì¡FÁÙ¦³¡AAUDIT_TRAIT¥²¶·Ãö³¬¸ê®Æ®w¡A¦A±Ò°Ê«á©l¥Í®Ä¡A¦ý¦b¤@¨ÇÀWÁcªº½u¤W§@·~¨t²Î¡A³o¼Ëªº°Ê§@´N¤£¤Ó¾A©y¡AÀ˵øAUDIT_TRAITªº¤u¨ã¡A±N¦b4.0ª©«á¾Ü®É±À¥X¡C
3.
SQL«ü¥O°õ¦æµ{§Ç
¤@¯ëªºSQL«ü¥O¥á¨ìServer«á¡A¨ä°õ¦æ¶¶§Ç¦p¤U¡G
¨C¤@Ó¶¥¬q³£¦³¤@©wªºÂ¾³d¤Î¤u§@¡A¥²¶·n¤F¸Ñ¨C¤@¶¥¬q¿é¤Jªº°Ñ¼Æ¬°¦ó¡B¼vÅT¤Fþ¨Ç¦æ¬°¡B³y¦¨¤°»ò«áªGªº¬Û¤¬Ãö«Y¡A¤~¯à¹ï¨C¤@¶¥¬qªº¤¸¯À¶i¦æ½Õ±±¡C
(1) Parser¡G¤@¯ëªºSQL«ü¥O¦b°õ¦æ¤§ªì¡A·|¥ý¸g¥ÑParser§@Tokenªº¤À¸Ñ¡A¤@¯ëªºPattern¦p¤U¡G
Select PROJECTION from TABLE_NAME where PREDICATE
PROJECTION«üªº¬O©ÒnÂ^¨úªºÄæ¦ì¡Bexpression²Õ¦X¡APREDICATE«h¬O·j´Mªº±ø¥ó¡A³o¨âªÌªº·f°t¡A´N·|Åýoptimizer²£¥Í¤£¦Pªº¦æ¬°¼Ò¦¡¡A³Ì²³æªº¨Ò¤l
°²³]¦³¤@table t1¡A¦³¤TÓcolumn¡A¤À§O¬°c1¡Bc2¡Bc3¡A¬Ò¬°¾ã¼Æ¡Ac1¬°primary
key¡C
| select * from t1 where c1=1
and c2=2 and c3=3; |
¦¹¨Ò¤¤¡A¡u*¡v¬°Projection¡A¡uc1=1 and c2=2 and c3=3¡v¬°Predicate¡AOptimizer·|¨Ï¥ÎTable-Scan¥h§ì¨ú¸ê®Æ¡C
¦b³oÓ¨Ò¤l¤¤¡AOptimizer´N·|¨Ï¥ÎIndex-scan¡Aì¦]¦b©ó¡Ac1ªº¸ê®Æ§ä¯Á¤Þ¶´N¦³¤F¡A¤£¶·n¥h§ì¸ê®Æ¶¡F´N¹³¦b¡uªì±´¡v¤@¤å¤¤´¿»¡¡A¹ï¡u§@ªÌ¡vÄæ¦ì¦³¯Á¤Þ¡A¨º»òn§ä©Ò¦³¡u§@ªÌ¡vªº¸ê®Æ¡A¨S¥²n±N¥þ³¡ªº®Ñ®³¥X¨Ó¬d¡A¥un¥h§ä¡u§@ªÌ¯Á¤Þ¡v§Y¥i¡C
©Ò¥H¤@ÓSQL«ü¥Oªº¦nÃa¡A±qPredicate»PProjectionªº¦w¸Ë¤W¡A´N¥i¯à³y¦¨®t§O¡C
¦ý®t²§³Ì¤jªº¡A®£©ÈÁÙ¬OPredicate¤¤¡A¹ï©óFactorªº¦w±Æ¡C
(2) Factor¤ÀªR
©Ò¿×ªº¡uFactor¡v¡A´N¬OPredicate¤¤¡AÅÞ¿è¤W¥i¿W¥ß¥X¨Ó§P§Oªº¦]¤l¡AÅ¥°_¨Ó«Ü¥È¤£?¨Æ¹ê¤W¬Û·í²³æ¡A¨Ò¦p¡Gc1=1
and c2=2¡A´N¬O¦³¨âÓFactor¡A¤À§O¬O¡uc1=1¡v¤Î¡uc2=2¡v¡F¬°¤°»òn³o¼Ë§âSQL«ü¥O©î¶}©O?
°²³]³oÓtable¦@¦³100¸Uµ§¸ê®Æ¡Ac1=1ªº°O¿ý¥u¦³10µ§¡A¦Óc2=2«o¦³10000µ§¡A¨º»ò¥ý±qc1=1¥h§PÂ_¸û¦n¡A·N§YYc1!=1ªº¸Ü¡A®Ú¥»´N¤£¥Î¥h§PÂ_c2=2³oÓ¦]¯À¬O§_º¡¨¬¡F©Ò¥H¡uFactor¡v§Y¬O¡uÅÞ¿è¤W¥i¿W¥ß¥X¨Ó§P§Oªº¦]¤l¡v¡C
¬Û¹ï¦a¡AY¬OPredicate¬Oc1=1 or c2=2¡A¨º»ò³o«h¥u¦³¤@ÓFactor¡A¦]¬°§Y¨Ï¬Oc1!=1¡A§AÁÙ¬O±on¹ïc2=2¥[¥H§PÂ_¡A¦P¼Ë¦aYc2!=2¡AÁÙ¬On¹ïc1=1¥[¥H§PÂ_¡A³o¨âÓ¦¡¤l¡A¨ÃµLªk¦]«e¤@Ó¦¡¤lº¡¨¬©Î¤£º¡¨¬¡A´N¥i²×¤î¾ãÓ¦¡¤lªº§PÂ_¡C
§ó¶i¤@¨B·Q¡A°²Y´¿¹ïc1¥[¥H¯Á¤Þ¡A¨º»ò¦b·j´M¤W¡A¦]¬°¥i¥ý§Q¥Î¯Á¤Þ¶§@§P§O¡A¦A¹ê»Ú§ì¨ú¸ê®Æ¡A¦]¦¹¦b³t«×¤W·|¤ñ¸û§Ö¡C
¦P¼Ë¦a¡A¹ïc2¤]´¿¥[¥H¯Á¤Þªº¸Ü¡A¤]¥i¯à¤ñ¸û§Ö¡A¦ýn¥Î½Ö¤ñ¸û¦n©O?¥H¤W±ªº¨Ò¤l¨Ó¬Ý¡AYc1=1¦³10µ§¡A¦ÛµM¥Îc1ªº¯Á¤Þ¤ñ¸û¦n¡AY¨Ï¥Îc2¯Á¤Þ¡A¦]¬°c2¦³10000µ§¸ê®Æ¡A¥i§Q¥Î¯Á¤Þ¶±N³o10000µ§¸ê®Æ©Ò¦b¦ì¸m§ä¨ì¡AµM«á¦A§ì¨ú¸ê®Æ¶¡A¦A±q¸ê®Æ¶¥h§PÂ_c1=1¬O§_º¡¨¬¡A¬Û§Î¤§¤U¡A·|¤ñ¸ûºC¡C¦ý³oÁÙ¬O·|¤ñ§ì¨ú100¸Uµ§¸ê®Æªº¸ê®Æ¶(Table-Scan)¡An§Ö±o¦h¡C
(3) Optimizer
OK¡A¤Wz¥H·§©À¤W¨Ó¬Ý¡A³£Áٺ⦳¹D²z¡A¦bDBMakerªº¹ê§@¤W¡A«h·|¦³¶·n¦Ò¶qªº¦a¤è¡C§ÚÌ¥H¤Wz¨Ò¤lÄ~Äò»¡©ú¡A°²³]c1¡Bc2³£¤À§O§@¤F¯Á¤Þ¡A¨º»òOptimizer·|¨Ï¥Î¨ºÓ¯Á¤Þ¨Ó·j´M©O?
¦]¦¹³Ì¦n§Ú̯ണ¿ôOptimizer¤@Өƹê¡A´N¬Oc1=1ªº¦³10µ§¡Ac2=2ªº«o¦³10000µ§¡FOptimizer´N¥i®Ú¾Ú§Ú̩Ҵ£¨Ñªº¡u±¡³ø¡v¡B¡u¸ê°T¡v¡A¨Ó§@¥X¹ê»Ú·j´M®É©Ò±Ä¦æªº¦æ¬°¤èªk¡C
¦]¦¹¦b¤â¥U¤W¡A·|´£¿ô¨Ï¥ÎªÌ¡A¦³®É¶·n¤£©w´Áªºupdate statistics¡A©Ò¿×ªº¡ustatistics¡v´N¬OÃþ¦ü¤WÀY©Ò»¡ªº¡u10µ§¡v¡B¡u10000µ§¡vªº¸ê°T¡A¨t²Î·|±N¤@¨Ç¼Æ¾Ú°O¿ý°_¨Ó¡A¦ý¬O¥Ñ©ó¨Cinsert¡Bdelete¡Bupdate¸ê®Æ®wªº¸ê®Æ¡A§ó·s¬Û¹ïªº°O¿ý±N·|ªá¥h³\¦h¨t²Î¸ê·½¤Î®É¶¡¡A¦]¦¹DBMaker¥u·|§ó·s¥²nªº¸ê°T¡AÀHµÛ®É¶¡ªº¼W¥[¡A³\¦h¨S³Q§ó°Êªº¨t²Î°O¿ýȤ]³\¤w¸g¤£¦X®É©y¡A¦¹®É´N»Ýn¨Ï¥Î³oÓ©R¥O¨Ó§ó·s©Ò¦³ªº°O¿ýÈ¡C
¤@¥¹update statistics«á¡A©Ò¦³ªº¨t²Î°O¿ýȳQ§ó·s§¹²¦¡A²z½×¤WOptimizer·|¨Ï¥Î³ÌÁo©úªº¤èªk¨Ó·j´M¤è¦¡¡C¦ý²¦³ºµ{¦¡¤£¥i¯à©Ò¦³ªºª¬ªp³£·|¦Ò¶q¶i¥h¡A¥H¤W¨Ò¨ÓÁ¿¡AYÅܦ¨¡uc1=100
and c2=200¡v¡A¤]³\¡uc1=100¡vªºµ§¼Æ¦³1000Ó¡A¦Ó¡uc2=200¡vªº¤Ï¦Ó¥u¦³10Ó¡Aªu¥Îc1¯Á¤Þ¤Ï¦ÓÅܺC¤F¡C
¦b³oºØ±¡§Î¤U¡A¤@¯ë·|¦Ò¼{©Ò¿×ªº¡u±Æ°£®ÄªG¡v(filtered effect)¡A´N¬O¨º¤@ÓÄæ¦ì·|Åýfactor©Ò²£¥Í¥X¨Óªºµ²ªG³Ì¤p¡A±Æ°£¤£²Å¦Xªº°O¿ýµ§¼Æ³Ì¤j¡A¤@¥¹¨M©w«á¡A´N±N¨ä¯Ç¤J«Ø¥ßindexªº¦Ò¶q¡A¥H¤W¨Ò¨ÓÁ¿¡AYµo²{c1=?ªº±Æ°£®ÄªG¸û±jªº¸Ü¡Aµ§ªÌÓ¤H·|¥u«Øc1ªº¯Á¤Þ¦Ó¤£«Øc2¯Á¤Þ¡AÁ×§KÅýOptimizer¦³¾÷·|¥h¨«¨ì¤£¥²nªº¸ô¡C
4.
¬ã¨sExecution Plan
±µ¤U¨Ó¡A´N¬O¤F¸ÑSQL«ü¥O°õ¦æ®É¡AOptimizer©Ò¹ê»Ú§@ªºµ{§Ç§a¡C¤@ÓSQL«ü¥Oªº°õ¦æ¡A¤£¨£±o¥u¦³¤@Ó¤èªk¡A¥¿©Ò¿×¡u±ø±ø¤j¸ô³qù°¨¡v¡AOptimizer¥²¶·®Ú¾Ú©ÒÀò±oªº¸ê®Æ¡A¤Î¥i°õ¦æªº´XÓ¤èªk¡A§@¥X¥¿½Tªº¨M©w¡F¦Ó¹ï¦P¤@ÓSQL«ü¥O¡A¥i±o¨ì¬Û¦Pµ²ªGªº°õ¦æ¬yµ{ºÙ¤§¬°¡uExecution
Plan¡v¡F·íDBMaker±NSQL«ü¥O¥¿½Tparse§¹²¦¡AOptimizer¦A®Ú¾Ú¨t²Î°O¿ýÈ¡A®M¤J¥i°õ¦æªºExecution
Plan¡Apºâ¥X¨º¤@±ø¸ô¬O¡u³Ì¤Ö¦¨¥»¡vªº(¹ïDBMaker¦Ó¨¥¡A´N¬Oªá³Ì¤Ö®É¶¡ªº)¡A³Ì«á¥I½Ñ¹ê¦æ¡C
nÅã¥ÜOptimizer©Òpºâ¥Xªº³Ì¨ÎExecution Plan¡A¦bdmsql¤¤¡A¦³¤TºØ©R¥O¥i¥H¨Ï¥Î¡G
|
dmsql> set dump plan on;
(±Noptimizerªºexecution planÅã¥Ü¥X¨Ó)
dmsql> set dump plan off;
(Ãö³¬¦¹¶µ¥\¯à)
dmsql> set dump plan only;
(¥uÅã¥Üexecution plan¡A¦ý¤£§ì¨ú¸ê®Æ)
|
(1) Table Scan¤ÎIndex Scan
Execution Plan¦b³B²zQuery®É¡A·|¥h¨M©w¬O§_n¥ÎIndex¨Ó·j´M¡A©Î¬OTable
¨Ó·j´M¡A©Ò¿×ªºTable Scan¡A´N¬O±N¾ãÓTableŪ¨ú¦Ü°O¾ÐÅé¡F¦ÓIndex Scan«h¬O·|¥ý±N¯Á¤Þ¶§ì¨ú¦Ü°O¾ÐÅé¡A³z¹L¯Á¤Þ¶¡A¦A¥h§ì¨ú¸ê®Æ¶¡C
|
create table SYSADM.t1 (
t1id SERIAL(1000),
pdate DATE default
cur_date() )
in DEFTABLESPACE
lock mode page fillfactor 100 ;
alter table SYSADM.t1 primary
key ( t1id) ;
dmSQL> set dump plan on;
dmSQL> select * from t1;
----- begin dump plan -----
{ON Block 0}
ON Type
: SCAN
[PL Block 0]
Method
: Scan
Table Name : t1
Type
: Table Scan
Order
: <none>
Factors
: <none>
¡K¡K.
----- end dump plan -----
t1id
pdate
=========== ===========
5 NULL
4 NULL
3 NULL
2 NULL
1 NULL
5 rows selected
|
¦¹³B¡A¦bScan Type¤¤¡AÅã¥Ü³oÓQuery(select * from t1)¨Ï¥Î¤FTable
Scan¨Ó·j´M¡A³Ì«á§ä¨ì¤µ§¸ê®Æ¡C
|
dmSQL> select t1id from
t1;
----- begin dump plan -----
{ON Block 0}
ON Type
: SCAN
[PL Block 0]
Method
: Scan
Table Name : t1
Type
: Table Scan
Order
: <none>
Factors
: <none>
¡K.
----- end dump plan -----
t1id
===========
5
4
3
2
1
5 rows selected
|
¦b¦¹³B¡AQuery¤w¸g±q¡uselect * from t1¡vÅܦ¨¡uselect t1id
from t1¡v¡A¥Ñ©ót1id¬OPrimary Key¡A¬G¦³¯Á¤Þ(Foreign Key«h¨S¦³)¡A²z½×¤W¡A¨Ï¥ÎIndex
Scan¬O¤ñ¸û¦X²zªº!!ì¦]¬O¦]¬°Projection¤¤¥u¦³t1id¡A©Ò¥H¨S¥²n¦A¨ì¸ê®Æ¶¥h§ì¸ê®Æ¡C¦ý²{¦bÅã¥Üªº¬O¤´µM¨Ï¥ÎTable
Scan¡C
³o´N¬O§Ṳ́§«e©Ò»¡¡AOptimizer©Ò¿à¥H§PÂ_ªº¨t²Î°O¿ýȦ³°ÝÃD¡A§ÚÌ¥i¥H¥ýupdate statistics¡A§ó·s³oÓªí®æªº¨t²Î°O¿ýÈ¡A¤]³\OptimizerÁÙ¤£ª¾¹D¦³Index¥i¥Î©O¡C
|
dmSQL> update statistics
t1; (§ó·st1ªº¨t²Î²ÎpÈ)
dmSQL> select t1id from
t1;
----- begin dump plan -----
{ON Block 0}
ON Type
: SCAN
[PL Block 0]
Method
: Scan
Table Name : t1
Scan Type : Index
Scan on PrimaryKey(t1id)
Order
: ASC
Index EQFA#: 0
Index FA# : 0
Index FACOL: Index Cost :
2
¡K.
----- end dump plan -----
t1id
===========
1
2
3
4
5
|
º¥ý¡A¦bScan Type¤¤Åܦ¨¤FIndex Scan¡A¦A¨Ó¡A¦bselect¥X¨Óªºµ²ªG¤¤¡A±Æ§Çªº¤è¦¡¬O¥Ñ¤p¨ì¤j¡A¬Û¸û¤§«eTable
Scan®É¡A²£¥Íªºµ²ªG¬O¥Ñ¤j¨ì¤p¡A¨Æ¹ê¤WTable Scan¬O¸ê®Æ«ç»ò©ñ¡A´N«ç»ò®³¥X¡A¨Ò¤¤ªº¥Ñ¤j¨ì¤p¬O¦]¬°¸ê®Æ¦b¸ê®Æ®w¤¤«K¬O¥Î³oºØ¤è¦¡¥Ñ¤j¨ì¤pÀx¦s¡C¦ÓINDEX¦]¬°¨Æ¥ý±Æ§Ç¹L¡A©Ò¥H²£¥Íªº¸ê®Æ·|¨ÌÄæ¦ìªº¦¸§Ç¤@¤@¿é¥X¡C
(2) Merged Join¤ÎNested Join
¦bQuery ªºExecution Plan¤¤¡AJoin¬O³Ì¥O¤HÀYµhªº¡A¨âÓªí®æªº¡uµ²¦X¡v(Join)¡A³q±`·|¦ñÀHµÛ©Ò¿×ªº¡uµ²¦X¦]¤l¡v(Join
Factor)¡A¨Ò¦p¡G
| select * from A,B where A.C1=B.C1; |
A.C1=B.C1«K¬OJoin Factor¡A¨º»ò¹ê»Ú¡uµ²¦X¡v®É¡ADBMaker¦³¨âºØ¤è¦¡¨Ó¹ê§@¡uµ²¦X¡vªº°Ê§@¡C
¥H¹ê¨Ò»¡©ú¸û¬°²M·¡¡A°²³]²{¦b¦³¨âÓTable¡A¤º®e¦p¤U¡G
|
Select * from A, B where A.C1=B.C1;
A.C1
A.C2
B.C1
B.C2
1
A
1
G
2
B
2
F
3
C
3
E
|
¦bjoinªº¹Lµ{¤¤¡A¤À§O¬°Nested Join¤ÎMerged Join¡A¤Àz¦p¤U¡G
Nested Join(±_ª¬µ²¦X)¡G±NAªí®æªº¸ê®Æ¡A¤@µ§¤@µ§©â¥X»PBªí®æ°t¹ï¡Aµ²¦X¦¨¥t¤@Ó¤jTable¡A¦p¤Uªí¡G
|
Aªí®æ
|
Bªí®æ
|
| C1 |
C2 |
C1 |
C2 |
| 1 |
A |
3 |
E |
| 1 |
A |
2 |
F |
| 1 |
A |
1 |
G |
| 2 |
B |
3 |
E |
| 2 |
B |
2 |
F |
| 2 |
B |
1 |
G |
| 3 |
C |
3 |
E |
| 3 |
C |
2 |
F |
| 3 |
C |
1 |
G |
³o®É¦A¶i¤@¨B¥h§PÂ_Join Factor¬O§_º¡¨¬¡A²£¥Í³Ì«áªºµ²ªG¡C
Nested Join¥Ñ©ó»Ýn¥ý¦æ¹ï¨âªí®æ§@°t¹ïµ²¦X¡A²£¥Íªº¼È®Éªí®æ¥i¯à·|«Ü¤j(YAªí®æ¦³mµ§¸ê®Æ¡ABªí®æ¦³nµ§¸ê®Æ¡A²£¥Íªº¼È¦sªí®æ·|¦³m
X nµ§¸ê®Æ)¡AY¬O¦³²Ä¤T¡B²Ä¥|Óªí®æn¤@¨Öjoin¦b¤@°_¡A²£¥Íªº¼È¦sªí®æ¥i¯à·|¦³ m X n X
o X p(Y¤À§O¦³oµ§»Ppµ§)¡C
©Ò¥H¦³®É¤@Óquery·Pı¤W¡A¥u¬O¹ï´XÓªí®æ§@join¡A«o¥i¯ànªá¤W«Ü¦hªº®É¶¡¡A«K¬O¦]¬°YA¦³10¸Uµ§¡AB¡BC¡BD´Nºâ¥u¦³100µ§¡A²£¥Íªº¼È¦sªí®æ«o¦³1Gªº¸ê®Æ¶q(10¸UX100X100X100)¡C
Merged Join(¦X¨Öµ²¦X)¡G»PNested Join¤£¦P¡AMerged Join¦b¶i¦æjoin¤§«e¡A¥²¶·¥ý¹ï¦UÓªí®æ¥ý§@Sortªº°Ê§@¡G
|
|
|
Bªí®æ(¥ý¦æ±Æ§Ç¹L)
|
| C1 |
C2 |
| 1 |
G |
| 2 |
F |
| 3 |
E |
|
§@§¹Sortªº°Ê§@«á¡A¦A¥ÑAªí®æ´`§Ç©¹¤UŪ¡A»PBªí®æªº¤º®e¤@¤@¤ñ¹ï¡A¬O§_²Å¦XA.C1=B.C1ªº±ø¥ó¡C
Y²Å¦X¡A«h±Nµ²ªG¬D¥X¡AY¤£²Å¦X¡AYB.C1¸û¤j¡A«hAªí®æ¦A©¹¤UŪ¤@µ§¸ê®Æ¡A§_«h«h¬OÄ~ÄòŪBªº¤U¤@µ§¸ê®Æ¡C
Merged JoinªºÃa³B¬O¥¦¥²¶·¥ý¹ï¨C¤@Óªí®æ§@¡u±Æ§Ç¡vªº°Ê§@¡A³oӰʧ@¤Q¤À¯Ó¥Î¹q¸£¸ê·½¡AY¬O¤@ÓTable¦³¦Ê¸Uµ§¸ê®Æ¡AMerged
Joinµ¥©ónÅý³oÓTable¥ý¦æSort¡A²£¥Í¤@ÓSort§¹«áªº¼È¦sªí®æ(¬G¤]¬O¦Ê¸Uµ§)¡A¦A¨Ó¶i¦æJoin
FactorÀˬd¡A¦ý¦b³oºØCase¤W¡A¥ÎNested Join®£©È¤]¤£¬O¤Ó°ª©ú¡C
¨º»ò¬O¤£¬OMerged Join¤@©w¤ñNested Join¨Ó±o¦n©O??³oË¥¼¥²¡A¦pªG¤@Ótable«Ü¤p(10µ§)¡A¥t¤@ӫܤj(¦Ê¸Uµ§)¡ANested
Join¥u·|²£¥Í¤@Ó¤d¸Uµ§ªºªí®æ¡A¥H«á«Kª½±µ±½´y³oӼȦsªí®æ¡CY¬OMerged Joinªº¸Ü¡An¥ý¹ï¦Ê¸Uµ§ªºªí®æ§@Sort¡A³oӰʧ@±N·|¯Ó¶O·¥¤jªº¨t²Î¸ê·½¤Î®É¶¡¡A¦b³oÓ¨Ò¤l¤¤¡A¨Ï¥ÎMerged
Joinªº¸Ü¡A¤Ï¦Ó¤£¬O©ú´¼¤§Á|¡C
·íµM¡A¤@ÓSQL«ü¥Oªº§¹¦¨¡A¥i¯àn¸g¹L¦n´X¹Dªº¨BÆJ«á¡A²Õ¦X¬ÛÃöªº¤l¶°¦X¡A¤è¤~²£¥Í³Ì²×ªº¡uµ²ªG¶°¡v(result
set)¡A§ÚÌ¥H¹ê¨Ò§@»¡©ú¡G
|
dmSQL> select * from
A , B where A.c1=B.c1;
----- begin dump plan -----
{ON Block 0}
ON Type
: JOIN
[PL Block 0]
Method
: Join
Type
: Merge Join
Factors
: (1) A.c1 = B.c1
MJ Factors : (1) A.c1 =
B.c1
I/O Cost : 4.7
¡K.
Sub Block 1: [PL Block 1]
Sub Block 2: [PL Block 2]
[PL Block 1]
Method
: Sort
I/O Cost : 2.3
¡K..
SUB Block : [PL Block
3]
[PL Block 3]
Method
: Scan
Table Name : A
Type
: Table Scan
Order
: <none>
Factors
: <none>
¡K.
Result Rows: 1000.0
[PL Block 2]
Method
: Sort
¡K.
Result Rows: 1000.0
SUB Block : [PL Block
4]
[PL Block 4]
Method
: Scan
Table Name : B
Type
: Table Scan
Order
: <none>
Factors
: <none>
¡K.
Result Rows: 1000.0
----- end dump plan -----
c1
c2 c1
c2
=========== == ===========
==
1 A
1 G
2 B
2 F
3 C
3 E
3 rows selected
|
¦ü¥G«ÜÃø¬ÝÀ´¡A§Ú̱N¤W±ªº¬yµ{¡Aµe¹Ïªí¥Ü¡G

¦bBlock 0¤¤¡A§Ų́M©wn§@¡uMerged Join¡v¡A¦]¦¹»Ý¦A¹ïA¡BB¹ïc1§@Sortªº°Ê§@¡A¦bBlock
3¤¤¡A¨M©w¤F¨Ï¥ÎTable Scan¡A¹ïA±½´y§¹«á¡A²£¥Í¤@¼È¦sªí®æ(Block 1ªºSort°Ê§@)¡A¦P¼Ë¦a¡A¦bBlock
2¤ÎBlock 4¤]¬O§@¦P¼Ëªº°Ê§@¡C
¦ý¦bBlock 3¡BBlock 4¤¤ªºSort°Ê§@¡A¨Æ¹ê¤W¬O«Ü¥i©Èªº¡Aº¥ý¡ATable Scan´N¤w¸gªá¤W¤£¤Ö®É¶¡¡A¦A¨Ó¡An¹ï±½´y§¹ªºªí®æ§@Sort(¨Ï¥Î¼È¦sªí®æ)¡A¤Snªá¤W¤£¤Ö®É¶¡¡A¦]¦¹¡A¦b§@Joinªº®ÉÔ¡A³oTable
Scan¤ÎSortªº°Ê§@¬O«E¶·®ø«Úªº¦a¤è¡C
5.
½Õ®ÕSQL«ü¥O
(1) Á×§K´c¦W¬L¹üªº¡uTable Scan¡v
Table Scan¬O©Ò¦³DBA³Ì±ý°£¤§¦Ó«á§Öªº´c¹Ú¡A¦]¬°¤jªí®æªºTable Scan¡Anªá¶O³\¦hI/O°Ê§@¡AÁÙ¦³¡u²M¬~¡v°O¾ÐÅé®ÄªG¡A¦P®ÉÁÙ·|¦û¥Î¨ä¥L¨t²Î¸ê·½¡A¦ý¤@¯ëªº¬O¨S¤°»ò¥²n¤@©wn±N¾ãÓªí®æªº¸ê®Æ®³¦b¤â¤Wªº¡C·Q·Q¡AY¬O¤@Ó400Mªº¸ê®Æªí®æ¡A200Mªº°O¾ÐÅé¡A¶i¦æTable
Scan¡A¨º»ò´Nµ¥©ó±Nªñ¤@¤ù¥úºÐnŪ¨ú©ñ¦b°O¾ÐÅ餤(¤j®a¥i¥H·Q¨£¡A³oÓ³t«×¦³¦hºC)¡A±N°O¾ÐÅé²M¬~¤F¨â¦¸(¨ä¥Luser¥u¯àµ¥§A§@§¹³oӰʧ@¡A±N°O¾ÐÅéÄÀ©ñ¥X¨Ó)¡C
¥ú¥u¬O·Q·Q´N¥O¤H¤ò°©®ªµM¤F¡A³oӰʧ@¹ê¦b¬O¤ÓÀb¤H¤F¡C¦ý¬Oµ{¦¡³]p®v¦b¼¶¼gµ{¦¡®É¡A¨ä¹ê¬O«ÜÃø·Q¨ì³o¤@¼hªº¡A¦]¬°¸Ó«ØªºIndex³£«Ø¤F¡A¦ÛµM¤£·|·Q¨ì¬O§_¥¿½T¦a¨Ï¥Î¤FÀô¹Ò´£¨ÑªºIndex¡C
Y¬O¤@ÓSQL«ü¥O¥»¨¨Ï¥Î¤FTable Scan¡A³oËÁÙ¦n¡A¦]¬°¦³³\¦h¤u¨ã¥i¥H»²§U§ÚÌ¡A¦ý¬OY¹³¤W±¡ujoin¡vùتº¨Ò¤l¡AExecution
PlanùتºBlock 3¡BBlock 4¡u°½°½¦a¡v¨Ï¥Î¤FTable Scan¡A¤S¤£¤Ó¦n§ä¡A¹ïperformance¤S¶Ë®`»á¤j¡A¤~¬O§Ú̪º³Ì¤j¼Ä¤H¡C
(2) ¥ÑIndex¶}©l§ïµ½
¥i¥HÁ×§KTable Scanªº§@ªk¡Aº¥ý¡A´N¬O«Ø¦nIndex¡AÅýOptimizer¥i¥H§ä¨ì§ó¦nªº¤@±ø¸ô¨Ó°õ¦æ¡A³o·í¤¤¡A¶·Åv¿ÅProjection»PPredicateªº¬M®gª¬ªp¡A±Æ°£®ÄªG¬O§_¨}¦n¡A¹ï¨ä¥LInsert¡BDelete¡BUpdate«ü¥Oªº¼vÅT¬O§_«¤j¡A³£¤@¨Öp¤J¦Ò¶q¡A«ÂI¬OnÁ×§K±¼Table
Scan¡F«Ø¥ßIndex©Ò¶·§@ªº¦Ò¶q¡A½Ð¨£¡uªì±´¡v¤@¤å¤Î¥»¤å«e¸`©Ò´£¡C
¥H«e±ªº¨Ò¤l¨Ó»¡¡ABlock 3¡BBlock 4³£¦b§@Table Scan¡AµM«á¤~¶i¦æJoin¡A¨Æ¹ê¤W¡A¥HJoin
Factor(A.c1=B.c1)¨Ó»¡¡AY¬O¹ïA¡BBªºc1Äæ¦ì¨Æ¥ý¯Á¤Þ¡A¨º»ò¦b§@Sortªº¨BÆJ®É¡A¥un¦U§ì¨úA¡BBªº¯Á¤Þ¶¡A¦]¬°¯Á¤Þ¶¤w¸g¥ý¦æ±Æ§Ç¥B¥iª½±µ¶i¦æ¤ñ¹ï¡A¦]¦¹³t«×¤W·|¤ñì¨Óªº¤è¦¡§Ö¤W³\¦h¡A¦p¤U¡G
|
dmSQL> select * from A
, B where A.c1=B.c1;
----- begin dump plan -----
{ON Block 0}
ON Type
: JOIN
[PL Block 0]
Method
: Join
Type
: Nested Join
Factors
: <none>
¡K
Sub Block 1: [PL Block 1]
Sub Block 2: [PL Block 2]
[PL Block 1]
Method
: Scan
Table Name : A
Scan Type : Index Scan
on PrimaryKey(c1)
Order
: ASC
¡K
[PL Block 2]
Method
: Scan
Table Name : B
Scan Type : Index Scan
on PrimaryKey(c1)
¡K.
Factors
: (1) A.c1 = B.c1
I/O Cost : 2.0
CPU Cost : 0.3
Sub Cost : 0.0
Result Rows: 1.0
----- end dump plan -----
c1
c2 c1
c2
=========== == ===========
==
1 A
1 G
2 B 2
F
3 C
3 E
3 rows selected
|

¦b³oÓ¨Ò¤l¤¤¡Aº¥ý¡Aì¨Óªºmerged joinÅܦ¨¤Fnested join¤F¡A¦ÓBlock 1¬O¥ÎIndex
¥hScan Table A¡A³o¼Ëªº§@ªk¡A±½´y¥X¨Óªº¸ê®Æ¤w¸g¸g¹L±Æ§Ç¤F¡A©Ò¥Hì¨ÓªºSort°Ê§@¤]¤£¨£¤F¡F¦P¼Ë¦a¡A¦bBlock
2¤]¹ïTable B§@Index Scan¡A¦ý¬O¥[¤F¤@ÓFactor¡C¤]´N¬O¦]¬°¦p¦¹¡AnSort¡B¤ñ¹ïjoin
factor¤Î²¾°Êcursorªºmerged join¡A¦b³oùؤϦӤ£¦pnested join¨Ó±o²³æ¡A©Ò¥HOptimizer´N¨Ï¥Înested
join¨Ó³B²zjoinªº°Ê§@¡A¦³¤F³o¼Ëªºindex«Ø¸m¡Aµ´¹ï¤ñì¨ÓªºQuery«ü¥O¨Ó±o§Ö¡C
(3) §ï¼gAPªºSQL«ü¥O
¦³¨Çµ{¦¡©Ò¥á¥X¨ÓªºSQL¡A§Y¨Ï¦bServerºÝ½Õ¾ã¡AÁÙ¬OµLªk±NPerformance½Õ¾ã¦n¡A³o®É´N¥²¶·±q¶Ç¨ÓªºSQL«ü¥O¤¤§ï¼g¡Aµ{¦¡³]p®v»PDBA¦bschemaªº³]p¹Lµ{¤¤¡A±`n¤£Â_·¾³q»P¤¬°Ê¡A«K¬On±N³o¨ÇPerformanceªº¦]¯À¾¨¶q¤©¥H®ø«Ú¡C
6.
¹ê¾Ôºt½m
¤@¯ëªºSQL«ü¥O¡A¬O«ÜÃø¤@²´Åý§A¬Ý¥X¥L¦³¤°»ò°ÝÃDªº¡A½Ð¬Ý¤U±ªºSQL«ü¥O¡G
|
Select D.RoutNo as RoutNo,Routing,AirlineID,sum(Fare)
as Fare,Sum(SaleAmount) as SaleAmount,count(D.IDNo)
as Count
from tmsSaleTicket M ,tmsSaleTicketDet
D outer Program.tmsRouting R
where M.YearMonth='200109' and
M.Dep='1' and M.SaleNo=D.SaleNo and D.RoutNo=R.RoutNo
Group by D.RoutNo,Routing,AirlineID
order by AirlineID ;
|
| ªí®æ¦WºÙ |
¸ê®Æµ§¼Æ |
¥i¥Î¯Á¤Þ |
| tmsSaleTicket |
10395 |
unique
index Index1 on tmsSaleTicket ( SaleNo asc ) |
|
tmsSaleTicketDet |
33571 |
unique
index Index1 on tmsSaleTicketDet ( SaleNo asc
, IDNo asc ) |
| index
Index2 on tmsSaleTicketDet ( PK asc ) |
| Program.tmsRouting |
1240 |
primary
key ( RoutNo) ; |
³o¤TÓªí®æn¥ý¸g¹L¤@Ójoinªº°Ê§@¡A¦Ó«á¦A¸g¹Lpredicate§R¿ï«á¡A²£¥Íªº¸ê®Æn¸g¹Lgroup
by¤Îorder by³B²z¡A³Ì«á²£¥Íµ²ªG¶°¡C
²{¦b¨Ó¬Ý³oÓQuery²£¥ÍªºExecution Plan:
|
----- begin dump plan -----
{ON Block 0}
ON Type
: SORT
Sort
: 1
Distinct :
0
Sub Block : {ON Block
1}
[PL Block 0]
Method
: Temp
¡K.
Result Rows: 0.0
{ON Block 1}
ON Type
: TEMP
Sub Block : {ON Block
2}
[PL Block 1]
Method
: Scan
Table Name :
Type
: <unknown>
{ON Block 2}
ON Type
: CELL
Sub Block : {ON Block
3}
[PL Block 2]
Method
: Temp
I/O Cost : 0.0
¡K
{ON Block 3}
ON Type
: SORT
¡K
Sub Block : {ON Block
4}
[PL Block 3]
Method
: Temp
¡K
{ON Block 4}
ON Type :
JOIN
[PL Block 4]
Method
: Join
Type
: Nested Join
Factors :
(3) tmsSaleTicket.SaleNo = tmsSaleTicketDet.SaleNo
¡K.
Sub Block 1: [PL Block 5]
Sub Block 2: [PL Block 6]
[PL Block 5]
Method
: Scan
Table Name : tmsSaleTicket
Scan Type : Index Scan
on Index1(SaleNo)
Order
: ASC
Index EQFA#: 0
Index FA# : 0
Index FACOL: Index Cost : 61
Factors :
(1) tmsSaleTicket.YearMonth = '200109'
: (2) tmsSaleTicket.Dep = '1'
¡K.
[PL Block 6]
Method
: Outer Join
Type
: Nested Join
Factors
: <none>
¡K.
Sub Block 1: [PL Block 7]
Sub Block 2: [PL Block 8]
[PL Block 7]
Method
: Scan
Table Name : tmsSaleTicketDet
Scan Type : Index Scan
on Index1(SaleNo, IDNo)
Order
: ASC
Index EQFA#: 0
Index FA# : 0
Index FACOL: Index Cost :
297
Factors
: <none>
I/O Cost : 3136.0
CPU Cost : 834.0
Sub Cost : 0.0
Result Rows: 33347.0
[PL Block 8]
Method
: Scan
Table Name : tmsRouting
Scan Type : Index Scan
on Index1(RoutNo)
Order
: ASC
Index EQFA#: 1
Index FA# : 1
Index FACOL: 4
Index Cost : 2
Factors :
(4) tmsSaleTicketDet.RoutNo = tmsRouting.RoutNo
¡K.
----- end dump plan -----
|
³oÓQuery¥E¬Ý¤§ªì¡Aı±oÀ³¸ÓÁÙ¦n¡A¦ý¥J²Ó¬Ý¡A¨ä¹ê¬O¤j¦³¤å³¹ªº¡C
º¥ý¦bBlock 6®É¡A±ý¶i¦æouter join¡A¨Ï¥Î¤Fnested join¨Ó§¹¦¨¡A³oӰʧ@¥»¨·|²£¥Í
33571 X 1240 = 41628040µ§¸ê®Æ¡A¨Cµ§¸ê®Æªºªø«×´Nºâ¥H50Óbytespºâ¡A³oÓnested
join³£ÁÙ¬Onªá¤W¬ù2GªºÀx¦sªÅ¶¡¨Ó¦s©ñ¡C¹ê»Ú¤W¡ADBMaker¦b§@JOIN®É¡A·|¥ý¨Ï¥Î°O¾ÐÅé¨ÓÀx©ñ¡A·í¤£°÷¨Ï¥Î®É¡A·|¦A¥h¨Ï¥ÎTMP
File¡A³oӰʧ@¬Ý¦ü¥¤ZµL©_¡A¨Æ¹ê¤W¡A«o¦Y¥ú¤F°O¾ÐÅé(¦]¬°³oÓnested join)¡A¦P®É¦]¬°n°O¿ý¦bTMP
File¡A¦³¤F«Ü¤j¶qªºI/O°Ê§@¡A¨Ï±o³oÓQueryn¨Ï¥Î20¤ÀÄÁ¥H¤W¨Ó°õ¦æ¡C
¨ä¦¸¡A¦bBlock 7¤¤¡A¬O¹ïRoutNoÄæ¦ì¯Á¤Þ¨Ó§@Index Scan¡A¦ý¬OFactor«o¬O¹ï§OªºÄæ¦ì§@§PÂ_(
tmsSaleTicket.YearMonth = '200109'¡AtmsSaleTicket.Dep
= '1')¡A©Ò¥H¨«¿ù¯Á¤Þ¤F¡C¦ý¬O³oÓ¿ù»~ªº¯Á¤Þ·j´M¡A¨Ã¤£¬O¾ãÓPerformanceªºÃöÁä¡A¦Ó¬O¦b¤è¤~ªºBlock
6ªºnested join¡C¨Æ¹ê¤W¡A·íµ§ªÌ«Ø¥ß¤F¤@ÓRoutNo index¡A¥u¤£¹L¤Ö¤F´XÓI/O Pageªº°Ê§@¡C¦ýYÁÙ¬O¨Ï¥Î¤@¼ËªºExecution
Plan¡A²£¥Í¥X¨ÓªºTemp´N¬O»Ýn³o»ò¤jªºÀx¦sªÅ¶¡¡AIndex¦b¦¹¤Ï¦ÓÅܦ¨¬O¥½¸`¡C
¤£¶È©ó¦¹¡A²£¥Íªºµ²ªG¡AÁÙn¦A¸g¹LBlock 4ªº¦A¤@¦¸nested join¡A¥Ñ©ó²£¥Íªºµ²ªG¶°¤w¸g°÷Åå¤H¡A¥B¨S¦³¥ô¦ófactor¥i¥ý±Æ°£¤£¥²nªº¸ê®Æ¡A¥u¦n±N³o¾ãÓµ²ªG¤~¥hnested
join¤@¦¸¡A³o¼Ëperformance¦ÛµM¦n¤£°_¨Ó¡C
¦Ü¦¹¡ADB¦¹ºÝ¯à°÷µÛ¤Oªº³¡¥÷¤w¸g§i²×¡Aµ§ªÌ¥u¦n¬Ý¬Ý¬O§_¯à×§ïQuery¡A¨Ï³oÓQuery¤£n¯Ó¥Î³o»ò¤jªº¨t²Î¸ê·½¤Î®É¶¡¡A«á¨Óµo²{¡A¦bpredicateªº³¡¥÷¡A¨ä¹ê¤@¶}©l´N³]¦³±ø¥ó¯à¥ý¦æ¥[¥H§PÂ_¡AY¯à¦]¦¹±Æ°£¤£¥²nªº¸ê®Æ¡A¨º»ò§Y¨Ï¦b«á¨Ójoinªº³¡¥÷¡A¤]µL»Ýªá¥Î¤Ó¦h¸ê·½¡C
«ç»ò»¡©O?µ§ªÌ¥ý¥Î¤F¥H¤UªºQuery±ø¥ó¬d¸ß¡G
|
Select count(*) from tmsSaleTicket
M where M.YearMonth='200109' and M.Dep='1' ;
count(*)
===========
184
1 rows selected
|
¦b¤@¶}©lY¬O±j¢¸ê®Æ®w¡A¥u¥Î³o³Ñ¤Uªº184µ§¸ê®Æ¡AµL½×n§@nested join©Î¬Osort¡A³£¤£·|¨º»ò¦Y«(ì¨Ó¦³1¸Uµ§)¡A¦A»¡¡A±µ¤U¨Óªºjoin
factor¤¤¡A¦³¤@¶µ¬O¡GM.SaleNo=D.SaleNo¡A¨ä¤¤ªºD´N¬O¦³33571ªº¸ê®Æ¡AY¬O¯à±N«e±³Ñ¤U¨Óªº184µ§¸ê®Æ¡A»P³o¤T¸U¦hµ§¸ê®Æ¡A¦A¶i¦æµ²¦X§PÂ_¡AµL½×¬O¥Îmerged
join©Î¬Onested join¡A³£·|¤ñ¸û»´ÃP¡C
¥Ñ©óDBMaker¹w³]·|±N¡ufrom A , B outer C¡v¡Aµø§@¬O¡ufrom A, (B outer
C)¡v¡A¤~·|³y¦¨Query Plan¥d¦b«á±n²£¥Í2G temp¸ê®Æ¡Aµ§ªÌ¸ÕÅç±NSQL§ï¼g¦¨¡ufrom
(A,B) outer C¡v¡A²£¥Íªº·sQuery Plan¦p¤U¡G
|
dmSQL> Select D.RoutNo as
RoutNo,Routing,AirlineID,sum(Fare) as Fare,Sum(SaleAmount)
as SaleAmount,count(D.IDNo) as Count
from (tmsSaleTicket M ,tmsSaleTicketDet
D) outer Program.tmsRouting R
where M.YearMonth='200109' and
M.Dep='1' and M.SaleNo=D.SaleNo and
D.RoutNo=R.RoutNo Group by D.RoutNo,Routing,AirlineID
order by AirlineID ;
----- begin dump plan -----
{ON Block 0}
ON Type
: SORT
Sub Block : {ON Block
1}
[PL Block 0]
Method
: Temp
{ON Block 1}
ON Type
: TEMP
Sub Block : {ON Block
2}
[PL Block 1]
Method
: Scan
Table Name :
Type :
<unknown>
{ON Block 2}
ON Type
: CELL
Sub Block : {ON Block
3}
[PL Block 2]
Method
: Temp
{ON Block 3}
ON Type
: SORT
Sub Block : {ON Block
4}
[PL Block 3]
Method
: Temp
{ON Block 4}
ON Type
: JOIN
[PL Block 4]
Method
: Outer Join
Type
: Nested Join
Factors :
<none>
Sub Block 1: [PL Block 5]
Sub Block 2: [PL Block 6]
[PL Block 5]
Method
: Join
Type
: Nested Join
Factors
: <none>
Sub Block 1: [PL Block 7]
Sub Block 2: [PL Block 8]
[PL Block 7]
Method
: Scan
Table Name : tmsSaleTicket
Scan Type : Index Scan
on Index1(SaleNo)
Factors
: (1) tmsSaleTicket.YearMonth = '200109'
: (2) tmsSaleTicket.Dep = '1'
I/O Cost : 240.0
CPU Cost : 260.1
Sub Cost : 0.0
Result Rows: 1.0
[PL Block 8]
Method
: Scan
Table Name : tmsSaleTicketDet
Scan Type : Index Scan
on Index1(SaleNo, IDNo)
Order
: ASC
Factors
: (3) tmsSaleTicket.SaleNo = tmsSaleTicketDet.SaleNo
I/O Cost : 4.0
CPU Cost : 0.3
Sub Cost : 0.0
Result Rows: 3.0
[PL Block 6]
Method
: Scan
Table Name : tmsRouting
Scan Type : Index Scan
on Index1(RoutNo)
Order
: ASC
Index EQFA#: 1
Index FA# : 1
Index FACOL: 4
Index Cost : 2
Factors :
(4) tmsSaleTicketDet.RoutNo = tmsRouting.RoutNo
I/O Cost : 3.0
CPU Cost : 0.3
Sub Cost : 0.0
Result Rows: 1.0
|
¦bBlock 5¤¤ÁÙ¬O¨Ï¥ÎNested Join¡A¦ý¬OBlock 7¤w¸g±Nì¨Ó¦³1¸Uµ§ªº¸ê®Æ¡A±Æ°£¨ì¥u³Ñ184µ§¤F¡A§Y¨Ï¬O¦A¥ÎNested
Join¡AÁÙ¬O¤Ö¥Î¤F³\¦h¨t²Î¸ê·½¡C(ì¨Óªºouter join¥t¤@Ótable¬O1240µ§)¡C²£¥Íªºµ²ªG¦A©¹¤W¥houter
join¡A¤]¬O³Ñ¤Uªº184µ§¥h»P¥t¥~ªºªí®æ nested join¡A»Pì¨ÓªºQuery¤£¥i¦P¤é¦Ó»y¡C
³oÓ«ü¥Oªºperformance¤Q¤À¥O¤Hº¡·N¡A±qì¨Óªº¤G¤Q¤ÀÄÁÁYµu¨ì30¬í¡A¦ý¬°¤F©È»Pì©l³]pªºÅ޿褣²Å¡A©Ò¥H¦A»Pµ{¦¡¤Hû°Q½×¡A¸g½T»{¦¹ÅÞ¿è¨Ã¥¼¹HIì©l³]p·§©À¡A«K½Ðµ{¦¡¤Hû×§ï¨äQuery¡C
¦¹¨Ò¥u¬OQuery ½Õ¾ãªº¤@¤p³¡¥÷¡A¹ê¾Ô¤¤ªº¨Ò¤l¤Q¤ÀÁcÂø¡AµLªk¤@¤@¨ÒÁ|¡A¥un´x´¤¦í°ò¥»Æ[©À¡A¹ï©ó¤u¨ãµ¥¯à¼ô½m¡AÀ³¸Ó´N¯à°w¹ï¥i¯àªº°ÝÃD¡A´£¥X¦Û¤vªº·Qªk»P¸Ñµª¡C¹ï©óDBA¨Ó»¡¡A³o¤£³æ¬O¤@¶µÁc«ªº¤u§@¡A¤]¬O¤@¶µ·¥¤jªº¬D¾Ô¡AY¯à³B²z±o·í¡A½Õ¾ã±o©y¡A¹ïÓ¤H¤£³×¤]¬O¥t¤@¶µ¦¬Àò¤Î¦¨´N¡C
|