¨}¦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¡A­Y±z¤w¾\Ū¹L¡uªì±´¡v¤@¤å¡A§Ú­Ì¥i¥H°²³]±z¤w¹ïSchemaªº³]­p¦³¤F³Ì°ò¥»ªº¤F¸Ñ¡A³oùئA±N­«ÂIºK¿ý¦p¤U¡G

  1. Schema¬OSQL«ü¥O°õ¦æªºÀô¹Ò¡A¦nªºÀô¹Ò¤~¦³¦nªº®Ä²v
  2. Index¥i¥[³tSQL«ü¥Oªº¬d¸ß³t²v¡A¦ýIndexªº«Ø¥ß¥²¶·¾A±o¨ä©Ò
  3. Indexªº«Ø¥ß¥²¶·»P°õ¦æªºSQL¬Û·f°t¡A¦]¦¹¨Æ«e§¹¾ãªºSQL»`¶°Åܱo·¥¬°­«­n
  4. ²Õ¦X¦¨IndexªºÄæ¦ì¡A¥²¶·¦³¦nªº±Æ°£®ÄªG¡F­Y¬°½Æ¦XÁä¡A¦¸§Ç±Æ¦CÀ³¥H±Æ°£®ÄªG¤jªº¬°¥ý¡A»P·f°tªºSQL«ü¥O¤@¨Ö¦Ò¶q
  5. ¦Ò¶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¡F­Y¬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ªºµêÀÀªí®æ¡A­Y¯à¾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¥Ñ¤W­z¹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¥u­n¦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ªº¡A­n¦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¤W­z¨âªÌªºµ²¦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¥u­n¦b¡u¦øªA¾¹¡vºÝªºdmconfig.ini³]©w¡G

DB_AUDIT=1

«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¤@­Ó¤ë°õ¦æ¤@¦¸ªº³øªíµ{¦¡¡A­Y¦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

select c1 from t1;

¦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¥u­n¥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§Y­Yc1!=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¡A­Y¬OPredicate¬Oc1=1 or c2=2¡A¨º»ò³o«h¥u¦³¤@­ÓFactor¡A¦]¬°§Y¨Ï¬Oc1!=1¡A§AÁÙ¬O±o­n¹ïc2=2¥[¥H§PÂ_¡A¦P¼Ë¦a­Yc2!=2¡AÁÙ¬O­n¹ï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¨Ó¬Ý¡A­Yc1=1¦³10µ§¡A¦ÛµM¥Îc1ªº¯Á¤Þ¤ñ¸û¦n¡A­Y¨Ï¥Î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)¡A­n§Ö±o¦h¡C

(3)   Optimizer

OK¡A¤W­z¥H·§©À¤W¨Ó¬Ý¡A³£Áٺ⦳¹D²z¡A¦bDBMakerªº¹ê§@¤W¡A«h·|¦³¶·­n¦Ò¶qªº¦a¤è¡C§Ú­Ì¥H¤W­z¨Ò¤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¨Ò¨ÓÁ¿¡A­YÅܦ¨¡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¨Ò¨ÓÁ¿¡A­Yµ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¡A­pºâ¥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

Aªí®æ
C1 C2
1 A
2 B
3 C
Bªí®æ
C1 C2
3 E
2 F
1 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µ§¸ê®Æ)¡A­Y¬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

Aªí®æ
C1 C2
1 A
2 B
3 C
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¡A­Y¤£²Å¦X¡A­YB.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¸£¸ê·½¡A­Y¬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ªí®æ¡C­Y¬OMerged Joinªº¸Ü¡A­n¥ý¹ï¦Ê¸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©w­n§@¡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¨Ó¡A­n¹ï±½´y§¹ªºªí®æ§@Sort(¨Ï¥Î¼È¦sªí®æ)¡A¤S­nªá¤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¡A­nªá¶O³\¦hI/O°Ê§@¡AÁÙ¦³¡u²M¬~¡v°O¾ÐÅé®ÄªG¡A¦P®ÉÁÙ·|¦û¥Î¨ä¥L¨t²Î¸ê·½¡A¦ý¤@¯ëªº¬O¨S¤°»ò¥²­n¤@©w­n±N¾ã­Óªí®æªº¸ê®Æ®³¦b¤â¤Wªº¡C·Q·Q¡A­Y¬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¦ý¬O­Y¹³¤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¬O­nÁ×§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)¨Ó»¡¡A­Y¬O¹ïA¡BBªºc1Äæ¦ì¨Æ¥ý¯Á¤Þ¡A¨º»ò¦b§@Sortªº¨BÆJ®É¡A¥u­n¦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¦¹¡A­nSort¡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¬O­n±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­Óbytes­pºâ¡A³o­Ónested join³£ÁÙ¬O­nªá¤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­ÓQuery­n¨Ï¥Î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Â_¡A­Y¯à¦]¦¹±Æ°£¤£¥²­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¤@¶}©l­Y¬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ªº¸ê®Æ¡A­Y¬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»{¦¹ÅÞ¿è¨Ã¥¼¹H­I­ì©l³]­p·§©À¡A«K½Ðµ{¦¡¤H­û­×§ï¨äQuery¡C

¦¹¨Ò¥u¬OQuery ½Õ¾ãªº¤@¤p³¡¥÷¡A¹ê¾Ô¤¤ªº¨Ò¤l¤Q¤ÀÁcÂø¡AµLªk¤@¤@¨ÒÁ|¡A¥u­n´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¾Ô¡A­Y¯à³B²z±o·í¡A½Õ¾ã±o©y¡A¹ï­Ó¤H¤£³×¤]¬O¥t¤@¶µ¦¬Àò¤Î¦¨´N¡C

Copyright 2000 SYSCOM Computer Engineering Co. All rights reserved.