ãä¼åSQLæ¥è¯¢ï¼å¦ä½ååºé«æ§è½SQLè¯å¥
1ãé¦å
è¦ææç½ä»ä¹å«æ§è¡è®¡åï¼
ããæ§è¡è®¡åæ¯æ°æ®åºæ ¹æ®SQLè¯å¥åç¸å
³è¡¨çç»è®¡ä¿¡æ¯ä½åºçä¸ä¸ªæ¥è¯¢æ¹æ¡ï¼è¿ä¸ªæ¹æ¡æ¯ç±æ¥è¯¢ä¼åå¨èªå¨åæ产çæ¬å¦ä¸æ¡SQLè¯å¥å¦æç¨æ¥ä»ä¸ä¸ª10ä¸æ¡è®°å½ç表ä¸æ¥1æ¡è®°å½ï¼é£æ¥è¯¢ä¼åå¨ä¼éæ©âç´¢å¼æ¥æ¾âæ¹å¼ï¼å¦æ该表è¿è¡äºå½æ¡£ï¼å½ååªå©ä¸5000æ¡è®°å½äºï¼é£æ¥è¯¢ä¼åå¨å°±ä¼æ¹åæ¹æ¡ï¼éç¨ âå
¨è¡¨æ«æâæ¹å¼ã
ããå¯è§ï¼æ§è¡è®¡å并ä¸æ¯åºå®çï¼å®æ¯â个æ§åçâã产çä¸ä¸ªæ£ç¡®çâæ§è¡è®¡åâæ两ç¹å¾éè¦ï¼
ãã(1) SQLè¯å¥æ¯å¦æ¸
æ°å°åè¯æ¥è¯¢ä¼åå¨å®æ³å¹²ä»ä¹ï¼
ãã(2) æ¥è¯¢ä¼åå¨å¾å°çæ°æ®åºç»è®¡ä¿¡æ¯æ¯å¦æ¯ææ°çãæ£ç¡®çï¼
2ãç»ä¸SQLè¯å¥çåæ³
ãã对äºä»¥ä¸ä¸¤å¥SQLè¯å¥ï¼ç¨åºå认为æ¯ç¸åçï¼æ°æ®åºæ¥è¯¢ä¼åå¨è®¤ä¸ºæ¯ä¸åçã
ããselect * from dual
ããselect * From dual
ããå
¶å®å°±æ¯å¤§å°åä¸åï¼æ¥è¯¢åæå¨å°±è®¤ä¸ºæ¯ä¸¤å¥ä¸åçSQLè¯å¥ï¼å¿
é¡»è¿è¡ä¸¤æ¬¡è§£æãçæ2个æ§è¡è®¡åã
ããæ以ä½ä¸ºç¨åºåï¼åºè¯¥ä¿è¯ç¸åçæ¥è¯¢è¯å¥å¨ä»»ä½å°æ¹é½ä¸è´ï¼å¤ä¸ä¸ªç©ºæ ¼é½ä¸è¡ï¼
3ãä¸è¦æSQLè¯å¥åå¾å¤ªå¤æ
ããæç»å¸¸çå°ï¼ä»æ°æ®åºä¸ææå°çä¸æ¡SQLè¯å¥æå°åºæ¥æ2å¼ A4纸è¿ä¹é¿ãä¸è¬æ¥è¯´è¿ä¹å¤æçè¯å¥é常é½æ¯æé®é¢çãææ¿çè¿2页é¿çSQLè¯å¥å»è¯·æåä½è
ï¼ç»æä»è¯´æ¶é´å¤ªé¿ï¼ä»ä¸æ¶ä¹çä¸æäºãå¯æ³èç¥ï¼è¿åä½è
é½æå¯è½çç³æ¶çSQLè¯å¥ï¼æ°æ®åºä¹ä¸æ ·ä¼çç³æ¶ã
ããä¸è¬ï¼å°ä¸ä¸ªSelectè¯å¥çç»æä½ä¸ºåéï¼ç¶åä»è¯¥åéä¸åè¿è¡æ¥è¯¢ï¼è¿ç§ä¸å±åµå¥è¯å¥è¿æ¯æ¯è¾å¸¸è§çï¼ä½æ¯æ ¹æ®ç»éªï¼è¶
è¿3å±åµå¥ï¼æ¥è¯¢ä¼åå¨å°±å¾å®¹æç»åºé误çæ§è¡è®¡åãå 为å®è¢«ç»æäºãåè¿ç§ç±»ä¼¼äººå·¥æºè½çä¸è¥¿ï¼ç»ç©¶æ¯äººçå辨åè¦å·®äºï¼å¦æ人é½çæäºï¼æå¯ä»¥ä¿è¯æ°æ®åºä¹ä¼æçã
ããå¦å¤ï¼æ§è¡è®¡åæ¯å¯ä»¥è¢«éç¨çï¼è¶ç®åçSQLè¯å¥è¢«éç¨çå¯è½æ§è¶é«ãèå¤æçSQLè¯å¥åªè¦æä¸ä¸ªå符åçååå°±å¿
é¡»éæ°è§£æï¼ç¶ååæè¿ä¸å¤§å åå¾å¡å¨å
åéãå¯æ³èç¥ï¼æ°æ®åºçæçä¼ä½çä½ä¸ã
4ã使ç¨â临æ¶è¡¨âæåä¸é´ç»æ
ããç®åSQLè¯å¥çéè¦æ¹æ³å°±æ¯éç¨ä¸´æ¶è¡¨æåä¸é´ç»æï¼ä½æ¯ï¼ä¸´æ¶è¡¨ç好å¤è¿è¿ä¸æ¢è¿äºï¼å°ä¸´æ¶ç»ææåå¨ä¸´æ¶è¡¨ï¼åé¢çæ¥è¯¢å°±å¨tempdbä¸äºï¼è¿å¯ä»¥é¿å
ç¨åºä¸å¤æ¬¡æ«æ主表ï¼ä¹å¤§å¤§åå°äºç¨åºæ§è¡ä¸âå
±äº«éâé»å¡âæ´æ°éâï¼åå°äºé»å¡ï¼æé«äºå¹¶åæ§è½ã
5ã OLTPç³»ç»SQLè¯å¥å¿
é¡»éç¨ç»å®åé
ããselect * from orderheader where changetime > â2010-10-20 00:00:01â²
ããselect * from orderheader where changetime > â2010-09-22 00:00:01â²
ãã以ä¸ä¸¤å¥è¯å¥ï¼æ¥è¯¢ä¼åå¨è®¤ä¸ºæ¯ä¸åçSQLè¯å¥ï¼éè¦è§£æ两次ã
ããå¦æéç¨ç»å®åé
ããselect * from orderheader where changetime > @chgtime
ãã@chgtimeåéå¯ä»¥ä¼ å
¥ä»»ä½å¼ï¼è¿æ ·å¤§éç类似æ¥è¯¢å¯ä»¥éç¨è¯¥æ§è¡è®¡åäºï¼è¿å¯ä»¥å¤§å¤§éä½æ°æ®åºè§£æSQLè¯å¥çè´æ
ãä¸æ¬¡è§£æï¼å¤æ¬¡éç¨ï¼æ¯æé«æ°æ®åºæççååã
6ãç»å®åé窥æµ
ããäºç©é½åå¨ä¸¤é¢æ§ï¼ç»å®åé对大å¤æ°OLTPå¤çæ¯éç¨çï¼ä½æ¯ä¹æä¾å¤ã
ããæ¯å¦å¨whereæ¡ä»¶ä¸çå段æ¯âå¾æå段âçæ¶åã
ããâå¾æå段âæ该åä¸çç»å¤§å¤æ°çå¼é½æ¯ç¸åçï¼ä¸å¼ 人å£è°æ¥è¡¨ï¼å
¶ä¸âæ°æâè¿åï¼90%以ä¸é½æ¯æ±æãé£ä¹å¦æä¸ä¸ªSQLè¯å¥è¦æ¥è¯¢30å²çæ±æ人å£æå¤å°ï¼é£âæ°æâè¿åå¿
ç¶è¦è¢«æ¾å¨whereæ¡ä»¶ä¸ãè¿ä¸ªæ¶åå¦æéç¨ç»å®åé@nationä¼åå¨å¾å¤§é®é¢ã
ããè¯æ³å¦æ@nationä¼ å
¥ç第ä¸ä¸ªå¼æ¯âæ±æâï¼é£æ´ä¸ªæ§è¡è®¡åå¿
ç¶ä¼éæ©è¡¨æ«æãç¶åï¼ç¬¬äºä¸ªå¼ä¼ å
¥çæ¯âå¸ä¾æâï¼æç说âå¸ä¾æâå çæ¯ä¾å¯è½åªæä¸åä¹ä¸ï¼åºè¯¥éç¨ç´¢å¼æ¥æ¾ãä½æ¯ï¼ç±äºéç¨äºç¬¬ä¸æ¬¡è§£æçâæ±æâçé£ä¸ªæ§è¡è®¡åï¼é£ä¹ç¬¬äºæ¬¡ä¹å°éç¨è¡¨æ«ææ¹å¼ãè¿ä¸ªé®é¢å°±æ¯èåçâç»å®åé窥æµâï¼å»ºè®®å¯¹äºâå¾æå段âä¸è¦éç¨ç»å®åéã
7ã åªå¨å¿
è¦çæ
åµä¸æ使ç¨begin tran
ããSQL Serverä¸ä¸å¥SQLè¯å¥é»è®¤å°±æ¯ä¸ä¸ªäºå¡ï¼å¨è¯¥è¯å¥æ§è¡å®æåä¹æ¯é»è®¤commitçãå
¶å®ï¼è¿å°±æ¯begin trançä¸ä¸ªæå°åçå½¢å¼ï¼å¥½æ¯å¨æ¯å¥è¯å¥å¼å¤´éå«äºä¸ä¸ªbegin tranï¼ç»ææ¶éå«äºä¸ä¸ªcommitã
ããæäºæ
åµä¸ï¼æ们éè¦æ¾å¼å£°æbegin tranï¼æ¯å¦åâæãå ãæ¹âæä½éè¦åæ¶ä¿®æ¹å 个表ï¼è¦æ±è¦ä¹å 个表é½ä¿®æ¹æåï¼è¦ä¹é½ä¸æåãbegin tran å¯ä»¥èµ·å°è¿æ ·çä½ç¨ï¼å®å¯ä»¥æè¥å¹²SQLè¯å¥å¥å¨ä¸èµ·æ§è¡ï¼æååä¸èµ·commitã好å¤æ¯ä¿è¯äºæ°æ®çä¸è´æ§ï¼ä½ä»»ä½äºæ
é½ä¸æ¯å®ç¾æ 缺çãBegin tranä»åºç代价æ¯å¨æ交ä¹åï¼ææSQLè¯å¥éä½çèµæºé½ä¸è½éæ¾ï¼ç´å°commitæã
ããå¯è§ï¼å¦æBegin tranå¥ä½çSQLè¯å¥å¤ªå¤ï¼é£æ°æ®åºçæ§è½å°±ç³ç³äºãå¨è¯¥å¤§äºå¡æ交ä¹åï¼å¿
ç¶ä¼é»å¡å«çè¯å¥ï¼é æblockå¾å¤ã
ããBegin tran使ç¨çååæ¯ï¼å¨ä¿è¯æ°æ®ä¸è´æ§çåæä¸ï¼begin tran å¥ä½çSQLè¯å¥è¶å°è¶å¥½ï¼æäºæ
åµä¸å¯ä»¥éç¨è§¦åå¨åæ¥æ°æ®ï¼ä¸ä¸å®è¦ç¨begin tranã
8ãä¸äºSQLæ¥è¯¢è¯å¥åºå ä¸nolock
ããå¨SQLè¯å¥ä¸å nolockæ¯æé«SQL Server并åæ§è½çéè¦æ段ï¼å¨oracleä¸å¹¶ä¸éè¦è¿æ ·åï¼å 为oracleçç»ææ´ä¸ºåçï¼æundo表空é´ä¿åâæ°æ®åå½±âï¼è¯¥æ°æ®å¦æå¨ä¿®æ¹ä¸è¿æªcommitï¼é£ä¹ä½ 读å°çæ¯å®ä¿®æ¹ä¹åçå¯æ¬ï¼è¯¥å¯æ¬æ¾å¨undo表空é´ä¸ãè¿æ ·ï¼oracleç读ãåå¯ä»¥åå°äºä¸å½±åï¼è¿ä¹æ¯oracle 广å称èµçå°æ¹ã
ããSQL Server ç读ãåæ¯ä¼ç¸äºé»å¡çï¼ä¸ºäºæé«å¹¶åæ§è½ï¼å¯¹äºä¸äºæ¥è¯¢ï¼å¯ä»¥å ä¸nolockï¼è¿æ ·è¯»çæ¶åå¯ä»¥å
许åï¼ä½ç¼ºç¹æ¯å¯è½è¯»å°æªæ交çèæ°æ®ã
ä½¿ç¨ nolockæ3æ¡ååã
ãã(1) æ¥è¯¢çç»æç¨äºâæãå ãæ¹âçä¸è½å nolock ï¼
ãã(2) æ¥è¯¢ç表å±äºé¢ç¹åç页åè£çï¼æ
ç¨nolock ï¼
ãã(3) 使ç¨ä¸´æ¶è¡¨ä¸æ ·å¯ä»¥ä¿åâæ°æ®åå½±âï¼èµ·å°ç±»ä¼¼oracleçundo表空é´çåè½ï¼
ããè½éç¨ä¸´æ¶è¡¨æé«å¹¶åæ§è½çï¼ä¸è¦ç¨nolock ã
9ãèéç´¢å¼æ²¡æ建å¨è¡¨ç顺åºå段ä¸ï¼è¯¥è¡¨å®¹æåç页åè£
ããæ¯å¦è®¢å表ï¼æ订åç¼å·orderidï¼ä¹æ客æ·ç¼å·contactidï¼é£ä¹èéç´¢å¼åºè¯¥å å¨åªä¸ªå段ä¸å¢ï¼å¯¹äºè¯¥è¡¨ï¼è®¢åç¼å·æ¯é¡ºåºæ·»å çï¼å¦æå¨orderidä¸å èéç´¢å¼ï¼æ°å¢çè¡é½æ¯æ·»å å¨æ«å°¾ï¼è¿æ ·ä¸å®¹æç»å¸¸äº§ç页åè£ãç¶èï¼ç±äºå¤§å¤æ°æ¥è¯¢é½æ¯æ ¹æ®å®¢æ·ç¼å·æ¥æ¥çï¼å æ¤ï¼å°èéç´¢å¼å å¨contactidä¸æææä¹ãècontactid对äºè®¢å表èè¨ï¼å¹¶é顺åºå段ã
ããæ¯å¦âå¼ ä¸âçâcontactidâæ¯001ï¼é£ä¹âå¼ ä¸âç订åä¿¡æ¯å¿
é¡»é½æ¾å¨è¿å¼ 表ç第ä¸ä¸ªæ°æ®é¡µä¸ï¼å¦æä»å¤©âå¼ ä¸âæ°ä¸äºä¸ä¸ªè®¢åï¼é£è¯¥è®¢åä¿¡æ¯ä¸è½æ¾å¨è¡¨çæåä¸é¡µï¼èæ¯ç¬¬ä¸é¡µï¼å¦æ第ä¸é¡µæ¾æ»¡äºå¢ï¼å¾æ±æï¼è¯¥è¡¨æææ°æ®é½è¦å¾å移å¨ä¸ºè¿æ¡è®°å½è
¾å°æ¹ã
ããSQL Serverçç´¢å¼åOracleçç´¢å¼æ¯ä¸åçï¼SQL Serverçèéç´¢å¼å®é
ä¸æ¯å¯¹è¡¨æç
§èéç´¢å¼å段ç顺åºè¿è¡äºæåºï¼ç¸å½äºoracleçç´¢å¼ç»ç»è¡¨ãSQL Serverçèéç´¢å¼å°±æ¯è¡¨æ¬èº«çä¸ç§ç»ç»å½¢å¼ï¼æ以å®çæçæ¯é常é«çãä¹æ£å 为æ¤ï¼æå
¥ä¸æ¡è®°å½ï¼å®çä½ç½®ä¸æ¯é便æ¾çï¼èæ¯è¦æç
§é¡ºåºæ¾å¨è¯¥æ¾çæ°æ®é¡µï¼å¦æé£ä¸ªæ°æ®é¡µæ²¡æ空é´äºï¼å°±å¼èµ·äºé¡µåè£ãæ以å¾æ¾ç¶ï¼èéç´¢å¼æ²¡æ建å¨è¡¨ç顺åºå段ä¸ï¼è¯¥è¡¨å®¹æåç页åè£ã
ããæ¾ç»ç¢°å°è¿ä¸ä¸ªæ
åµï¼ä¸ä½å¥ä»¬çæå¼ è¡¨é建索å¼åï¼æå
¥çæç大å¹
ä¸éäºã估计æ
åµå¤§æ¦æ¯è¿æ ·çã该表çèéç´¢å¼å¯è½æ²¡æ建å¨è¡¨ç顺åºå段ä¸ï¼è¯¥è¡¨ç»å¸¸è¢«å½æ¡£ï¼æ以该表çæ°æ®æ¯ä»¥ä¸ç§ç¨çç¶æåå¨çãæ¯å¦å¼ ä¸ä¸è¿20å¼ è®¢åï¼èæè¿3个æç订ååªæ5å¼ ï¼å½æ¡£çç¥æ¯ä¿ç3个ææ°æ®ï¼é£ä¹å¼ ä¸è¿å»ç 15å¼ è®¢åå·²ç»è¢«å½æ¡£ï¼çä¸15个空ä½ï¼å¯ä»¥å¨insertåçæ¶éæ°è¢«å©ç¨ãå¨è¿ç§æ
åµä¸ç±äºæ空ä½å¯ä»¥å©ç¨ï¼å°±ä¸ä¼åç页åè£ãä½æ¯æ¥è¯¢æ§è½ä¼æ¯è¾ä½ï¼å 为æ¥è¯¢æ¶å¿
é¡»æ«æé£äºæ²¡ææ°æ®ç空ä½ã
ããé建èéç´¢å¼åæ
åµæ¹åäºï¼å 为é建èéç´¢å¼å°±æ¯æ表ä¸çæ°æ®éæ°æåä¸éï¼åæ¥ç空ä½æ²¡æäºï¼è页çå¡«å
çåå¾é«ï¼æå
¥æ°æ®ç»å¸¸è¦åç页åè£ï¼æ以æ§è½å¤§å¹
ä¸éã
对äºèéç´¢å¼æ²¡æ建å¨é¡ºåºå段ä¸ç表ï¼æ¯å¦è¦ç»ä¸æ¯è¾ä½ç页填å
çï¼æ¯å¦è¦é¿å
é建èéç´¢å¼ï¼æ¯ä¸ä¸ªå¼å¾èèçé®é¢ï¼
10ãå nolockåæ¥è¯¢ç»å¸¸åç页åè£ç表ï¼å®¹æ产ç跳读æéå¤è¯»
ããå nolockåå¯ä»¥å¨âæãå ãæ¹âçåæ¶è¿è¡æ¥è¯¢ï¼ä½æ¯ç±äºåæ¶åçâæãå ãæ¹âï¼å¨æäºæ
åµä¸ï¼ä¸æ¦è¯¥æ°æ®é¡µæ»¡äºï¼é£ä¹é¡µåè£ä¸å¯é¿å
ï¼èæ¤æ¶nolockçæ¥è¯¢æ£å¨åçï¼æ¯å¦å¨ç¬¬100页已ç»è¯»è¿çè®°å½ï¼å¯è½ä¼å 为页åè£èåå°ç¬¬101页ï¼è¿æå¯è½ä½¿å¾nolockæ¥è¯¢å¨è¯»101页æ¶éå¤è¯»å°è¯¥æ¡æ°æ®ï¼äº§çâéå¤è¯»âãåçï¼å¦æå¨100页ä¸çæ°æ®è¿æ²¡è¢«è¯»å°å°±åå°99页å»äºï¼é£nolockæ¥è¯¢æå¯è½ä¼æ¼è¿è¯¥è®°å½ï¼äº§çâ跳读âã
ããä¸é¢æå°çå¥ä»¬ï¼å¨å äºnolockåä¸äºæä½åºç°æ¥éï¼ä¼°è®¡æå¯è½å 为nolockæ¥è¯¢äº§çäºéå¤è¯»ï¼2æ¡ç¸åçè®°å½å»æå
¥å«ç表ï¼å½ç¶ä¼åç主é®å²çªã
11ã使ç¨likeè¿è¡æ¨¡ç³æ¥è¯¢æ¶åºæ³¨æ
ããæçæ¶åä¼éè¦è¿è¡ä¸äºæ¨¡ç³æ¥è¯¢æ¯å¦
ããselect * from contact where username like â%yue%â
ããå
³é®è¯%yue%ï¼ç±äºyueåé¢ç¨å°äºâ%âï¼å æ¤è¯¥æ¥è¯¢å¿
ç¶èµ°å
¨è¡¨æ«æï¼é¤éå¿
è¦ï¼å¦åä¸è¦å¨å
³é®è¯åå %ï¼
12ãæ°æ®ç±»åçéå¼è½¬æ¢å¯¹æ¥è¯¢æççå½±å
sql server2000çæ°æ®åºä¸çç¨åºå¨æ交sqlè¯å¥çæ¶åï¼æ²¡æ使ç¨å¼ºç±»åæ交è¿ä¸ªå段çå¼ï¼ç±sql server 2000èªå¨è½¬æ¢æ°æ®ç±»åï¼ä¼å¯¼è´ä¼ å
¥çåæ°ä¸ä¸»é®å段类åä¸ä¸è´ï¼è¿ä¸ªæ¶åsql server 2000å¯è½å°±ä¼ä½¿ç¨å
¨è¡¨æ«æãSql2005ä¸æ²¡æåç°è¿ç§é®é¢ï¼ä½æ¯è¿æ¯åºè¯¥æ³¨æä¸ä¸ã
13ãSQL Server 表è¿æ¥çä¸ç§æ¹å¼
ãã(1) Merge Join
ãã(2) Nested Loop Join
ãã(3) Hash Join
ããSQL Server 2000åªæä¸ç§joinæ¹å¼ââNested Loop Joinï¼å¦æAç»æéè¾å°ï¼é£å°±é»è®¤ä½ä¸ºå¤è¡¨ï¼Aä¸æ¯æ¡è®°å½é½è¦å»Bä¸æ«æä¸éï¼å®é
æ«è¿çè¡æ°ç¸å½äºAç»æéè¡æ°x Bç»æéè¡æ°ãæ以å¦æ两个ç»æéé½å¾å¤§ï¼é£Joinçç»æå¾ç³ç³ã
ããSQL Server 2005æ°å¢äºMerge Joinï¼å¦æA表åB表çè¿æ¥å段æ£å¥½æ¯èéç´¢å¼æå¨å段ï¼é£ä¹è¡¨ç顺åºå·²ç»æ好ï¼åªè¦ä¸¤è¾¹æ¼ä¸å»å°±è¡äºï¼è¿ç§joinçå¼éç¸å½äºA表çç»æéè¡æ°å ä¸B表çç»æéè¡æ°ï¼ä¸ä¸ªæ¯å ï¼ä¸ä¸ªæ¯ä¹ï¼å¯è§merge join çææè¦æ¯Nested Loop Join好å¤äºã
ããå¦æè¿æ¥çå段ä¸æ²¡æç´¢å¼ï¼é£SQL2000çæçæ¯ç¸å½ä½çï¼èSQL2005æä¾äºHash joinï¼ç¸å½äºä¸´æ¶ç»Aï¼B表çç»æéå ä¸ç´¢å¼ï¼å æ¤SQL2005çæçæ¯SQL2000æå¾å¤§æé«ï¼æ认为ï¼è¿æ¯ä¸ä¸ªéè¦çåå ã
ãã
ããæ»ç»ä¸ä¸ï¼å¨è¡¨è¿æ¥æ¶è¦æ³¨æ以ä¸å ç¹ï¼
ãã(1) è¿æ¥å段尽ééæ©èéç´¢å¼æå¨çå段
ãã(2) ä»ç»èèwhereæ¡ä»¶ï¼å°½éåå°AãB表çç»æé
ãã(3) å¦æå¾å¤joinçè¿æ¥å段é½ç¼ºå°ç´¢å¼ï¼èä½ è¿å¨ç¨SQL Server 2000ï¼èµ¶ç´§å级å§ã
温馨提示:答案为网友推荐,仅供参考