ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>爱久久·www,亚洲自拍偷拍区,亚洲一区二区三区四区五区黄http://www.aygfsteel.com/allrounder/zh-cnMon, 04 Aug 2025 16:48:37 GMTMon, 04 Aug 2025 16:48:37 GMT60SQL Server数据库完¾ŸŽä¼˜åŒ–详解( 转蝲åQ?/title><link>http://www.aygfsteel.com/allrounder/articles/356456.html</link><dc:creator>[ 王志ä¼?]</dc:creator><author>[ 王志ä¼?]</author><pubDate>Sat, 13 Aug 2011 04:41:00 GMT</pubDate><guid>http://www.aygfsteel.com/allrounder/articles/356456.html</guid><wfw:comment>http://www.aygfsteel.com/allrounder/comments/356456.html</wfw:comment><comments>http://www.aygfsteel.com/allrounder/articles/356456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/allrounder/comments/commentRss/356456.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/allrounder/services/trackbacks/356456.html</trackback:ping><description><![CDATA[SQL Server数据库如下方法来优化查询 :<br /><br />  1、把数据、日志、烦引放åˆîC¸åŒçš„I/O讑֤‡ä¸Šï¼Œå¢žåŠ è¯Õd–速度åQŒä»¥å‰å¯ä»¥å°†Tempdb应放在RAID0上,SQL2000不在支持。数据量(ž®ºå¯¸)­‘Šå¤§åQŒæé«˜I(y¨¨)/O­‘Šé‡è¦?<br /><br />  2、纵向、横向分割表åQŒå‡ž®‘表的尺å¯?sp_spaceuse)<br /><br />  3、升¾U§ç¡¬ä»?br /><br />  4、根据查询条ä»?建立索引,优化索引、优化访问方式,限制¾l“果集的数据量。注意填充因子要适当(最好是使用默认å€?)。烦引应该尽量小åQŒä‹É用字节数ž®çš„列徏索引å¥?参照索引的创å»?,不要å¯ÒŽ(gu¨©)œ‰é™çš„几个值的字段建单一索引如性别字段<br /><br />  5、提高网é€?<br /><br />  6、扩大服务器的内å­?Windows 2000å’ŒSQL server 2000能支æŒ?-8G的内存。配¾|®è™šæ‹Ÿå†…存:(x¨¬)虚拟内存大小应基于计½Ž—æœºä¸ŠåÆˆå‘è¿è¡Œçš„æœåŠ¡˜q›è¡Œé…ç½®ã€‚运è¡?nbsp;Microsoft SQL Server? 2000 æ—Óž¼Œå¯è€ƒè™‘ž®†è™šæ‹Ÿå†…存大ž®è®¾¾|®äØ“(f¨´)计算æœÞZ¸­å®‰è£…的物理内存的 1.5 å€ã€‚如果另外安装了全文‹‚€ç´¢åŠŸèƒ½ï¼Œòq¶æ‰“½Ž—运è¡?nbsp;Microsoft æœçƒ¦æœåŠ¡ä»¥ä¾¿æ‰§è¡Œå…¨æ–‡ç´¢å¼•å’ŒæŸ¥è¯¢ï¼Œå¯è€ƒè™‘åQšå°†è™šæ‹Ÿå†…å­˜å¤§å°é…ç½®ä¸ø™‡³ž®‘是计算æœÞZ¸­å®‰è£…的物理内存的 3 å€ã€‚å°† SQL Server max server memory æœåŠ¡å™¨é…¾|®é€‰é¡¹é…ç½®ä¸ºç‰©ç†å†…存的 1.5 å€?虚拟内存大小讄¡½®çš„一å?ã€?br /><br />  7、增加服务器 CPU个数;但是必须明白òq¶è¡Œå¤„理串行处理更需要资源例如内存。ä‹Éç”¨åÆˆè¡Œè¿˜æ˜¯ä¸²è¡Œç¨‹æ˜¯MsSQL自动评估选择的。单个ä“Q务分解成多个ä»ÕdŠ¡åQŒå°±å¯ä»¥åœ¨å¤„理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行åQŒSQL SERVERæ ÒŽ(gu¨©)®¾pȝ»Ÿçš„负载情况决定最优的òq¶è¡Œ½{‰çñ”åQŒå¤æ‚的需要消耗大量的CPU的查询最适合òq¶è¡Œå¤„理。但是更新操作Update,InsertåQ?nbsp;Delete˜q˜ä¸èƒ½åƈ行处理ã€?br /><br />  8、如果是使用like˜q›è¡ŒæŸ¥è¯¢çš„话åQŒç®€å•的使用index是不行的åQŒä½†æ˜¯å…¨æ–‡çƒ¦å¼•,耗空间ã€?nbsp;like 'a%' ä½¿ç”¨ç´¢å¼• like '%a' ä¸ä‹É用烦引用 like '%a%' æŸ¥è¯¢æ—Óž¼ŒæŸ¥è¯¢è€—时和字ŒDµå€¼æ€»é•¿åº¦æˆæ­£æ¯”,所以不能用CHAR¾cÕdž‹åQŒè€Œæ˜¯VARCHAR。对于字ŒD늚„值很长的建全文烦引ã€?br /><br />  9、DB Server å’ŒAPPLication Server åˆ†ç¦»;OLTPå’ŒOLAP分离<br /><br />  10、分布式分区视图可用于实现数据库服务器联合体。联合体是一¾l„分开½Ž¡ç†çš„æœåС噍åQŒä½†å®ƒä»¬ç›æ€º’协作分担¾pȝ»Ÿçš„处理负荗÷€‚è¿™¿Ué€šè¿‡åˆ†åŒºæ•°æ®å½¢æˆæ•°æ®åº“服务器联合体的机制能够扩大一¾l„服务器åQŒä»¥æ”¯æŒå¤§åž‹çš„多å±?nbsp;Web ç«™ç‚¹çš„处理需要。有å…Ïx›´å¤šä¿¡æ¯ï¼Œå‚见设计联合数据库服务器ã€?参照SQL帮助文äšg'分区视图')<br /><br />  a、在实现分区视图之前åQŒå¿…™åÕd…ˆæ°´åã^分区è¡?br /><br />  b、在创徏成员表后åQŒåœ¨æ¯ä¸ªæˆå‘˜æœåŠ¡å™¨ä¸Šå®šä¹‰ä¸€ä¸ªåˆ†å¸ƒå¼åˆ†åŒºè§†å›¾åQŒåƈ且每个视囑օ·æœ‰ç›¸åŒçš„åç§°ã€‚è¿™æ øP¼Œå¼•ç”¨åˆ†å¸ƒå¼åˆ†åŒø™§†å›‘֐çš„æŸ¥è¯¢å¯ä»¥åœ¨ä»ÖM½•一个成员服务器上运行。系¾lŸæ“ä½œå¦‚åŒæ¯ä¸ªæˆå‘˜æœåŠ¡å™¨ä¸Šéƒ½æœ‰ä¸€ä¸ªåŽŸå§‹è¡¨çš„å¤æœ¬ä¸€æ øP¼Œä½†å…¶å®žæ¯ä¸ªæœåŠ¡å™¨ä¸Šåªæœ‰ä¸€ä¸ªæˆå‘˜è¡¨å’Œä¸€ä¸ªåˆ†å¸ƒå¼åˆ†åŒºè§†å›¾ã€‚æ•°æ®çš„ä½ç½®å¯¹åº”ç”¨ç¨‹åºæ˜¯é€æ˜Žçš„ã€?br /><br />  11、重建烦å¼?nbsp;DBCC REINDEX ,DBCC INDEXDEFRAG,收羃数据和日å¿?nbsp;DBCC SHRINKDB,DBCC SHRINKFILE. è®„¡½®è‡ªåŠ¨æ”¶ç¾ƒæ—¥å¿—.对于大的数据库不要设¾|®æ•°æ®åº“自动增长åQŒå®ƒä¼?x¨¬)降低服务器的性能。在T-sql的写法上有很大的讲究åQŒä¸‹é¢åˆ—出常见的要点åQšé¦–先,DBMS处理查询计划的过½E‹æ˜¯˜q™æ ·çš„:(x¨¬)<br /><br />  1ã€?nbsp;查询语句的词法、语法检æŸ?br /><br />  2ã€?nbsp;ž®†è¯­å¥æäº¤ç»™DBMS的查询优化器<br /><br />  3ã€?nbsp;优化器做代数优化和存取èµ\径的优化<br /><br />  4ã€?nbsp;由预¾~–译模块生成查询规划<br /><br />  5ã€?nbsp;然后在合适的旉™—´æäº¤¾l™ç³»¾lŸå¤„理执è¡?br /><br />  6ã€?nbsp;最后将执行¾l“æžœ˜q”回¾l™ç”¨æˆ·å…¶‹Æ¡ï¼Œçœ‹ä¸€ä¸‹SQL SERVER的数据存攄¡š„¾l“æž„åQšä¸€ä¸ªé¡µé¢çš„大小ä¸?K(8060)字节åQ?ä¸ªé¡µé¢äØ“(f¨´)一个盘区,按照Bæ ?w¨¨i)存放ã€?br /><br />  12.commitå’Œrollback的区åˆ?nbsp;Rollback:回滚所有的事物ã€?nbsp;Commit:提交当前的事ç‰? æ²¡æœ‰å¿…要在动态SQL里写事物åQŒå¦‚果要写请写在外面如:(x¨¬) begin tran exec(@s) commit trans æˆ–者将动态SQL å†™æˆå‡½æ•°æˆ–者存储过½E‹ã€?br /><br />  13、在查询Select语句中用Where字句限制˜q”回的行æ•?避免表扫æ?如果˜q”回不必要的数据åQŒæµªè´¹äº†æœåŠ¡å™¨çš„I/O资源åQŒåŠ é‡äº†¾|‘络的负担降低性能。如果表很大åQŒåœ¨è¡¨æ‰«æçš„æœŸé—´ž®†è¡¨é”ä½åQŒç¦æ­¢å…¶ä»–的联接讉K—®è¡?后果严重ã€?br /><br />  14、SQL的注释申明对执行没有ä»ÖM½•影响<br /><br />  15、尽可能不ä‹É用光标,它占用大量的资源。如果需要row-by-row地执行,ž®½é‡é‡‡ç”¨éžå…‰æ ‡æŠ€æœ?如:(x¨¬)在客æˆïL(f¨¥ng)«¯å¾ªçޝåQŒç”¨ä¸´æ—¶è¡¨ï¼ŒTable变量åQŒç”¨å­æŸ¥è¯¢ï¼Œç”¨Case语句½{‰ç­‰ã€‚游标可以按照它所支持的提取选项˜q›è¡Œåˆ†ç±»åQ?nbsp;只进 å¿…须按照从第一行到最后一行的™åºåºæå–行ã€? <p>FETCH NEXT æ˜¯å”¯ä¸€å…è®¸çš„æå–操ä½?也是默认方式。可滚动性可以在游标中ä“Q何地斚wšæœºæå–ä“Q意行。游标的技术在SQL2000下变得功能很强大åQŒä»–的目的是支持循环。有四个òq¶å‘选项 READ_ONLYåQšä¸å…è®¸é€šè¿‡æ¸¸æ ‡å®šä½æ›´æ–°(Update)åQŒä¸”在组成结果集的行中没有锁ã€?nbsp;OPTIMISTIC WITH valueS:乐观òq¶å‘æŽ§åˆ¶æ˜¯äº‹åŠ¡æŽ§åˆ¶ç†è®ºçš„ä¸€ä¸ªæ ‡å‡†éƒ¨åˆ†ã€‚ä¹è§‚åÆˆå‘æŽ§åˆ¶ç”¨äºŽè¿™æ ïL(f¨¥ng)š„æƒ…åÅžåQŒå³åœ¨æ‰“开游标å?qi¨¢ng)更新行的间隔中åQŒåªæœ‰å¾ˆž®çš„æœÞZ¼š(x¨¬)让第二个用户更新某一行。当某个游标以此选项打开æ—Óž¼Œæ²¡æœ‰é”æŽ§åˆ¶å…¶ä¸­çš„行,˜q™å°†æœ‰åŠ©äºŽæœ€å¤§åŒ–å…¶å¤„ç†èƒ½åŠ›ã€‚å¦‚æžœç”¨æˆ¯‚¯•图修æ”ÒŽ(gu¨©)Ÿä¸€è¡Œï¼Œåˆ™æ­¤è¡Œçš„当前å€ég¼š(x¨¬)与最后一‹Æ¡æå–æ­¤è¡Œæ—¶èŽ·å–çš„å€ÆD¿›è¡Œæ¯”较。如果ä“Q何值发生改变,则服务器ž®×ƒ¼š(x¨¬)知道其他人已更新了此行,òq¶ä¼š(x¨¬)˜q”回一个错误。如果值是一æ ïL(f¨¥ng)š„åQŒæœåС噍ž®±æ‰§è¡Œä¿®æ”V€‚选择˜q™ä¸ªòq¶å‘选项OPTIMISTIC WITH ROW VERSIONING:æ­¤ä¹è§‚åÆˆå‘æŽ§åˆ‰™€‰é¡¹åŸÞZºŽè¡Œç‰ˆæœ¬æŽ§åˆ¶ã€‚ä‹É用行版本控制åQŒå…¶ä¸­çš„表必™åÕd…·æœ‰æŸ¿Uç‰ˆæœ¬æ ‡è¯†ç¬¦åQŒæœåŠ¡å™¨å¯ç”¨å®ƒæ¥¼‹®å®šè¯¥è¡Œåœ¨è¯»å…¥æ¸¸æ ‡åŽæ˜¯å¦æœ‰æ‰€æ›´æ”¹ã€‚在 SQL Server ä¸­ï¼Œ˜q™ä¸ªæ€§èƒ½ç”?nbsp;timestamp æ•°æ®¾cÕdž‹æä¾›åQŒå®ƒæ˜¯ä¸€ä¸ªäºŒ˜q›åˆ¶æ•°å­—åQŒè¡¨½Cºæ•°æ®åº“中更改的相对™åºåºã€‚每个数据库都有一个全局当前旉™—´æˆ›_€û|¼š(x¨¬)@@DBTS。每‹Æ¡ä»¥ä»ÖM½•方式更改带有 timestamp åˆ—的行时åQŒSQL Server å…ˆåœ¨æ—‰™—´æˆ›_ˆ—中存储当前的 @@DBTS å€û|¼Œç„¶åŽå¢žåŠ  @@DBTS çš„倹{€‚如果某 ä¸ªè¡¨å…ähœ‰ timestamp åˆ—,则时间戳ä¼?x¨¬)被记到行çñ”。服务器ž®±å¯ä»¥æ¯”较某行的当前旉™—´æˆ›_€¼å’Œä¸Šæ¬¡æå–时所存储的时间戳å€û|¼Œä»Žè€Œç¡®å®šè¯¥è¡Œæ˜¯å¦å·²æ›´æ–°ã€‚服务器不必比较所有列的å€û|¼Œåªéœ€æ¯”较 timestamp åˆ—即可。如果应用程序对没有 timestamp åˆ—çš„è¡¨è¦æ±‚åŸºäºŽè¡Œç‰ˆæœ¬æŽ§åˆ¶çš„ä¹è§‚åÆˆå‘ï¼Œåˆ™æ¸¸æ ‡é»˜è®¤äØ“(f¨´)åŸÞZºŽæ•°å€¼çš„乐观òq¶å‘控制ã€?nbsp;SCROLL LOCKS ˜q™ä¸ªé€‰é¡¹å®žçްæ‚(zh¨¨n)²è§‚òq¶å‘控制。在æ‚(zh¨¨n)²è§‚òq¶å‘控制中,在把数据库的行读入游标结果集æ—Óž¼Œåº”用½E‹åºž®†è¯•å›ùN”å®šæ•°æ®åº“行。在使用服务器游标时åQŒå°†è¡Œè¯»å…¥æ¸¸æ ‡æ—¶ä¼?x¨¬)在其上攄¡½®ä¸€ä¸ªæ›´æ–°é”ã€‚如果在事务内打开游标åQŒåˆ™è¯¥äº‹åŠ¡æ›´æ–°é”ž®†ä¸€ç›´ä¿æŒåˆ°äº‹åŠ¡è¢«æäº¤æˆ–å›žæ»š;当提取下一行时åQŒå°†é™¤åŽ»æ¸¸æ ‡é”ã€‚å¦‚æžœåœ¨äº‹åŠ¡å¤–æ‰“å¼€æ¸¸æ ‡åQŒåˆ™æå–下一行时åQŒé”ž®Þp¢«ä¸¢å¼ƒã€‚因此,每当用户需要完全的æ‚(zh¨¨n)²è§‚òq¶å‘控制æ—Óž¼Œæ¸¸æ ‡éƒ½åº”在事务内打开。更新锁ž®†é˜»æ­¢ä“Q何其它ä“Q务获取更新锁或排它锁åQŒä»Žè€Œé˜»æ­¢å…¶å®ƒä“QåŠ¡æ›´æ–°è¯¥è¡Œã€‚ç„¶è€Œï¼Œæ›´æ–°é”åÆˆä¸é˜»æ­¢å…±äº«é”åQŒæ‰€ä»¥å®ƒä¸ä¼š(x¨¬)é˜ÀL­¢å…¶å®ƒä»ÕdŠ¡è¯Õd–行,除非½W¬äºŒä¸ªä“Q务也在要求带更新锁的è¯Õd–。滚动锁æ ÒŽ(gu¨©)®åœ¨æ¸¸æ ‡å®šä¹‰çš„ Select è¯­å¥ä¸­æŒ‡å®šçš„锁提½Cºï¼Œ˜q™äº›æ¸¸æ ‡òq¶å‘选项可以生成滚动锁。滚动锁在提取时在每行上获取åQŒåƈ保持åˆîC¸‹‹Æ¡æå–æˆ–è€…æ¸¸æ ‡å…³é—­ï¼Œä»¥å…ˆå‘ç”Ÿè€…äØ“(f¨´)准。下‹Æ¡æå–æ—¶åQŒæœåŠ¡å™¨ä¸ºæ–°æå–ä¸­çš„è¡ŒèŽ·å–æ»šåŠ¨é”åQŒåƈ释放上次提取中行的滚动锁。滚动锁独立于事务锁åQŒåƈ可以保持åˆîC¸€ä¸ªæäº¤æˆ–回滚操作之后。如果提交时关闭游标的选项为关åQŒåˆ™ COMMIT è¯­å¥òq¶ä¸å…³é—­ä»ÖM½•打开的游标,而且滚动锁被保留到提交之后,以维护对所提取数据的隔¼›…R€‚所获取滚动锁的¾cÕdž‹å–å†³äºŽæ¸¸æ ‡åÆˆå‘é€‰é¡¹å’Œæ¸¸æ ?nbsp;Select è¯­å¥ä¸­çš„锁提½Cºã€‚锁提示 åªè¯» ä¹è§‚æ•°å€?nbsp;乐观行版本控åˆ?nbsp;锁定无提½C?nbsp;未锁å®?nbsp;未锁å®?nbsp;未锁å®?nbsp;æ›´æ–° NOLOCK æœªé”å®?nbsp;未锁定未锁定 æœªé”å®?nbsp;HOLDLOCK å…׃ín å…׃ín å…׃ín æ›´æ–° UPDLOCK é”™è¯¯ æ›´æ–° æ›´æ–° æ›´æ–° TABLOCKX é”™è¯¯ æœªé”å®?nbsp;未锁定更新其å®?nbsp;未锁å®?nbsp;未锁å®?nbsp;未锁å®?nbsp;æ›´æ–° *指定 NOLOCK æç¤ºž®†ä‹É指定了该提示的表在游标内是只è¯Èš„ã€?br /><br /><br />  16、用Profiler来跟ítªæŸ¥è¯¢ï¼Œå¾—到查询所需的时é—ß_(d¨¢)¼Œæ‰‘Ö‡ºSQL的问题所åœ?用烦引优化器优化索引<br /><br />  17、注意UNionå’ŒUNion all çš„区别。UNION allå¥?br /><br />  18、注意ä‹É用DISTINCTåQŒåœ¨æ²¡æœ‰å¿…要时不要用åQŒå®ƒåŒUNION一样会(x¨¬)使查询变慢。重复的记录在查询里是没有问题的<br /><br />  19、查询时不要˜q”回不需要的行、列<br /><br />  20、用sp_configure 'query governor cost limit'或者SET QUERY_GOVERNOR_COST_LIMIT来限制查询消耗的资源。当评估查询消耗的资源­‘…出限制æ—Óž¼ŒæœåŠ¡å™¨è‡ªåŠ¨å–æ¶ˆæŸ¥è¯?在查询之前就扼杀掉ã€?nbsp;SET LOCKTIME讄¡½®é”çš„æ—‰™—´<br /><br />  21、用select top 100 / 10 Percent æ¥é™åˆ¶ç”¨æˆ¯‚¿”回的行数或者SET ROWCOUNT来限制操作的è¡?br /><br />  22、在SQL2000以前åQŒä¸€èˆ¬ä¸è¦ç”¨å¦‚下的字å? "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", and "LIKE '%500'"åQŒå› ä¸ÞZ»–们不走烦引全是表扫描。也不要在Where字句中的列名加函敎ͼŒå¦‚ConvertåQŒsubstring½{?如果必须用函数的时候,创徏计算列再创徏索引来替ä»?˜q˜å¯ä»¥å˜é€šå†™æ³•:(x¨¬)Where SUBSTRING(firstname,1,1) = 'm'æ”¹äØ“(f¨´)Where firstname like 'm%'(索引扫描)åQŒä¸€å®šè¦ž®†å‡½æ•°å’Œåˆ—ååˆ†å¼€ã€‚åÆˆä¸”çƒ¦å¼•ä¸èƒ½å¾å¾—å¤ªå¤šå’Œå¤ªå¤§ã€‚NOT INä¼?x¨¬)多‹Æ¡æ‰«æè¡¨åQŒä‹É用EXISTS、NOT EXISTS åQŒIN , LEFT OUTER JOIN æ¥æ›¿ä»£ï¼Œç‰¹åˆ«æ˜¯å·¦˜qžæŽ¥,而Exists比INæ›´å¿«åQŒæœ€æ…¢çš„æ˜¯NOT操作.如果列的值含有空åQŒä»¥å‰å®ƒçš„烦引不起作用,现在2000的优化器能够处理了。相同的是IS NULLåQ?NOT", "NOT EXISTS", "NOT IN"能优化她åQŒè€?<>"½{‰è¿˜æ˜¯ä¸èƒ½ä¼˜åŒ–,用不到烦引ã€?br /><br />  23、ä‹É用Query AnalyzeråQŒæŸ¥çœ‹SQL语句的查询计划和评估分析是否是优化的SQL。一般的20%的代码占据了80%的资源,严重优化的重ç‚ÒŽ(gu¨©)˜¯˜q™äº›æ…¢çš„地方ã€?br /><br />  24、如果ä‹É用了IN或者OR½{‰æ—¶å‘现查询没有走烦引,使用昄¡¤ºç”Ïx˜ŽæŒ‡å®šç´¢å¼•åQ?nbsp;Select * FROM PersonMember (INDEX = IX_Title) Where processid IN ('ç”?åQ?å¥?)<br /><br />  25、将需要查询的¾l“果预先计算好放在表中,查询的时候再Select。这在SQL7.0以前是最重要的手ŒDüc€‚例如医院的住院费计½Ž—ã€?br /><br />  26、MIN() å’?nbsp;MAX()能ä‹É用到合适的索引ã€?br /><br />  27、数据库有一个原则是代码¼›ÀL•°æ®è¶Š˜q‘越好,所以优先选择Default,依次为Rules,Triggers, Constraint(¾U¦æŸå¦‚外健主健CheckUNIQUE……,数据¾cÕdž‹çš„æœ€å¤§é•¿åº¦ç­‰½{‰éƒ½æ˜¯çº¦æ?,Procedure.˜q™æ ·ä¸ä»…¾l´æŠ¤å·¥ä½œž®ï¼Œ¾~–写½E‹åºè´¨é‡é«˜ï¼Œòq¶ä¸”执行的速度快ã€?br /><br />  28、如果要插入大的二进制值到Image列,使用存储˜q‡ç¨‹åQŒåƒä¸‡ä¸è¦ç”¨å†…嵌Insert来插å…?不知JAVA是否)ã€‚å› ä¸ø™¿™æ ·åº”ç”¨ç¨‹åºé¦–å…ˆå°†äºŒè¿›åˆ¶å€ÆD{换成字符ä¸?ž®ºå¯¸æ˜¯å®ƒçš„两å€?åQŒæœåŠ¡å™¨å—åˆ°å­—ç¬¦åŽåˆž®†ä»–转换成二˜q›åˆ¶å€?存储˜q‡ç¨‹ž®±æ²¡æœ‰è¿™äº›åЍä½? æ–ÒŽ(gu¨©)³•åQšCreate procedure p_insert as insert into table(Fimage) values (@image), åœ¨å‰å°è°ƒç”¨è¿™ä¸ªå­˜å‚¨è¿‡½E‹ä¼ å…¥äºŒ˜q›åˆ¶å‚æ•°åQŒè¿™æ ·å¤„理速度明显改善ã€?br /><br />  29、Between在某些时候比IN é€Ÿåº¦æ›´å¿«,Between能够更快地根据烦引找到范围。用查询优化器可见到差别ã€?nbsp;select * from chineseresume where title in ('ç”?,'å¥?) Select * from chineseresume where between 'ç”? and 'å¥? æ˜¯ä¸€æ ïL(f¨¥ng)š„。由于inä¼?x¨¬)在比较多次åQŒæ‰€ä»¥æœ‰æ—¶ä¼š(x¨¬)慢些ã€?</p> <p> </p> <p> </p> <p>  30、在必要是对全局或者局部äÍ(f¨´)时表创徏索引åQŒæœ‰æ—¶èƒ½å¤Ÿæé«˜é€Ÿåº¦åQŒä½†ä¸æ˜¯ä¸€å®šä¼š(x¨¬)˜q™æ ·åQŒå› ä¸ºçƒ¦å¼•也耗费大量的资源。他的创建同是实际表一栗÷€?br /><br />  31、不要徏没有作用的事物例如äñ”生报表时åQŒæµªè´¹èµ„源。只有在必要使用事物时ä‹É用它ã€?br /><br />  32、用OR的字句可以分解成多个查询åQŒåƈ且通过UNION ˜qžæŽ¥å¤šä¸ªæŸ¥è¯¢ã€‚他们的速度只同是否使用索引有关,如果查询需要用到联合烦引,用UNION all执行的效率更é«?多个OR的字句没有用到烦引,改写成UNIONçš„åŞ式再试图与烦引匹配。一个关键的问题是否用到索引ã€?br /><br />  33、尽量少用视图,它的效率低。对视图操作比直接对表操作慢,可以用stored procedure来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻扑֎Ÿå§‹èµ„料的隑ֺ¦ã€‚我们看视图的本质:(x¨¬)它是存放在服务器上的被优化好了的已经产生了查询规划的SQL。对单个表检索数据时åQŒä¸è¦ä‹É用指向多个表的视图,直接从表‹‚€ç´¢æˆ–者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到òq²æ‰°.ä¸ÞZº†åŠ å¿«è§†å›¾çš„æŸ¥è¯¢ï¼ŒMsSQL增加了视囄¡ƒ¦å¼•的功能ã€?br /><br />  34、没有必要时不要用DISTINCTå’ŒORDER BYåQŒè¿™äº›åŠ¨ä½œå¯ä»¥æ”¹åœ¨å®¢æˆïL(f¨¥ng)«¯æ‰§è¡Œã€‚它们增加了额外的开销。这同UNION å’ŒUNION ALL一æ ïL(f¨¥ng)š„道理ã€?br /><br />   ã€€ã€€select top 20 ad.companyname,comid,position,ad.referenceid,worklocation, convert(varchar(10),ad.postDate,120) as postDate1,workyear,degreedescription FROM jobcn_query.dbo.COMPANYAD_query ad where referenceID in('JCNAD00329667','JCNAD132168','JCNAD00337748','JCNAD00338345',<br />83 <!----></p> <div id="wmqeeuq" class="content"><br />  'JCNAD00333138','JCNAD00303570','JCNAD00303569',<br />  'JCNAD00303568','JCNAD00306698','JCNAD00231935','JCNAD00231933',<br />  'JCNAD00254567','JCNAD00254585','JCNAD00254608',<br />  'JCNAD00254607','JCNAD00258524','JCNAD00332133','JCNAD00268618',<br />  'JCNAD00279196','JCNAD00268613') order by postdate desc <br /><br />  35、在IN后面值的列表中,ž®†å‡ºçŽ°æœ€é¢‘ç¹çš„å€¼æ”¾åœ¨æœ€å‰é¢åQŒå‡ºçŽ°å¾—æœ€ž®‘的攑֜¨æœ€åŽé¢åQŒå‡ž®‘判断的‹Æ¡æ•°ã€?br /><br />  36、当用Select INTOæ—Óž¼Œå®ƒä¼š(x¨¬)锁住¾pȝ»Ÿè¡?sysobjectsåQŒsysindexes½{‰ç­‰)åQŒé˜»å¡žå…¶ä»–çš„˜qžæŽ¥çš„存取。创å»ÞZÍ(f¨´)时表时用昄¡¤ºç”Ïx˜Žè¯­å¥åQŒè€Œä¸æ˜?nbsp;select INTO. drop table t_lxh begin tran select * into t_lxh from chineseresume where name = 'XYZ' --commit åœ¨å¦ä¸€ä¸ªè¿žæŽ¥ä¸­Select * from sysobjects可以看到 Select INTO ä¼?x¨¬)锁住系¾lŸè¡¨åQŒCreate table ä¹Ÿä¼š(x¨¬)锁系¾lŸè¡¨(不管是äÍ(f¨´)时表˜q˜æ˜¯¾pȝ»Ÿè¡?。所以千万不要在事物内ä‹É用它!!!˜q™æ ·çš„话如果是经常要用的临时表请使用实表åQŒæˆ–者äÍ(f¨´)时表变量ã€?br /><br />  37、一般在GROUP BY ä¸ªHAVING字句之前ž®Þpƒ½å‰”除多余的行åQŒæ‰€ä»¥å°½é‡ä¸è¦ç”¨å®ƒä»¬æ¥åšå‰”除行的工作。他们的执行™åºåºåº”该如下最优:(x¨¬)select çš„Where字句选择所有合适的行,Group By用来分组个统计行åQŒHaving字句用来剔除多余的分¾l„。这样Group By ä¸ªHaving的开销ž®ï¼ŒæŸ¥è¯¢å¿?对于大的数据行进行分¾l„å’ŒHaving十分消耗资源。如果Group BY的目的不包括计算åQŒåªæ˜¯åˆ†¾l„,那么用Distinctæ›´å¿«<br /><br />  38、一‹Æ¡æ›´æ–°å¤šæ¡è®°å½•比分多‹Æ¡æ›´æ–°æ¯‹Æ¡ä¸€æ¡å¿«,ž®±æ˜¯è¯´æ‰¹å¤„理å¥?br /><br />  39、少用äÍ(f¨´)时表åQŒå°½é‡ç”¨¾l“果集和Table¾cÀL€§çš„变量来代替它,Table ¾cÕdž‹çš„变量比临时表好<br /><br />  40、在SQL2000下,计算字段是可以烦引的åQŒéœ€è¦æ»¡­‘³çš„æ¡äšg如下åQ?br /><br />  a、计½Ž—å­—ŒD늚„表达是确定的<br /><br />  b、不能用在TEXT,NtextåQŒImage数据¾cÕdž‹<br /><br />  c、必™å»é…åˆ¶å¦‚下选项 ANSI_NULLS = ON, ANSI_PADDINGS = ON, …….<br /><br />  41、尽量将数据的处理工作放在服务器上,减少¾|‘络的开销åQŒå¦‚使用存储˜q‡ç¨‹ã€‚存储过½E‹æ˜¯¾~–è¯‘å¥½ã€ä¼˜åŒ–è¿‡ã€åÆˆä¸”è¢«¾l„织åˆîC¸€ä¸ªæ‰§è¡Œè§„划里、且存储在数据库中的SQL语句åQŒæ˜¯æŽ§åˆ¶‹¹è¯­­a€çš„集合,速度当然快。反复执行的动态SQL,可以使用临时存储˜q‡ç¨‹åQŒè¯¥˜q‡ç¨‹(临时è¡?被放在Tempdb中。以前由于SQL SERVER对复杂的数学计算不支持,所以不得不ž®†è¿™ä¸ªå·¥ä½œæ”¾åœ¨å…¶ä»–的层上而增加网¾lœçš„开销。SQL2000支持UDFs,现在支持复杂的数学计½Ž—,函数的返回å€ég¸è¦å¤ªå¤§ï¼Œ˜q™æ ·çš„开销很大。用戯‚‡ªå®šä¹‰å‡½æ•°è±¡å…‰æ ‡ä¸€æ äh‰§è¡Œçš„æ¶ˆè€—大量的资源åQŒå¦‚果返回大的结果采用存储过½E?br /><br />  42、不要在一句话里再三的使用相同的函敎ͼŒ‹¹ªè´¹èµ„源,ž®†ç»“果放在变量里再调用更å¿?br /><br />  43、Select COUNT(*)的效率教低,ž®½é‡å˜é€šä»–的写法,而EXISTSå¿?同时è¯äh³¨æ„åŒºåˆ«ï¼š(x¨¬) select count(Field of null) from Table å’?nbsp;select count(Field of NOT null) from Table çš„返回值是不同çš?!!<br /><br />  44、当服务器的内存够多æ—Óž¼Œé…åˆ¶¾U¿ç¨‹æ•°é‡ = æœ€å¤§è¿žæŽ¥æ•°+5åQŒè¿™æ ¯‚ƒ½å‘挥最大的效率;否则使用 é…åˆ¶¾U¿ç¨‹æ•°é‡<最大连接数启用SQL SERVER的线½E‹æ± æ¥è§£å†?如果˜q˜æ˜¯æ•°é‡ = æœ€å¤§è¿žæŽ¥æ•°+5åQŒä¸¥é‡çš„æŸå®³æœåŠ¡å™¨çš„æ€§èƒ½ã€?br /><br />  45、按照一定的‹Æ¡åºæ¥è®¿é—®ä½ çš„表。如果你先锁住表AåQŒå†é”ä½è¡¨BåQŒé‚£ä¹ˆåœ¨æ‰€æœ‰çš„存储˜q‡ç¨‹ä¸­éƒ½è¦æŒ‰ç…§è¿™ä¸ªé¡ºåºæ¥é”å®šå®ƒä»¬ã€‚如果你(不经意的)某个存储˜q‡ç¨‹ä¸­å…ˆé”å®šè¡¨BåQŒå†é”å®šè¡¨AåQŒè¿™å¯èƒ½ž®×ƒ¼š(x¨¬)坯D‡´ä¸€ä¸ªæ­»é”ã€‚如果锁定顺序没有被预先详细的设计好åQŒæ­»é”å¾ˆéš¾è¢«å‘现<br /><br />  46、通过SQL Server Performance Monitor监视相应¼‹¬äšg的负è½?nbsp;Memory: Page Faults / sec计数器如果该值偶ž®?d¨¡ng)走高,表明当时有线½E‹ç«žäº‰å†…存。如果持¾l­å¾ˆé«˜ï¼Œåˆ™å†…存可能是瓉™¢ˆã€?br /><br />  Process:<br /><br />  1ã€? DPC Time æŒ‡åœ¨èŒƒä¾‹é—´éš”æœŸé—´å¤„理器用在缓延程序调ç”?DPC)接收和提供服务的癑ֈ†æ¯”ã€?DPC æ­£åœ¨˜qè¡Œçš„䨓(f¨´)比标准间隔优先权低的间隔)ã€?nbsp;ç”׃ºŽ DPC æ˜¯ä»¥ç‰ÒŽ(gu¨©)ƒæ¨¡å¼æ‰§è¡Œçš„,DPC æ—‰™—´çš„百分比为特权时间百分比的一部分。这些时间单独计½Ž—åÆˆä¸”ä¸å±žäºŽé—´éš”è®¡ç®—æ€ÀL•°çš„一éƒ?nbsp;分。这个æ€ÀL•°æ˜„¡¤ºäº†ä½œä¸ºå®žä¾‹æ—¶é—´ç™¾åˆ†æ¯”çš„åã^均忙时ã€?br /><br />  2ã€?Processor Time计数器 如果该参数值持¾l­è¶…˜q?5%åQŒè¡¨æ˜Žç“¶é¢ˆæ˜¯CPU。可以考虑增加一个处理器或换一个更快的处理器ã€?br /><br />  3ã€? Privileged Time æŒ‡éžé—²ç½®å¤„理器时间用于特权模式的癑ֈ†æ¯”ã€?ç‰ÒŽ(gu¨©)ƒæ¨¡å¼æ˜¯äØ“(f¨´)操作¾pȝ»Ÿ¾l„äšg和操¾U늡¬ä»‰™©±åŠ¨ç¨‹åºè€Œè®¾è®¡çš„ä¸€¿Uå¤„理模式。它允许直接讉K—®¼‹¬äšg和所有内存。另一¿Uæ¨¡å¼äØ“(f¨´)用户模式åQŒå®ƒæ˜¯ä¸€¿UäØ“(f¨´)应用½E‹åºã€çŽ¯å¢ƒåˆ†¾pȝ»Ÿå’Œæ•´æ•°åˆ†¾pȝ»Ÿè®¾è®¡çš„一¿Uæœ‰é™å¤„理模式。操作系¾lŸå°†åº”用½E‹åº¾U¿ç¨‹è½¬æ¢æˆç‰¹æƒæ¨¡å¼ä»¥è®‰K—®æ“ä½œ¾pȝ»ŸæœåŠ¡)。特权时间的 % åŒ…括为间断和 DPC æä¾›æœåŠ¡çš„æ—¶é—´ã€‚ç‰¹æƒæ—¶é—´æ¯”çŽ‡é«˜å¯èƒ½æ˜¯ç”±äºŽå¤±è´¥è®¾å¤‡äñ”生的大数量的间隔而引èµïL(f¨¥ng)š„。这个计数器ž®†åã^均忙时作为样本时间的一部分昄¡¤ºã€?br /><br />  4ã€? User Time表示耗费CPU的数据库操作åQŒå¦‚排序åQŒæ‰§è¡Œaggregate functions½{‰ã€‚如果该值很高,可考虑增加索引åQŒå°½é‡ä‹É用简单的表联接,水åã^分割大表格等æ–ÒŽ(gu¨©)³•来降低该倹{€?nbsp;Physical Disk: Curretn Disk Queue Length计数器该值应不超˜q‡ç£ç›˜æ•°çš?.5~2倍。要提高性能åQŒå¯å¢žåŠ ¼‚ç›˜ã€?nbsp;SQLServer:Cache Hit Ratioè®¡æ•°å™¨è¯¥å€ÆD¶Šé«˜è¶Šå¥½ã€‚如果持¾l­ä½Žäº?0%åQŒåº”考虑增加内存ã€?nbsp;注意该参数值是从SQL Server启动后,ž®×ƒ¸€ç›´ç¯åŠ è®°æ•ŽÍ¼Œæ‰€ä»¥è¿è¡Œç»˜q‡ä¸€ŒD‰|—¶é—´åŽåQŒè¯¥å€¼å°†ä¸èƒ½åæ˜ ¾pȝ»Ÿå½“前倹{€?br />84 <!----> <div id="wmqeeuq" class="content"><br /><br /> 47、分析select emp_name form employee where salary > 3000 åœ¨æ­¤è¯­å¥ä¸­è‹¥salary是Float¾cÕdž‹çš„,则优化器对其˜q›è¡Œä¼˜åŒ–为Convert(float,3000)åQŒå› ä¸?000是个整数åQŒæˆ‘们应在编½E‹æ—¶ä½¿ç”¨3000.0而不要等˜qè¡Œæ—¶è®©DBMS˜q›è¡Œè½¬åŒ–。同样字½W¦å’Œæ•´åž‹æ•°æ®çš„è{换ã€? <p> </p> <p> 48、查询的兌™”同写的顺åº?br /><br />   ã€€ã€€select a.personMemberID, * from chineseresume a,personmember b where personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' åQˆA = B ,B = 'åïL(f¨¥ng) 'åQ?nbsp;<br />  <br />  select a.personMemberID, * from chineseresume a,personmember b where a.personMemberID = b.referenceid and a.personMemberID = 'JCNPRH39681' and b.referenceid = 'JCNPRH39681' åQˆA = B ,B = 'åïL(f¨¥ng) 'åQ?nbsp;A = 'åïL(f¨¥ng) 'åQ?nbsp;<br />  <br />  select a.personMemberID, * from chineseresume a,personmember b where b.referenceid = 'JCNPRH39681' and a.personMemberID = 'JCNPRH39681' åQˆB = 'åïL(f¨¥ng) 'åQ?nbsp;A = 'åïL(f¨¥ng) 'åQ?nbsp;<br /><br />  49ã€?br /><br />  (1)IF æ²¡æœ‰è¾“入负责äºÞZ»£ç ?nbsp;THEN code1=0 code2=9999 ELSE code1=code2=è´Ÿè´£äºÞZ»£ç ?nbsp;END IF æ‰§è¡ŒSQL语句ä¸? Select è´Ÿè´£äººå FROM P2000 Where è´Ÿè´£äºÞZ»£ç ?gt;=:code1 ANDè´Ÿè´£äºÞZ»£ç ?nbsp;<=:code2<br /><br /><clk></clk>  (2)IF æ²¡æœ‰è¾“入负责äºÞZ»£ç ?nbsp;THEN ã€€Select è´Ÿè´£äººå FROM P2000 ELSE code= è´Ÿè´£äºÞZ»£ç ?nbsp;Select è´Ÿè´£äºÞZ»£ç ?nbsp;FROM P2000 Where è´Ÿè´£äºÞZ»£ç ?:code END IF ½W¬ä¸€¿Uæ–¹æ³•只用了一条SQL语句,½W¬äºŒ¿Uæ–¹æ³•用了两条SQL语句。在没有输入负责äºÞZ»£ç æ—¶,½W¬äºŒ¿Uæ–¹æ³•显然比½W¬ä¸€¿Uæ–¹æ³•执行效率高,因䨓(f¨´)它没有限制条ä»? åœ¨è¾“入了负责äºÞZ»£ç æ—¶,½W¬äºŒ¿Uæ–¹æ³•仍然比½W¬ä¸€¿Uæ–¹æ³•效率高,不仅是少了一个限制条ä»?˜q˜å› ç›¸ç­‰˜qç®—是最快的查询˜qç®—。我们写½E‹åºä¸è¦æ€•麻çƒ?br /><br />  50、关于JOBCN现在查询分页的新æ–ÒŽ(gu¨©)³•(如下)åQŒç”¨æ€§èƒ½ä¼˜åŒ–器分析性能的瓶颈,如果在I/O或者网¾lœçš„速度上,如下的方法优化切实有效,如果在CPU或者内存上åQŒç”¨çŽ°åœ¨çš„æ–¹æ³•æ›´å¥½ã€‚è¯·åŒºåˆ†å¦‚ä¸‹çš„æ–¹æ³•ï¼Œè¯´æ˜Žç´¢å¼•­‘Šå°­‘Šå¥½ã€?br /><br />   ã€€ã€€begin <br />  <br />  DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20)) <br />  <br />  insert into @local_variable (ReferenceID) <br />  <br />  select top 100000 ReferenceID from chineseresume order by ReferenceID <br />  <br />  select * from @local_variable where Fid > 40 and fid <= 60 <br />  <br />  end å’?nbsp;<br />  <br />  begin <br />  <br />  DECLARE @local_variable table (FID int identity(1,1),ReferenceID varchar(20)) <br />  <br />  insert into @local_variable (ReferenceID) <br />  <br />  select top 100000 ReferenceID from chineseresume order by updatedate <br />  <br />  select * from @local_variable where Fid > 40 and fid <= 60 <br />  <br />  end çš„不å?nbsp;<br />  <br />  begin <br />  <br />  create table #temp (FID int identity(1,1),ReferenceID varchar(20)) <br />  <br />  insert into #temp (ReferenceID) <br />  <br />  select top 100000 ReferenceID from chineseresume order by updatedate <br />  <br />  select * from #temp where Fid > 40 and fid <= 60 drop table #temp <br />  <br />  end <br /><br /> 另附åQšå­˜å‚¨è¿‡½E‹ç¼–写经验和优化措施 FromåQšç½‘™å‰|•™å­¦ç½‘<br /><br />  一、适合读者对象:(x¨¬)数据库开发程序员åQŒæ•°æ®åº“的数据量很多åQŒæ¶‰å?qi¨¢ng)到对SP(存储˜q‡ç¨‹)的优化的™å¹ç›®å¼€å‘äh员,å¯ÒŽ(gu¨©)•°æ®åº“有浓厚兴­‘£çš„人ã€?br /><br />  二、介¾lï¼š(x¨¬)在数据库的开发过½E‹ä¸­åQŒç»å¸æ€¼š(x¨¬)遇到复杂的业务逻辑和对数据库的操作åQŒè¿™ä¸ªæ—¶å€™å°±ä¼?x¨¬)用SP来封装数据库操作。如果项目的SP较多åQŒä¹¦å†™åˆæ²¡æœ‰ä¸€å®šçš„规范åQŒå°†ä¼?x¨¬)媄响以后的¾pȝ»Ÿ¾l´æŠ¤å›°éš¾å’Œå¤§SP逻辑的难以理解,另外如果数据库的数据量大或者项目对SP的性能要求很,ž®×ƒ¼š(x¨¬)遇到优化的问题,否则速度有可能很慢,¾lè¿‡äº²èín¾léªŒåQŒä¸€ä¸ªç»˜q‡ä¼˜åŒ–过的SP要比一个性能差的SP的效率甚至高几百倍ã€?br /><br />  三、内容:(x¨¬)<br /><br />  1、开发äh员如果用到其他库的Table或ViewåQŒåŠ¡å¿…åœ¨å½“å‰åº“ä¸­å»ºç«‹View来实现跨库操作,最好不要直接ä‹Éç”?#8220;databse.dbo.table_name”åQŒå› ä¸ºsp_depends不能昄¡¤ºå‡ø™¯¥SP所使用的跨库table或viewåQŒä¸æ–¹ä¾¿æ ¡éªŒã€?br /><br />  2、开发äh员在提交SP前,必须已经使用set showplan on分析˜q‡æŸ¥è¯¢è®¡åˆ’,做过自èín的查询优化检查ã€?br /><br /><br />  3、高½E‹åº˜qè¡Œæ•ˆçއåQŒä¼˜åŒ–应用程序,在SP¾~–写˜q‡ç¨‹ä¸­åº”该注意以下几点:(x¨¬)<br /><br />  a)SQLçš„ä‹É用规范:(x¨¬)<br /><br />  i. ž®½é‡é¿å…å¤§äº‹åŠ¡æ“ä½œï¼Œæ…Žç”¨holdlock子句åQŒæé«˜ç³»¾lŸåƈ发能力ã€?br /><br />  ii. ž®½é‡é¿å…åå¤è®‰K—®åŒä¸€å¼ æˆ–几张表,ž®¤å…¶æ˜¯æ•°æ®é‡è¾ƒå¤§çš„表åQŒå¯ä»¥è€ƒè™‘先根据条件提取数据到临时表中åQŒç„¶åŽå†åšè¿žæŽ¥ã€?br /><br />  iii. ž®½é‡é¿å…ä½¿ç”¨æ¸¸æ ‡åQŒå› ä¸ºæ¸¸æ ‡çš„æ•ˆçŽ‡è¾ƒå·®åQŒå¦‚果游标操作的数据­‘…过1万行åQŒé‚£ä¹ˆå°±åº”该改写;如果使用了游标,ž®Þp¦ž®½é‡é¿å…åœ¨æ¸¸æ ‡åó@环中再进行表˜qžæŽ¥çš„æ“ä½œã€?br /><br />  iv. 注意where字句写法åQŒå¿…™å»è€ƒè™‘语句™åºåºåQŒåº”该根据烦引顺序、范围大ž®æ¥¼‹®å®šæ¡äšg子句的前后顺序,ž®½å¯èƒ½çš„让字ŒDµé¡ºåºä¸Žç´¢å¼•™åºåºç›æ€¸€è‡ß_(d¨¢)¼ŒèŒƒå›´ä»Žå¤§åˆ°å°ã€?br /><br />  v. 不要在where子句中的“=”左边˜q›è¡Œå‡½æ•°ã€ç®—术运½Ž—或其他表达式运½Ž—,否则¾pȝ»Ÿž®†å¯èƒ½æ— æ³•æ­£¼‹®ä‹É用烦引ã€?br /><br />  vi. ž®½é‡ä½¿ç”¨exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用åQŒè€Œä¸”count(1)比count(*)更有效率ã€?br /><br />  vii. ž®½é‡ä½¿ç”¨“>=”åQŒä¸è¦ä‹Éç”?#8220;>”ã€?br /><br />  viii. 注意一些or子句和union子句之间的替æ?br /><br />  ix. 注意表之间连接的数据¾cÕdž‹åQŒé¿å…ä¸åŒç±»åž‹æ•°æ®ä¹‹é—´çš„˜qžæŽ¥ã€?br /><br />  x. 注意存储˜q‡ç¨‹ä¸­å‚数和数据¾cÕdž‹çš„å…³¾p…R€?br /><br />  xi. 注意insert、update操作的数据量åQŒé˜²æ­¢ä¸Žå…¶ä»–应用冲突。如果数据量­‘…过200个数据页é?400k)åQŒé‚£ä¹ˆç³»¾lŸå°†ä¼?x¨¬)进行锁升çñ”åQŒé¡µ¾U§é”ä¼?x¨¬)升¾U§æˆè¡¨çñ”锁ã€?br /><br />  b)索引的ä‹É用规范:(x¨¬)<br /><br />  i.ã€€ç´¢å¼•çš„åˆ›å»ø™¦ä¸Žåº”用结合考虑åQŒå¾è®®å¤§çš„OLTP表不要超˜q?个烦引ã€?br /><br />  ii. ž®½å¯èƒ½çš„ä½¿ç”¨ç´¢å¼•å­—æ®µä½œäØ“(f¨´)查询条äšgåQŒå°¤å…¶æ˜¯èšç°‡ç´¢å¼•åQŒå¿…要时可以通过index index_name来强制指定烦å¼?br /><br />  iii. 避免对大表查询时˜q›è¡Œtable scanåQŒå¿…要时考虑新徏索引ã€?br /><br />  iv. 在ä‹É用烦引字ŒDµä½œä¸ºæ¡ä»¶æ—¶åQŒå¦‚果该索引是联合烦引,那么必须使用到该索引中的½W¬ä¸€ä¸ªå­—ŒDµä½œä¸ºæ¡ä»¶æ—¶æ‰èƒ½ä¿è¯¾pȝ»Ÿä½¿ç”¨è¯¥çƒ¦å¼•,否则该烦引将不会(x¨¬)被ä‹É用ã€?br /><br />  v. 要注意烦引的¾l´æŠ¤åQŒå‘¨æœŸæ€§é‡å»ºçƒ¦å¼•,重新¾~–译存储˜q‡ç¨‹ã€?br /><br />  c)tempdbçš„ä‹É用规范:(x¨¬)<br /><br />  i. ž®½é‡é¿å…ä½¿ç”¨distinct、order by、group by、having、join、cumputeåQŒå› ä¸ø™¿™äº›è¯­å¥ä¼š(x¨¬)加重tempdb的负担ã€?br /><br />  ii. 避免频繁创徏和删除äÍ(f¨´)时表åQŒå‡ž®‘ç³»¾lŸè¡¨èµ„源的消耗ã€?br /><br />  iii. 在新å»ÞZÍ(f¨´)时表æ—Óž¼Œå¦‚果一‹Æ¡æ€§æ’入数据量很大åQŒé‚£ä¹ˆå¯ä»¥ä‹É用select into代替create tableåQŒé¿å…logåQŒæé«˜é€Ÿåº¦;如果数据量不大,ä¸ÞZº†¾~“å’Œ¾pȝ»Ÿè¡¨çš„资源åQŒå¾è®®å…ˆcreate tableåQŒç„¶åŽinsertã€?br /><br />  iv. 如果临时表的数据量较大,需要徏立烦引,那么应该ž®†åˆ›å»ÞZÍ(f¨´)时表和徏立烦引的˜q‡ç¨‹æ”‘Öœ¨å•独一个子存储˜q‡ç¨‹ä¸­ï¼Œ˜q™æ ·æ‰èƒ½ä¿è¯¾pȝ»Ÿèƒ½å¤Ÿå¾ˆå¥½çš„ä‹É用到该äÍ(f¨´)时表的烦引ã€?br /><br />  v. 如果使用åˆîCº†ä¸´æ—¶è¡¨ï¼Œåœ¨å­˜å‚¨è¿‡½E‹çš„æœ€åŽåŠ¡å¿…å°†æ‰€æœ‰çš„ä¸´æ—¶è¡¨æ˜¾å¼åˆ é™¤ï¼Œå…ˆtruncate tableåQŒç„¶åŽdrop tableåQŒè¿™æ ·å¯ä»¥é¿å…ç³»¾lŸè¡¨çš„较长时间锁定ã€?br /><br />  vi. 慎用大的临时表与其他大表的连接查询和修改åQŒå‡ä½Žç³»¾lŸè¡¨è´Ÿæ‹…åQŒå› ä¸ø™¿™¿Uæ“ä½œä¼š(x¨¬)在一条语句中多次使用tempdb的系¾lŸè¡¨ã€?br /><br />  d)合理的算法ä‹É用:(x¨¬)<br /><br />  æ ÒŽ(gu¨©)®ä¸Šé¢å·²æåˆ°çš„SQL优化技术和ASE Tuning手册中的SQL优化内容,¾l“合实际应用,采用多种½Ž—法˜q›è¡Œæ¯”较,以获得消耗资源最ž®‘、效率最高的æ–ÒŽ(gu¨©)³•。具体可用ASE调优命ä×o(h¨´)åQšset statistics io on, set statistics time on , set showplan on ½{‰ã€?nbsp;<br /><br />转自åQ?a >http://fableking.iteye.com/blog/360900</a></p></div></div><img src ="http://www.aygfsteel.com/allrounder/aggbug/356456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/allrounder/" target="_blank">[ 王志ä¼?]</a> 2011-08-13 12:41 <a href="http://www.aygfsteel.com/allrounder/articles/356456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>½E‹åºå‘˜å¿…™åȝŸ¥é“çš„SQLSERVER数据库优化技å·?/title><link>http://www.aygfsteel.com/allrounder/archive/2011/08/13/356455.html</link><dc:creator>[ 王志ä¼?]</dc:creator><author>[ 王志ä¼?]</author><pubDate>Sat, 13 Aug 2011 04:34:00 GMT</pubDate><guid>http://www.aygfsteel.com/allrounder/archive/2011/08/13/356455.html</guid><wfw:comment>http://www.aygfsteel.com/allrounder/comments/356455.html</wfw:comment><comments>http://www.aygfsteel.com/allrounder/archive/2011/08/13/356455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/allrounder/comments/commentRss/356455.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/allrounder/services/trackbacks/356455.html</trackback:ping><description><![CDATA[北京联高软äšg开发有限公å?徐斌 王春æ™?<br /><br />摘要åQšæ•°æ®åº“ä¼˜åŒ–ä¸ä»…æ˜¯æ•°æ®åº“½Ž¡ç†å‘˜çš„ä»ÕdŠ¡åQŒç¨‹åºå‘˜ä¹Ÿå¿…™åȝŸ¥é“一些优化技巧,有利于开发高效的数据库系¾lŸã€?<br />关键字:(x¨¬)数据åº?优化 技å·?<br /><br />å¦‚æžœæ˜¯å›¢é˜Ÿå¼€å‘ï¼Œä½œäØ“(f¨´)½E‹åºå‘˜å¿…™åȝŸ¥é“本文描˜q°çš„æ•°æ®åº“优化技巧,如果你的saæ°´åã^比较差,那即使你再努力也些不出高效的数据库应用系¾lŸã€?<br />如果是单独开发,那就更不必说了ã€?<br /><br />多数公司的数据库½Ž¡ç†å‘?sa)是不够格的,即ä‹É拿了各种认证证äšgåQŒä¹Ÿå·®ä¸å¤šè¿˜æ˜¯åžƒåœ„¡®¡ç†å‘˜åQŒæ— éžæ˜¯å¯ä»¥æ··ä¸ªå¥½èŒä½ï¼Œå¤šæ‹¿ä¸€äº›å·¥èµ„ã€?<br />如果你所在的公司没有合格的saåQŒä½œä¸ºç¨‹åºå‘˜çš„你必须执行做许多数据库优化的工作了ã€?<br />市面上的数据库类图书也不˜q‡æ˜¯éª—钱的把戏,无非ä¸ÞZº†å‡ÞZ¹¦è€Œå‡ºä¹¦ï¼Œä¸ÞZº†å‡ºåè€Œå‡ºä¹¦ã€?<br />95åQ…以上的作者没有实è·ëŠš„¾léªŒåQ?9åQ…以上的作者没有优化的¾léªŒã€‚他们编写图书的来源无非是外文(不见得好啊)或者是互联¾|‘上的资讯ã€?<br /><br />废话不说了,开始吧。程序员¾U§åˆ«çš„优化有哪些手段åQ?<br /><br />åQ?åQ‰æ•°æ®åº“的设¾|®ï¼š(x¨¬)如果你的数据库记录数不会(x¨¬)­‘…过30万条åQŸå¦‚果你的数据库记录­‘…过100万条åQŸè¯¥å¦‚何讄¡½®æ•°æ®åº“?一个或多个åQ?<br />åQ?åQ‰æ•°æ®åº“表的讄¡½®åQšå½“你的某个数据库表记录­‘…过100万çñ”别,而且每天大量增长åQŒè¿™æ˜¯ä¸€ä¸ªä¸å¾—不考虑的问题。如果你的系¾lŸæµè§ˆé‡å¾ˆå¤§åQŒå³ä½¿æ˜¯30万条记录也是需要考虑的ã€?<br />åQ?åQ‰çƒ¦å¼•的使用åQšçƒ¦å¼•可以大大提高数据库讉K—®é€Ÿåº¦ã€‚什么时候用åQŸå“ªäº›å­—ŒDµä‹É用? <br />åQ?åQ‰å­˜å‚¨è¿‡½E‹çš„使用åQšå­˜å‚¨è¿‡½E‹ç»ˆå½’是比较好的åQŒä½†æ˜¯å¦‚果需要维护成百上千的存储˜q‡ç¨‹åQŒæœªå¿…是划算的工½E‹ã€?<br />åQ?åQ‰é«˜æ•ˆçš„分页技术:(x¨¬)数据库记录分™åµåˆ—表是大量必须使用的基本技术,怎样的分™å‰|˜¯å¿«é€Ÿçš„åQ?<br /><br />宗旨你需要从上述5个方面考虑数据库的优化ã€?<br /><br />什么时候需要数据库优化åQ?<br />åQ?åQ‰ç¼–写代码之前; <br />åQ?åQ‰ç³»¾lŸé€Ÿåº¦æ…¢äº†çš„æ—¶å€™ï¼› <br /><br />下面ž®±æ˜¯ä¸€äº›å…·ä½“的优化技巧了ã€?<br /><br /><strong>åQ?åQ‰è¶…大量记录数据库的优化技å·?/strong> <br /><br />如果你的数据库表记录有超˜q?00万çñ”别,而且不断增长中。可以采取两个手ŒDµï¼š(x¨¬) <br />½W¬ä¸€åQšå°†æ•°æ®åº“表拆分åˆîC¸åŒçš„库中åQŒæ¯”å¦?tblMEMBER ž®±å¯ä»¥æ‹†åˆ†åˆ° DB1 ä¸?DB2 中去ã€?<br />实际上,可以拆分åˆ?DB001 ... DB100 甚至更多的库中间厅R€?<br />DB1 ä¸?DB2 最好不在一块硬盘上ã€?<br />½W¬äºŒåQšå¦‚果更大量¾U§çš„æ•°æ®åQŒåˆ™æœ€å¥½æ‹†åˆ†åˆ°ä¸åŒçš„æ•°æ®åº“服务器中厅R€?<br /><br />数据库的拆分带来的是查询½{‰æ“ä½œçš„复杂性。简单地可以通过 hash 或è€?按序å?匚w…ä¸åŒçš„æ•°æ®åº“。复杂一些,应该讄¡½®ä¸€ä¸ªç‹¬ç«‹çš„应用服务器(软äšgåQ‰åè°ƒå…¶ä¸­çš„æ“ä½œã€?<br /><br /><strong>åQ?åQ‰ä¸­½{‰é‡¾U§æ•°æ®åº“的优化技å·?/strong> <br /><br />所谓中½{‰é‡¾U§æ•°æ®åº“是指数据åº?00万-500万条记录左右åQˆå•个数据库表)。这æ ïL(f¨¥ng)š„æ•°æ®åº“䨓(f¨´)了提高访问(响应åQ‰é€Ÿåº¦åQŒå¯ä»¥å°†è¡¨æ‹†åˆ†åˆ°æ›´å°çš„表。比å¦?tblMEMBER 可以拆分ä¸?tblMEMBER_00 ... tblMEMBER_99 ã€?<br />˜q™æ ·å¯ä»¥ä¿è¯æ¯ä¸ªè¡¨çš„记录æ•îC¸­‘…过50万,那速度æ˜?相当"快了ã€?<br /><br /><strong>åQ?åQ‰é¿å…ä‹É用视å›?viewport)与关è?/strong> <br /><br />视图viewportä¸Žå…³è”éƒ½æ˜¯äØ“(f¨´)了程序员处理相对复杂的数据管理提供方便的手段。万物有其利åQŒå¿…有其弊。视囑֒Œå…Œ™”提高了编½E‹æ•ˆçŽ‡ï¼Œéƒ½ä¼š(x¨¬)è¾ƒå¤§åœ°åª„å“æ•°æ®åº“çš„è®¿é—®æ•ˆçŽ‡ï¼ˆäº‹å®žä¸ŠåÆˆä¸åƒä¸€èˆ¬èµ„æ–™è¯´ä»‹ç»çš„çš„é‚£æ ·é«˜æ•ˆåQ‰ï¼Œå› æ­¤å¦‚果是web应用åQŒåˆ™å»ø™®®ä¸€èˆ¬ä¸è¦ä‹É用视图与兌™”ã€?<br /><br /><strong>åQ?åQ‰ä¸è¦å¿˜è®°çƒ¦å¼?index)也不要滥用烦å¼?index)</strong> <br /><br />索引是提高数据库效率的简单又高效的方法。只要是讄¡½®äº†æ•°æ®åº“è¡?table)åQŒå°±ä¸è¦å¿˜è®°è®„¡½®ç´¢å¼•(index)。将索引讄¡½®åœ¨ç»å¸¸ç”¨äºŽæŽ’序的字段上,其他字段ž®×ƒ¸è¦è®¾¾|®äº†ã€?<br />索引不是­‘Šå¤š­‘Šå¥½åQŒä¹Ÿä¸æ˜¯ä»€ä¹ˆå­—ŒDµéƒ½é€‚合建立索引的。数据重复性太多的字段不要讄¡½®ç´¢å¼•。比å¦?tblMEMBER çš?iSex 字段只有 0 1 两个å€û|¼Œž®×ƒ¸è¦è®¾¾|®çƒ¦å¼•ã€?<br /><br /><strong>åQ?åQ‰äºŒ˜q›åˆ¶çš?text image ½{‰å­—ŒDµåº”该单独设¾|®åˆ«çš„表ä¸?/strong> <br /><br />一般的数据库应用难免都需要保存比如描˜q°ã€å›¾ç‰‡ç­‰ä¿¡æ¯åQ›ä¸€èˆ¬æ˜q°ç±»ä¿¡æ¯ç”?text 字段åQŒå›¾ç‰‡ç±»ä¿¡æ¯ç”?image 字段åQ›è¿™é‡Œè¦è¯´çš„æ˜¯ï¼Œä¸è¦ž®†è¿™äº›å­—ŒDµä¸Žå…¶ä»–字段攑֜¨ä¸€ä¸ªè¡¨ä¸­ã€?<br />比如åQ? <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080"> 1</span><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /><span style="color: #000000">tblMEMBER<br /></span><span style="color: #008080"> 2</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />id (</span><span style="color: #000000; font-weight: bold">int</span><span style="color: #000000">)<br /></span><span style="color: #008080"> 3</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />cName (</span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">)(</span><span style="color: #800000; font-weight: bold">64</span><span style="color: #000000">)<br /></span><span style="color: #008080"> 4</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />cDescription (</span><span style="color: #000000; font-weight: bold">text</span><span style="color: #000000">)<br /></span><span style="color: #008080"> 5</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />bPhoto (</span><span style="color: #000000; font-weight: bold">image</span><span style="color: #000000">)<br /></span><span style="color: #008080"> 6</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />dDate (</span><span style="color: #000000; font-weight: bold">datetime</span><span style="color: #000000">)<br /></span><span style="color: #008080"> 7</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />ž®±åº”è¯¥æ‹†åˆ†äØ“(f¨´)3个表<br /></span><span style="color: #008080"> 8</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />tblMEMBER<br /></span><span style="color: #008080"> 9</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />id (</span><span style="color: #000000; font-weight: bold">int</span><span style="color: #000000">)<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />cName (</span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">)(</span><span style="color: #800000; font-weight: bold">64</span><span style="color: #000000">)<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />dDate (</span><span style="color: #000000; font-weight: bold">datetime</span><span style="color: #000000">)<br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />tblMEMBER_DESC<br /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />id (</span><span style="color: #000000; font-weight: bold">int</span><span style="color: #000000">)<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />cDescription (</span><span style="color: #000000; font-weight: bold">text</span><span style="color: #000000">)<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />dDate (</span><span style="color: #000000; font-weight: bold">datetime</span><span style="color: #000000">)<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />tblMEMBER_PHOTO<br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />id (</span><span style="color: #000000; font-weight: bold">int</span><span style="color: #000000">)<br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />bPhoto (</span><span style="color: #000000; font-weight: bold">image</span><span style="color: #000000">)<br /></span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />dDate (</span><span style="color: #000000; font-weight: bold">datetime</span><span style="color: #000000">)<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span></div><br /><br /><strong>åQ?åQ‰ä¸è¦ä‹É用文本类型的 id</strong> <br /><br />一般的数据库表都会(x¨¬)以一个种子字ŒDµä½œä¸ÞZ¸»é”®ã€‚可以在与不ž®‘年青的½E‹åºå‘˜æœ‹å‹æ²Ÿé€šè¿‡½E‹ä¸­åQŒå‘çŽîC»–们很喜欢用字½W¦ä¸²¾cÕdž‹çš„作为系¾lŸçš„ id 受÷€?<br />比如åQšid = XX XX XX XX ˜q™æ ·çš„å­—½W¦ä¸²åQŒæ¯ä¸¤ä¸ªä½ç½®ä»£è¡¨ä¸åŒçš„类别等含义ã€?<br />不知道是那本教材如此误äh子弟åQŒä½œå‡ø™¿™æ ïL(f¨¥ng)š„表率 :< <br />ä½œäØ“(f¨´)¾pȝ»Ÿçš?id åøP¼Œä¸€å®šè¦ä½¿ç”¨æ•°å­—型的ã€?<br /><br /><strong>åQ?åQ‰æ•°æ®åº“表table的字ŒDµfield不要太多</strong> <br /><br />本以为无需说明åQŒä¹Ÿæ˜¯å‘çŽîC¸ž®‘的朋友åQŒäØ“(f¨´)了省事,一股脑把所有的相关字段都放在一个表中间。这样做的后果便是,½E‹åºå†™è“v来简单了åQŒè¿è¡Œæ•ˆçŽ‡ä¸‹æ¥äº†ã€?<br />无论字段多少åQŒæœ‰ä¸¤ç±»å­—段是必™åȝ‹¬ç«‹å‡ºåŽÈš„åQšä¸€æ˜¯è¿›½E‹æ›´æ–°çš„字段åQŒæ¯”如文章的点击‹Æ¡æ•°å­—段iShowåQŒäºŒæ˜¯äºŒ˜q›åˆ¶æˆ–者是text字段åQ?<br /><br /><strong>åQ?åQ‰å°†å­—符ä¸?varchar)比较变成数字åž?int)比较</strong> <br /><br />每个¾pȝ»Ÿéƒ½ä¼š(x¨¬)有用æˆïL(f¨¥ng)®¡ç†ï¼Œå…¶ä¸­å¿…ç„¶æœ?æ˜ëЧ°åQŒå¯†ç ï¼Œé‚®äšg½{‰çš„字符串类型数据比较的问题。在数据库操作中åQŒå­—½W¦ä¸²æ¯”较的效率是相当低下的。因此遇到字½W¦ä¸²çš„æ¯”较,必须ž®†å…¶è½¬æ¢ä¸ºæ•°å­—型比较ã€?<br />具体做法是:(x¨¬)在数据库表中增加相应的数字字ŒDµï¼Œæ¯”如 cNickname -> iNickNumber åQŒå…¶ä¸?iNickNumber 的数å€égØ“(f¨´) cNickname çš?哈希å€û|¼ˆå¦‚何计算字符串的哈希å€û|¼Ÿè¯·å‚阅本站的其他文章åQ‰ã€?<br />通过˜q™æ ·çš„è{换,¾pȝ»Ÿæ•ˆçŽ‡å¯ä»¥æé«˜ 100 倍哦åQï¼åQ?<br /><br /><strong>åQ?åQ‰äØ“(f¨´)每个数据库表(table)讄¡½® datetime 字段</strong> <br /><br />在许多情况下åQŒå¾ˆå¤šçš„表是不需è¦?datetime 字段用于保存旉™—´çš„ã€‚æœ¬æ–‡çš„å»ø™®®æ˜¯ä½ åº”该为每个表都设¾|?datetime 字段åQŒè€Œä¸”默认å€égØ“(f¨´) getdate()ã€?<br />我们的经验是åQŒdatetime 是实敎ͼŒå ç”¨å­—节不多åQ›åœ¨˜q›è¡Œ¾pȝ»Ÿ¾l´æŠ¤åQŒè¿œ½E‹å¤‡ä»½ç­‰çŽ¯èŠ‚éƒ½ä¼š(x¨¬)发挥意想不到的效果ã€?<br /><br /><strong>åQ?0åQ‰é€‚当使用存储˜q‡ç¨‹(Stored Processing)</strong> <br /><br />存储˜q‡ç¨‹(sp)已经被大大地宣传了,本文也不例外地赞è®?d¨¡ng)R‡‡ç”¨å­˜å‚¨è¿‡½E‹ã€‚æœ¬æ–‡çš„å»ø™®®æ˜¯åªåœ¨ä¸‹åˆ—情冉|‰ä½¿ç”¨å­˜å‚¨˜q‡ç¨‹åQšä¸€æ˜¯ä¸€ä¸ªä¸šåŠ¡å¤„ç†æ˜¯äº‹åŠ¡åQŒåŒ…含了多个处理˜q‡ç¨‹åQ›äºŒæ˜¯ä¸€¿Uå¤„理被高频使用åQŒä‹É用存储过½E‹å¯ä»¥æé«˜æ•ˆçŽ‡ï¼› <br /><br /><strong>åQ?1åQ‰ä‹É用高效的分页(ination)技æœ?/strong> <br /><br />数据库记录分™åµåˆ—表是大量必须使用的基本技术,因此æœ?文徏议你在每个数据库中徏立下面的存储˜q‡ç¨‹åQ?<br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080"> 1</span><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">CREATE</span><span style="color: #000000"> </span><span style="color: #0000ff">PROCEDURE</span><span style="color: #000000"> xsp_ination<br /></span><span style="color: #008080"> 2</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />(<br /></span><span style="color: #008080"> 3</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">@tblName</span><span style="color: #000000">   </span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">(</span><span style="color: #800000; font-weight: bold">64</span><span style="color: #000000">),<br /></span><span style="color: #008080"> 4</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">@strGetFields</span><span style="color: #000000"> </span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">(</span><span style="color: #800000; font-weight: bold">256</span><span style="color: #000000">) </span><span style="color: #808080">=</span><span style="color: #000000"> "</span><span style="color: #808080">*</span><span style="color: #000000">",<br /></span><span style="color: #008080"> 5</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">@fldName</span><span style="color: #000000"> </span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">(</span><span style="color: #800000; font-weight: bold">64</span><span style="color: #000000">)</span><span style="color: #808080">=</span><span style="color: #000000">"",<br /></span><span style="color: #008080"> 6</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">@PageSize</span><span style="color: #000000">   </span><span style="color: #000000; font-weight: bold">int</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #800000; font-weight: bold">20</span><span style="color: #000000">,<br /></span><span style="color: #008080"> 7</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">@PageIndex</span><span style="color: #000000">  </span><span style="color: #000000; font-weight: bold">int</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">,<br /></span><span style="color: #008080"> 8</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">@OrderType</span><span style="color: #000000"> </span><span style="color: #000000; font-weight: bold">bit</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">,<br /></span><span style="color: #008080"> 9</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #008000">@strWhere</span><span style="color: #000000">  </span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">(</span><span style="color: #800000; font-weight: bold">256</span><span style="color: #000000">) </span><span style="color: #808080">=</span><span style="color: #000000"> ""<br /></span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />)<br /></span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">AS</span><span style="color: #000000"><br /></span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">BEGIN</span><span style="color: #000000"><br /></span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">declare</span><span style="color: #000000"> </span><span style="color: #008000">@strSQL</span><span style="color: #000000">   </span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">(</span><span style="color: #800000; font-weight: bold">1000</span><span style="color: #000000">)<br /></span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">declare</span><span style="color: #000000"> </span><span style="color: #008000">@strTmp</span><span style="color: #000000">   </span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">(</span><span style="color: #800000; font-weight: bold">110</span><span style="color: #000000">)<br /></span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">declare</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"> </span><span style="color: #000000; font-weight: bold">varchar</span><span style="color: #000000">(</span><span style="color: #800000; font-weight: bold">400</span><span style="color: #000000">)<br /></span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">SET</span><span style="color: #000000"> NOCOUNT </span><span style="color: #0000ff">ON</span><span style="color: #000000"><br /></span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> </span><span style="color: #008000">@OrderType</span><span style="color: #000000"> </span><span style="color: #808080">!=</span><span style="color: #000000"> </span><span style="color: #800000; font-weight: bold">0</span><span style="color: #000000"><br /></span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">begin</span><span style="color: #000000"><br /></span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">set</span><span style="color: #000000"> </span><span style="color: #008000">@strTmp</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> "</span><span style="color: #808080">&</span><span style="color: #000000">lt;(</span><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #ff00ff">min</span><span style="color: #000000">"<br /></span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">set</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> " </span><span style="color: #0000ff">order</span><span style="color: #000000"> </span><span style="color: #0000ff">by</span><span style="color: #000000"> </span><span style="color: #ff0000">[</span><span style="color: #ff0000">" + @fldName +"</span><span style="color: #ff0000">]</span><span style="color: #000000"> </span><span style="color: #0000ff">desc</span><span style="color: #000000">"<br /></span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">end</span><span style="color: #000000"><br /></span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">begin</span><span style="color: #000000"><br /></span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">set</span><span style="color: #000000"> </span><span style="color: #008000">@strTmp</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> "</span><span style="color: #808080">&</span><span style="color: #000000">gt;(</span><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #ff00ff">max</span><span style="color: #000000">"<br /></span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">set</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> " </span><span style="color: #0000ff">order</span><span style="color: #000000"> </span><span style="color: #0000ff">by</span><span style="color: #000000"> </span><span style="color: #ff0000">[</span><span style="color: #ff0000">" + @fldName +"</span><span style="color: #ff0000">]</span><span style="color: #000000"> </span><span style="color: #0000ff">asc</span><span style="color: #000000">"<br /></span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">end</span><span style="color: #000000"><br /></span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> </span><span style="color: #008000">@PageIndex</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> </span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000"><br /></span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">begin</span><span style="color: #000000"><br /></span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> </span><span style="color: #008000">@strWhere</span><span style="color: #000000"> </span><span style="color: #808080">!=</span><span style="color: #000000"> ""<br /></span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">set</span><span style="color: #000000"> </span><span style="color: #008000">@strSQL</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> "</span><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #0000ff">top</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #ff00ff">str</span><span style="color: #000000">(</span><span style="color: #008000">@PageSize</span><span style="color: #000000">) </span><span style="color: #808080">+</span><span style="color: #000000">" "</span><span style="color: #808080">+</span><span style="color: #008000">@strGetFields</span><span style="color: #808080">+</span><span style="color: #000000"> "  </span><span style="color: #0000ff">from</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@tblName</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " </span><span style="color: #0000ff">where</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strWhere</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"><br /></span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">set</span><span style="color: #000000"> </span><span style="color: #008000">@strSQL</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> "</span><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #0000ff">top</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #ff00ff">str</span><span style="color: #000000">(</span><span style="color: #008000">@PageSize</span><span style="color: #000000">) </span><span style="color: #808080">+</span><span style="color: #000000">" "</span><span style="color: #808080">+</span><span style="color: #008000">@strGetFields</span><span style="color: #808080">+</span><span style="color: #000000"> "  </span><span style="color: #0000ff">from</span><span style="color: #000000"> "</span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@tblName</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " "</span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"><br /></span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">end</span><span style="color: #000000"><br /></span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">else</span><span style="color: #000000"><br /></span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">begin</span><span style="color: #000000"><br /></span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">set</span><span style="color: #000000"> </span><span style="color: #008000">@strSQL</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> "</span><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #0000ff">top</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #ff00ff">str</span><span style="color: #000000">(</span><span style="color: #008000">@PageSize</span><span style="color: #000000">) </span><span style="color: #808080">+</span><span style="color: #000000">" "</span><span style="color: #808080">+</span><span style="color: #008000">@strGetFields</span><span style="color: #808080">+</span><span style="color: #000000"> "  </span><span style="color: #0000ff">from</span><span style="color: #000000"> "<br /></span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@tblName</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " </span><span style="color: #0000ff">where</span><span style="color: #000000"> </span><span style="color: #ff0000">[</span><span style="color: #ff0000">" + @fldName + "</span><span style="color: #ff0000">]</span><span style="color: #000000">" </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strTmp</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> "(</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"+ @fldName + "</span><span style="color: #ff0000">]</span><span style="color: #000000">) </span><span style="color: #0000ff">from</span><span style="color: #000000"> (</span><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #0000ff">top</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #ff00ff">str</span><span style="color: #000000">((</span><span style="color: #008000">@PageIndex</span><span style="color: #808080">-</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">)</span><span style="color: #808080">*</span><span style="color: #008000">@PageSize</span><span style="color: #000000">) </span><span style="color: #808080">+</span><span style="color: #000000"> " </span><span style="color: #ff0000">[</span><span style="color: #ff0000">"+ @fldName + "</span><span style="color: #ff0000">]</span><span style="color: #000000"> </span><span style="color: #0000ff">from</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@tblName</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> ") </span><span style="color: #0000ff">as</span><span style="color: #000000"> tblTmp)"</span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"><br /></span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> </span><span style="color: #008000">@strWhere</span><span style="color: #000000"> </span><span style="color: #808080">!=</span><span style="color: #000000"> ""<br /></span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">set</span><span style="color: #000000"> </span><span style="color: #008000">@strSQL</span><span style="color: #000000"> </span><span style="color: #808080">=</span><span style="color: #000000"> "</span><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #0000ff">top</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #ff00ff">str</span><span style="color: #000000">(</span><span style="color: #008000">@PageSize</span><span style="color: #000000">) </span><span style="color: #808080">+</span><span style="color: #000000">" "</span><span style="color: #808080">+</span><span style="color: #008000">@strGetFields</span><span style="color: #808080">+</span><span style="color: #000000"> "  </span><span style="color: #0000ff">from</span><span style="color: #000000"> "<br /></span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@tblName</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " </span><span style="color: #0000ff">where</span><span style="color: #000000"> </span><span style="color: #ff0000">[</span><span style="color: #ff0000">" + @fldName + "</span><span style="color: #ff0000">]</span><span style="color: #000000">" </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strTmp</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> "(</span><span style="color: #ff0000">[</span><span style="color: #ff0000">"<br /></span><span style="color: #008080">41</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />+ @fldName + "</span><span style="color: #ff0000">]</span><span style="color: #000000">) </span><span style="color: #0000ff">from</span><span style="color: #000000"> (</span><span style="color: #0000ff">select</span><span style="color: #000000"> </span><span style="color: #0000ff">top</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #ff00ff">str</span><span style="color: #000000">((</span><span style="color: #008000">@PageIndex</span><span style="color: #808080">-</span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000">)</span><span style="color: #808080">*</span><span style="color: #008000">@PageSize</span><span style="color: #000000">) </span><span style="color: #808080">+</span><span style="color: #000000"> " </span><span style="color: #ff0000">[</span><span style="color: #ff0000">"<br /></span><span style="color: #008080">42</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" />+ @fldName + "</span><span style="color: #ff0000">]</span><span style="color: #000000"> </span><span style="color: #0000ff">from</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@tblName</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " </span><span style="color: #0000ff">where</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strWhere</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " "<br /></span><span style="color: #008080">43</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> ") </span><span style="color: #0000ff">as</span><span style="color: #000000"> tblTmp) </span><span style="color: #808080">and</span><span style="color: #000000"> " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strWhere</span><span style="color: #000000"> </span><span style="color: #808080">+</span><span style="color: #000000"> " " </span><span style="color: #808080">+</span><span style="color: #000000"> </span><span style="color: #008000">@strOrder</span><span style="color: #000000"><br /></span><span style="color: #008080">44</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">end</span><span style="color: #000000"><br /></span><span style="color: #008080">45</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">EXEC</span><span style="color: #000000"> (</span><span style="color: #008000">@strSQL</span><span style="color: #000000">)<br /></span><span style="color: #008080">46</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">if</span><span style="color: #000000"> </span><span style="color: #008000; font-weight: bold">@@error</span><span style="color: #808080">=</span><span style="color: #800000; font-weight: bold">0</span><span style="color: #000000"> </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #800000; font-weight: bold">1</span><span style="color: #000000"><br /></span><span style="color: #008080">47</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">SET</span><span style="color: #000000"> NOCOUNT </span><span style="color: #0000ff">OFF</span><span style="color: #000000"><br /></span><span style="color: #008080">48</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">END</span><span style="color: #000000"><br /></span><span style="color: #008080">49</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">GO</span><span style="color: #000000"><br /></span><span style="color: #008080">50</span><span style="color: #000000"><img alt="" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" /></span></div><br /><br />使用æ–ÒŽ(gu¨©)³•æ˜?C#)åQ?<br /><br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" /><span style="color: #000000">sql </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">EXEC [dbo].[xsp_ination] \</span><span style="color: #000000">"</span><span style="color: #000000">tblNEWS\</span><span style="color: #000000">"</span><span style="color: #000000">,\</span><span style="color: #000000">"</span><span style="color: #000000">*</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">,\</span><span style="color: #000000">"</span><span style="color: #000000">id\</span><span style="color: #000000">"</span><span style="color: #000000">,40,</span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> pindex.ToString() </span><span style="color: #000000">+</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">,1,\</span><span style="color: #000000">"</span><span style="color: #000000">iType</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000"> + type.ToString();</span><span style="color: #000000"><br /><img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #000000">SqlDataReader sr </span><span style="color: #000000">=</span><span style="color: #000000"> ExecuteReader(sql);<br /><img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" /></span><span style="color: #0000ff">while</span><span style="color: #000000"> (sr.Read())<br /><img id="Codehighlighter1_181_187_Open_Image" onclick="this.style.display='none'; Codehighlighter1_181_187_Open_Text.style.display='none'; Codehighlighter1_181_187_Closed_Image.style.display='inline'; Codehighlighter1_181_187_Closed_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif"><img style="display: none" id="Codehighlighter1_181_187_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_181_187_Closed_Text.style.display='none'; Codehighlighter1_181_187_Open_Image.style.display='inline'; Codehighlighter1_181_187_Open_Text.style.display='inline';" align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif"></span><span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_181_187_Closed_Text"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_181_187_Open_Text"><span style="color: #000000">{<br /><img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" alt="" /><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /><br /><img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" />}</span></span><span style="color: #000000"><br /><img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" />sr.Close();<br /><img align="top" src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" alt="" /></span></div><br /><br /><br />上面的优化技巧仅是一些常见的手段åQŒå¦‚果你的系¾lŸï¼ˆž®ç³»¾lŸå°±½Ž—了åQ‰é‡åˆ°æ•ˆçŽ‡é—®é¢˜ï¼Œå¯ä»¥ä¸Žè”é«˜èÊY件联¾p…R€?<br /><br />转蝲本文è¯äh³¨æ˜Žå‡ºå¤„,以便遇到优化困难的朋友可以找到联高提供帮助ã€?<br /><br /><img src ="http://www.aygfsteel.com/allrounder/aggbug/356455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/allrounder/" target="_blank">[ 王志ä¼?]</a> 2011-08-13 12:34 <a href="http://www.aygfsteel.com/allrounder/archive/2011/08/13/356455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>大型门户¾|‘站架构分析åQˆè{载)http://www.aygfsteel.com/allrounder/articles/356454.html[ 王志ä¼?][ 王志ä¼?]Sat, 13 Aug 2011 04:29:00 GMThttp://www.aygfsteel.com/allrounder/articles/356454.htmlhttp://www.aygfsteel.com/allrounder/comments/356454.htmlhttp://www.aygfsteel.com/allrounder/articles/356454.html#Feedback0http://www.aygfsteel.com/allrounder/comments/commentRss/356454.htmlhttp://www.aygfsteel.com/allrounder/services/trackbacks/356454.html千万人同时访问的¾|‘ç«™åQŒä¸€èˆ¬æ˜¯æœ‰å¾ˆå¤šä¸ªæ•°æ®åº“åŒæ—¶å·¥ä½œï¼Œè¯´æ˜Žç™½ä¸€ç‚¹å°±æ˜¯æ•°æ®åº“é›†ç¾¤å’ŒåÆˆå‘æŽ§åˆÓž¼Œ˜q™æ ·çš„网站实时性也是相对的。这些网站都有一些共同的特点åQšæ•°æ®é‡å¤§ï¼Œåœ¨çº¿äººæ•°å¤šï¼Œòq¶å‘è¯äh±‚多,pageview高,响应速度快。æ€È»“了一下各个大¾|‘站的架构,主要提高效率å?qi¨¢ng)稳定性的几个地方包括åQ?br />
1、程åº?br />½E‹åºå¼€å‘是一斚w¢åQŒç³»¾lŸæž¶æž„设计(¼‹¬äšg+¾|‘络+软äšgåQ‰æ˜¯å¦ä¸€æ–šw¢ã€?br />软äšg架构斚w¢åQŒåš¾|‘站首先需要很多web服务器存储静态资源,比如囄¡‰‡ã€è§†é¢‘、静态页½{‰ï¼Œåƒä¸‡ä¸è¦æŠŠé™æ€èµ„源和应用服务器放在一赗÷€?br />一个好的程序员写出来的½E‹åºä¼?x¨¬)非常简‹zã€æ€§èƒ½å¾ˆå¥½åQŒä¸€ä¸ªåˆ¾U§ç¨‹åºå‘˜å¯èƒ½ä¼?x¨¬)犯很多低çñ”错误åQŒè¿™ä¹Ÿæ˜¯å½±å“¾|‘站性能的原因之一ã€?br />¾|‘站要做到效率高åQŒä¸å…‰æ˜¯½E‹åºå‘˜çš„事情åQŒæ•°æ®åº“优化、程序优化这是必™åȝš„åQŒåœ¨æ€§èƒ½ä¼˜åŒ–上要数据库和½E‹åºé½å¤´òq¶è¿›åQç¼“存也是两斚w¢åŒæ—¶å…¥æ‰‹ã€‚第一åQŒæ•°æ®åº“¾~“存和数据库优化åQŒè¿™ä¸ªç”±dba完成åQˆè€Œä¸”˜q™ä¸ªæœ‰éžå¸¸å¤§çš„æ½œåŠ›å¯æŒ–ï¼Œåªæ˜¯ç”׃ºŽæˆ‘们都是½E‹åºå‘˜è€Œå¿½ç•¥äº†ä»–而已åQ‰ã€‚第二,½E‹åºä¸Šçš„优化åQŒè¿™ä¸ªéžå¸¸çš„æœ‰è®²½IÓž¼Œæ¯”如说重要一点就是要规范åQ»I¼±åQ¬è¯­å¥ï¼Œž®‘用in 多用oråQŒå¤šç”¨preparestatement 存储˜q‡ç¨‹åQŒå¦å¤–避免程序冗余如查找数据ž®‘用双重循环½{‰ã€‚å¦å¤–é€‰ç”¨ä¼˜ç§€çš„å¼€æºæ¡†æž¶åŠ ä»¥æ”¯æŒï¼Œæˆ‘ä¸ªäºø™®¤ä¸ÞZ¸­åŽå°çš„æ”¯æŒæ˜¯æœ€æœ€é‡è¦çš„,可以选取springåQ‹ibatis。因为ibatis直接操作SQLòq¶æœ‰¾~“存机制。spring的好处就不用我多说了åQŒï¾ƒåQ¯ïÛE的机制可以避免new对象åQŒè¿™æ ·ä¹ŸèŠ‚çœå¼€é”€ã€‚æ®æˆ‘åˆ†æžï¼Œ¾lå¤§éƒ¨åˆ†çš„开销ž®±æ˜¯åœ¨NEW的时候和˜qžæŽ¥æ•°æ®åº“时候äñ”生的åQŒè¯·ž®½é‡é¿å…ã€‚另外可以用一äº?span style="text-decoration: underline">内存?g¨°u)¹‹è¯•å·¥å…?/span>来做一个demo说明hibernateå’Œibatis谁更快!前台你想用什么就用什么,struts,webwork都成åQŒå¦‚果觉得自己挺牛X可以试试用tapestryã€?br />用数据库也未必不能解册™®¿é—®é‡å·¨å¤§æ‰€å¸¦æ¥çš„问题,作成静态文件硬盘的å¯Õd€æ—‰™—´ä¹Ÿæœªå¿…少于数据库的搜索时é—ß_(d¨¢)¼Œå½“然对资料的索引要下一¾˜Õd·¥å¤«ã€‚我自己觉得门户往往也就是当天、热门的资料点击率较高,ž®†å…¶åšç¼“存最多也不过1~2G的数据量吧,举个例子åQ?br />
◎ 拿网易新é—ÀL¥è¯?a target="_blank">http://news.163.com/07/0606/09/3GA0D10N00011229.html
格式化一下,方便理解åQšhttp://域名/òq?月日/新闻所属分¾c?æ–°é—»ID.html
可以把当天发布的、热门的、浏览量大的作个¾~“å­˜åQŒç”¨hashtableåQˆkeyåQšå¹´-æœ?æ—?分类-IDåQŒvalueåQšæ–°é—Õd¯¹è±¡ï¼‰åQŒé™æ€å°†å…¶æ”¾åˆ°å†…存(速度¾lå¯¹å¿«è¿‡¼‹¬ç›˜å¯Õd€é™æ€é¡µé¢ï¼‰ã€?br />
通常是采用oracle存储˜q‡ç¨‹åQ?个weblogicåQ?span style="text-decoration: underline">更新机制也几乎一æ äh¯½{‘֏‘一条新闻,ž®×ƒ¼š(x¨¬)生成静态页面,然后发往前端çš?/span>web服务器,前端的web都是做负载均衡的。另外还有定时程序,æ¯?-15分钟自动生成一‹Æ¡ã€?span style="text-decoration: underline">在发布新é—ȝš„同时ž®†æ•°æ®ç¼“å­?/span>。当然缓存也不会(x¨¬)­‘Šæ¥­‘Šå¤§åQŒåœ¨ä¸ªç‰¹å®šçš„æ—‰™—´ŒDµï¼ˆå¦‚凌晨)删除˜q‡æœŸçš„æ•°æ®ã€‚做一个大的网站远没有惌™±¡ä¸­é‚£ä¹ˆç®€å•,服务器基本就要百十个的ã€?br />˜q™æ ·å¯ä»¥å¤§å¤§å¢žåŠ ä¸€å°è®¡½Ž—机的处理速度åQŒå¦‚果一台机器处理不了,可以用httpserver集群来解决问题了ã€?br />
2、网¾l?br />中国的网¾lœåˆ†å—电(sh¨´)信和北网通,讉K—®çš„ipž®Þp¦åŒºåˆ†å—北˜q›å…¥ä¸åŒçš„网¾lœã€?br />
3、集¾Ÿ?br />通常ä¼?x¨¬)ä‹É用CDN与GSBL与DNS负蝲均衡技术,每个地区一¾l„前台服务器¾Ÿ¤ï¼Œæ¯”如新浪和搜狐,而网易,癑ֺ¦ä½¿ç”¨äº†DNS负蝲均衡技术,每个频道一¾l„前台服务器åQ›ä¸€æœä‹É用了DNS负蝲技术,所有频道共用一¾l„前台服务器集群ã€?br />¾|‘站使用åŸÞZºŽLinux集群的负载均衡,å¤ÞpÓ|恢复åQŒåŒ…括应用服务器和数据库服务器,åŸÞZºŽlinux-ha的服务状态检‹¹‹åŠ(qi¨¢ng)高可用化ã€?br />应用服务器集¾Ÿ¤å¯ä»¥é‡‡ç”¨apache+tomcat集群和weblogic集群½{‰ï¼›web服务器集¾Ÿ¤å¯ä»¥ç”¨åå‘代理åQŒä¹Ÿå¯ä»¥ç”¨NAT的方式,或者多域名解析都可以;Squid也可以,æ–ÒŽ(gu¨©)³•很多åQŒå¯ä»¥æ ¹æ®æƒ…况选择ã€?br />
4、数据库
因䨓(f¨´)是千万äh同时讉K—®çš„网站,所以一般是有很多个数据库同时工作的åQŒè¯´æ˜Žç™½ä¸€ç‚¹å°±æ˜¯æ•°æ®åº“é›†ç¾¤å’ŒåÆˆå‘æŽ§åˆÓž¼Œæ•°æ®åˆ†å¸ƒåˆ°åœ°ç†ä½¾|®ä¸åŒçš„æ•°æ®ä¸­å¿ƒåQŒä»¥å…å‘生断ç”?sh¨´)事故ã€?/p>

ä¸ÀLµçš„æ•°æ®åº“有Sun的是MySQLå’ŒOracleã€?br />Oracle是一‹Æ¾ä¼˜¿U€çš„、广泛采用的商业数据库管理èÊY件。有很强大的功能和安全性,可以处理相对‹¹·é‡çš„æ•°æ®ã€‚而MySQL是一‹ÆùNžå¸æ€¼˜¿U€çš„开源数据库½Ž¡ç†è½¯äšgåQŒéžå¸”R€‚合用多台PC Server¾l„成多点的存储节炚w˜µåˆ?˜q™é‡Œæˆ‘所指的不是MySQL自èín提供的集¾Ÿ¤åŠŸèƒ?åQŒæ¯å•位的数据存储成本也非常的低廉。用多台PC Server安装MySQL¾l„成一个存储节炚w˜µåˆ—,通过MySQL自èínçš„Replication或者应用自íw«çš„处理åQŒå¯ä»¥å¾ˆå¥½çš„保证定w”™(允许部分节点失效)åQŒä¿è¯åº”用的健壮性和可靠性。可以这么说åQŒåœ¨å…³ç³»æ•°æ®åº“管理系¾lŸçš„选择上,可以考虑应用本èín的情冉|¥å†›_®šã€?/p>

MySQL数据库服务器的master-slave模式åQŒåˆ©ç”¨æ•°æ®åº“服务器在ä¸ÖM»ŽæœåС噍间˜q›è¡ŒåŒæ­¥åQŒåº”用只把数据写åˆîC¸»æœåŠ¡å™¨ï¼Œè€Œè¯»æ•°æ®æ—¶åˆ™æ ÒŽ(gu¨©)®è´Ÿè²é€‰æ‹©ä¸€åîC»ŽæœåŠ¡å™¨æˆ–è€…ä¸»æœåŠ¡å™¨æ¥è¯Õd–åQŒå°†æ•°æ®æŒ‰ä¸åŒç­–略划分到不同的服务器åQˆç»„åQ‰ä¸ŠåQŒåˆ†æ•£æ•°æ®åº“压力ã€?/p>

另外˜q˜æœ‰ä¸€ç‚¹çš„æ˜¯ï¼Œé‚£äº›¾|‘站的静态化¾|‘页òq¶ä¸æ˜¯çœŸçš„,而是通过动态网™åµä¸Žé™æ€ç½‘™å늽‘址交换所出现的假è±?/span>åQŒè¿™å¯ä»¥ç”¨urlrewrite˜q™æ ·çš„开源网址映射器实现。这æ ïL(f¨¥ng)š„¾|‘站实时性也是相对的åQŒå› ä¸ºåœ¨æ•°æ®åº“复制数据的时候有一个过½E‹ï¼Œä¸€èˆ?span style="text-decoration: underline">在技术上可以用到hibernateå’ŒecacheåQŒä½†æ˜¯å¦‚果要使网站工作地更好åQ?span style="text-decoration: underline">可以使用EJBå’ŒwebsphereåQŒweblogic˜q™æ ·å¤§åž‹çš„æœåŠ¡å™¨æ¥æ”¯æŒï¼Œòq¶ä¸”要用oracle˜q™æ ·çš„大型数据库ã€?br />大型门户¾|‘站不徏议ä‹É用Mysql数据库,除非你对Mysql数据的优化非常熟æ‚(zh¨¨n)‰ã€‚Mysql数据库服务器的master-slave模式åQŒåˆ©ç”¨æ•°æ®åº“服务器在ä¸ÖM»ŽæœåС噍间˜q›è¡ŒåŒæ­¥åQ?span style="text-decoration: underline">应用只把数据写到ä¸ÀLœåС噍åQŒè€Œè¯»æ•°æ®æ—¶åˆ™æ ÒŽ(gu¨©)®è´Ÿè²é€‰æ‹©ä¸€åîC»ŽæœåŠ¡å™¨æˆ–è€…ä¸»æœåŠ¡å™¨æ¥è¯Õd–åQŒå°†æ•°æ®æŒ‰ä¸åŒç­–略划分到不同的服务器åQˆç»„åQ‰ä¸ŠåQŒåˆ†æ•£æ•°æ®åº“压力ã€?/span>
大型¾|‘站要用oracleåQŒæ•°æ®æ–¹é¢æ“ä½œå°½é‡å¤šç”¨å­˜å‚¨è¿‡½E‹ï¼Œ¾lå¯¹æå‡æ€§èƒ½åQ›åŒæ—¶è¦è®©DBAå¯ÒŽ(gu¨©)•°æ®åº“˜q›è¡Œä¼˜åŒ–åQŒä¼˜åŒ–后的数据库与没优化的有天壤之别åQ›åŒæ—¶è¿˜å¯ä»¥æ‰©å±•分布式数据库åQŒä»¥åŽè¿™æ–šw¢çš„ç ”½I¶ä¼š(x¨¬)­‘Šæ¥­‘Šå¤šåQ?br />
5、页é?br />从开始就考虑使用虚拟存储/½‡æ–‡ä»¶ç³»¾lŸã€‚å®ƒèƒ½è®©ä½ å¤§é‡åÆˆè¡ŒIO讉K—®åQŒè€Œä¸”不需要ä“Q何重¾l„就能够增加所需要的¼‚ç›˜ã€?br />™åµé¢æ•°æ®è°ƒç”¨æ›´è¦è®¤çœŸè®¾è®¡åQŒä¸€äº›æ•°æ®æŸ¥è¯¢å¯ä»¥ä¸é€šè¿‡æ•°æ®åº“的方式åQŒå®žæ—¶æ€§è¦æ±‚不高的可以使用lucene来实玎ͼŒå³ä‹É有实时性的要求也可以用luceneåQˆåŸºäºŽJava的全文烦å¼?‹‚€ç´¢å¼•擎)åQŒlucene+compass˜q˜æ˜¯éžå¸¸ä¼˜ç§€çš„ã€?br />æ–°é—»¾cȝš„¾|‘站可以用静态页存储åQŒé‡‡ç”¨å®šæ—¶æ›´æ–°æœºåˆ¶å‡è½ÀLœåŠ¡å™¨è´Ÿæ‹…åQ›é¦–™å‰|¯ä¸ªå°æ¨¡å—可以使用oscache¾~“å­˜åQŒè¿™æ ·ä¸ç”¨æ¯‹Æ¡éƒ½æ‹‰æ•°æ®ã€?br />前端的基于静态页面缓存的web加速器åQŒä¸»è¦åº”用有squid½{‰ã€?span style="text-decoration: underline">squid ž®†å¤§éƒ¨åˆ†é™æ€èµ„æº?囄¡‰‡åQŒjsåQŒcss½{‰ï¼‰¾~“å­˜èµäh¥åQŒç›´æŽ¥è¿”回给讉K—®è€…,减少应用服务器的负蝲
¾|‘站的静态化¾|‘页òq¶ä¸æ˜¯çœŸçš„,而是通过动态网™åµä¸Žé™æ€ç½‘™å늽‘址交换做出现的假象åQŒè¿™å¯ä»¥ç”¨urlrewrite˜q™æ ·çš„开源网址映射器实玎ͼŒåŽç¼€åäØ“(f¨´)htm或者htmlòq¶ä¸èƒ½è¯´æ˜Žç¨‹åºç”Ÿæˆäº†é™æ€é¡µé¢ï¼Œå¯èƒ½æ˜¯é€šè¿‡url重写来实现的åQŒäØ“(f¨´)的只不过是在搜烦引擎中提升自å·Þq½‘站的覆盖面积¾|¢äº†ã€?br />生成静态页面的服务器和www服务器是两组不同的服务器åQŒé¡µé¢ç”ŸæˆåŽæ‰ä¼š(x¨¬)到wwwæœåŠ¡å™¨ï¼Œä¸€éƒ¨åˆ†æ•°æ®åº“åÆˆä¸æ˜¯å…³ç³»æ•°æ®åº“ï¼Œ˜q™æ ·æ›´é€‚合信息衍生åQŒwww、mail服务器、èµ\由器多,主要用负载åã^衡解册™®¿é—®ç“¶é¢ˆã€?br />◎ 静态页面的¾~ºç‚¹åQ?br />1) 增加了程序的复杂åº?br />2) 不利于管理资æ–?br />3) 速度不是最å¿?br />4) 伤硬ç›?br />
6、缓å­?br />从一开始就应该使用¾~“å­˜åQŒé«˜é€Ÿç¼“存是一个更好的地方存储临时数据åQŒæ¯”如Web站点上跟ítªä¸€ä¸ªç‰¹å®šç”¨æˆïL(f¨¥ng)š„ä¼?x¨¬)话产生的ä?f¨´)æ—¶æ–‡ä»Óž¼Œž®×ƒ¸å†éœ€è¦è®°å½•到数据库里ã€?br />不能用lucene实现的可以用¾~“å­˜åQŒåˆ†å¸ƒå¼¾~“存可以用memcachedåQŒå¦‚果有é’Þqš„话用10来台机器做缓存,> 10Gçš„å­˜å‚¨é‡ç›æ€¿¡å­˜ä»€ä¹ˆéƒ½å¤Ÿäº†åQ›å¦‚果没é’Þqš„话可以在™åµé¢¾~“存和数据缓存上下功夫,多用OSCACHEå’ŒEHCACHEåQŒSWARMCACHE也可以,不过据说同步性不是很好;
可以使用MemcacheåQˆåˆ†å¸ƒå¼¾~“å­˜åQ‰è¿›è¡Œç¼“存,用大内存把这些不变的数据全都¾~“å­˜èµäh¥åQŒè€Œå½“修改时就通知cache˜q‡æœŸåQŒmemcache是LJ开发的一‹Æ‘Öˆ†å¸ƒå¼¾~“存产品åQŒå¾ˆå¤šå¤§åž‹ç½‘站在应用åQŒæˆ‘们可以把Cache Server与App Server装在一èµ?/span>。因为Cache Server对CPU消耗不大,而有了Cache Server的支æß_(d¨¢)¼ŒApp Server对内存要求也不是太高åQŒæ‰€ä»¥å¯ä»¥å’Œòq›_…±å¤„,更有效的利用资源ã€?/p>

单机内存¾~“存、文件缓存、数据库¾~“å­˜½{‰çš„½{–略都是可以很简单的实现的,例如可以使用微èÊYçš„Caching Application BlockåQŒä½†å¦‚何在集¾Ÿ¤çŽ¯å¢ƒä¸­ä½¿å¤šä¸ªç¼“å­˜ã€å¤šå±‚ç¼“å­˜åÆˆä¿å­˜åŒæ­¥æ˜¯ä¸ªé‡å¤§é—®é¢˜ã€‚å¤§åž‹ç½‘ç«™ä¸€èˆ¬éƒ½ä½¿ç”¨¾~“存服务器群åQŒåƈ使用多层¾~“存。业内最常用的有åQ?/p>

Squid cacheåQŒSquid服务器群åQŒæŠŠå®ƒä½œä¸ºweb服务器端前置cache服务器缓存相兌™¯·æ±‚来提高web服务器速度。Squidž®†å¤§éƒ¨åˆ†é™æ€èµ„æº?囄¡‰‡åQŒjsåQŒcss½{‰ï¼‰¾~“å­˜èµäh¥åQŒç›´æŽ¥è¿”回给讉K—®è€…,减少应用服务器的负蝲

memcacheåQŒmemcache服务器群åQŒä¸€‹Æ‘Öˆ†å¸ƒå¼¾~“存产品åQŒå¾ˆå¤šå¤§åž‹ç½‘站在应用; 它可以应对ä“Q意多个连接,使用非阻塞的¾|‘络IO。由于它的工作机制是在内存中开辟一块空é—ß_(d¨¢)¼Œç„¶åŽå»ºç«‹ä¸€ä¸ªHashTableåQŒMemcached自管理这些HashTable。因为通常¾|‘站应用½E‹åºä¸­æœ€è€—费旉™—´çš„ä“Q务是数据在数据库的检索,而多个用æˆähŸ¥è¯¢ç›¸åŒçš„SQLæ—Óž¼Œæ•°æ®åº“压力会(x¨¬)增大åQŒè€Œé€šè¿‡memcache的查询缓存命中,数据直接从memcache内存中取åQŒæ¯‹Æ¡ç¼“存命中将替换到数据库服务器的一‹Æ¡å¾€˜q”,到达数据库服务器的请求更ž®‘,间接地提高了数据库服务器的性能åQŒä»Žè€Œä‹É应用½E‹åº˜qè¡Œå¾—更快。它通过åŸÞZºŽå†…å­˜¾~“存对象来减ž®‘数据库查询的方式改善网站系¾lŸçš„反应åQŒå…¶æœ€å¸å¼•人的一个特性就是支持分布式部çÖv。有关memcacheåQŒä»¥ä¸‹æ–‡ç« å¯ä»¥å‚考:(x¨¬)参è€?åQ?a target="_blank">参è€?åQ?a target="_blank">参è€?官方站点ã€?/p>

e-AcceleratoråQŒæ¯”较特ŒDŠï¼ŒPHP的缓存和加速器。是一个免费开源的PHP加速、优化、编译和动态缓存的™å¹ç›®åQŒå®ƒå¯ä»¥é€šè¿‡¾~“å­˜PHP代码¾~–译后的¾l“果来提高PHP脚本的性能åQŒä‹É得一向很复杂和离我们很远çš?PHP脚本¾~–译问题完全得到解决。通过使用eAcceleratoråQŒå¯ä»¥ä¼˜åŒ–ä½ çš„PHP代码执行速度åQŒé™ä½ŽæœåŠ¡å™¨è´Ÿè²åQŒå¯ä»¥æé«˜PHP应用执行速度最高达10倍ã€?/p>

 

7、服务器操作¾pȝ»Ÿä¸ŽWeb服务å™?br />最底层首先是操作系¾lŸã€‚好的操作系¾lŸèƒ½æé«˜å¥½çš„æ€§èƒ½ã€ç¨³å®šæ€§å’Œå®‰å…¨æ€§ï¼Œè€Œè¿™äº›å¯¹å¤§åž‹¾|‘站的性能、安全性和½E›_®šæ€§éƒ½æ˜¯è‡³å…³é‡è¦çš„ã€?/p>

  • 淘宝¾|‘(阉K‡Œå·´å·´åQ? Linux操作¾pȝ»Ÿ + Web 服务å™? Apache
  • 新浪åQšFreeBSD + Web 服务器:(x¨¬)Apache
  • YahooåQšFreeBSD + Web 服务器:(x¨¬)自己çš?/li>
  • Google: 部分Linux + Web 服务器:(x¨¬)自己çš?/li>
  • 癑ֺ¦åQšLinux + Web 服务å™? Apache
  • ¾|‘易åQšLinux + Web 服务å™? Apache
  • eBay: Windows Server 2003/8 (大量) + Web 服务器:(x¨¬)Microsoft IIS
  • MySpace: Windows Server 2003/8 + Web 服务器:(x¨¬)Microsoft IIS

由此可见åQŒå¼€æºæ“ä½œç³»¾lŸåšWeb应用是首选已¾læ˜¯ä¸€ä¸ªæ—¢å®šäº‹å®žã€‚在开源操作系¾lŸä¸­Linuxå’ŒFreeBSD差不太多åQŒå¾ˆéš¾è¯´å“ªä¸ªä¸€å®šæ¯”另外一个要优秀很多、能够全面的­‘…è¶Šå¯ÒŽ(gu¨©)‰‹åQŒåº”该是各有所é•ѝ€‚但熟æ?zh¨¨n)‰Linuxçš?span>技æœ?/span>人员更多些,利于¾pȝ»Ÿ½Ž¡ç†ã€ä¼˜åŒ–ç­‰åQŒæ‰€ä»¥Linux使用更广泛。而W(xu¨¦)indows Serverå’ŒIIS虽然有的¾|‘站使用åQŒä½†ä¸å¼€æºï¼Œè€Œä¸”需要购ä¹?span>å¾®èÊY的一¾pÕdˆ—应用产品åQŒé™åˆ¶äº†å…¶ä‹É用。æ€ÖM¹‹åQŒå¼€æºæ“ä½œç³»¾lŸï¼Œž®¤å…¶æ˜¯Linux做Web应用是首选已¾læ˜¯ä¸€ä¸ªæ—¢å®šäº‹å®žã€?br />常用的系¾lŸæž¶æž„是:

  • Linux + Apache + PHP + MySQL
  • Linux + Apache + Java (WebSphere) + Oracle
  • Windows Server 2003/2008 + IIS + C#/ASP.NET + 数据åº?

以上一些不太成熟的æƒÏx³•åQŒå¯ä»¥ä»ŽæŸä¸€ä¸ªå±‚‹Æ¡å¼€å§‹ï¼Œé€æ­¥¾l†åŒ–åQŒæŠŠäº§å“çš„æ€§èƒ½æŒ‡æ ‡æé«˜ä¸ŠåŽ»ã€?br />


转自åQ?a >http://blog.sina.com.cn/s/blog_56fd58ab0100o2hw.html

]]>
SQL Server安装文äšg挂è“v错误解决办法http://www.aygfsteel.com/allrounder/articles/353607.html[ 王志ä¼?][ 王志ä¼?]Sun, 03 Jul 2011 14:23:00 GMThttp://www.aygfsteel.com/allrounder/articles/353607.htmlhttp://www.aygfsteel.com/allrounder/comments/353607.htmlhttp://www.aygfsteel.com/allrounder/articles/353607.html#Feedback0http://www.aygfsteel.com/allrounder/comments/commentRss/353607.htmlhttp://www.aygfsteel.com/allrounder/services/trackbacks/353607.html  在运行窗口输入regeditåQŒæ‰“开注册表编辑器åQŒåœ¨HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\session Manager中找到PendingFileRenameOperationsåQŒåˆ é™¤è¯¥é”®å€û|¼ˆ˜q™ä¸ªé”®å€¼æ˜¯å®‰è£…½E‹åºæš‚挂™å¹ç›®åQŒåªè¦æ‰¾åˆ°å¯¹åº”的应用½E‹åºæ¸…除掉就行了åQ‰ï¼Œå…³é—­æ³¨å†Œè¡¨ç¼–辑器。重新安装SQL Server 2000卛_¯ã€?br />        ç‰ÒŽ(gu¨©)•´ç†æ”¶è—ä¸Žä¸‹ï¼Œä»¥ä¾¿æŸ¥æ‰¾ã€?br />资料引用:http://www.knowsky.com/340304.html

]]>
Sql Server 2000企业½Ž¡ç†å™¨æ— æ³•打开åQˆMMCåQ‰çš„解决æ–ÒŽ(gu¨©)³• http://www.aygfsteel.com/allrounder/articles/353606.html[ 王志ä¼?][ 王志ä¼?]Sun, 03 Jul 2011 14:22:00 GMThttp://www.aygfsteel.com/allrounder/articles/353606.htmlhttp://www.aygfsteel.com/allrounder/comments/353606.htmlhttp://www.aygfsteel.com/allrounder/articles/353606.html#Feedback0http://www.aygfsteel.com/allrounder/comments/commentRss/353606.htmlhttp://www.aygfsteel.com/allrounder/services/trackbacks/353606.html
MMC 不能打开文äšg C:\Program Files\Microsoft SQL Server\80\Tools\BINN\SQL Server Enterprise Manager.MSCã€?br />
分析åQ?br />
参看文äšg是否存在或被损坏ã€?br />
无论那种åQŒå…ˆž®†å…¶åˆ é™¤

然后åQŒåœ¨˜qè¡Œæ¡†ä¸­è¾“å…¥ mmcåQŒæ‰“开控制å?br />
执行以下三个步骤åQ?br />
1、控制台--æ·ÕdŠ /删除½Ž¡ç†å•å…ƒ--æ·ÕdŠ --扑ֈ°Microsoft SQL 企业½Ž¡ç†å™?-æ·ÕdŠ --关闭--¼‹®å®š

2、控制台--选项--控制台模式选择"用户模式完全讉K—®"--ž®†ä¸‹é¢çš„选择全部取消

3、控制台--另存�-存储�C:\Program Files\Microsoft SQL Server\80\Tools\BINN\SQL Server Enterprise Manager.MSC

在第三步时可能会(x¨¬)遇到“无法保存”åQŒè¿™¿UçŽ°è±¡ã€?br />
则在˜qè¡Œæ¡†ä¸­è¾“å…¥ regsvr32 C:\Windows\system32\msxml3.dll

然后再执行上面的½W¬ä¸‰æ­¥ï¼Œå›_¯

参考:(x¨¬)http://www.leezao.cn/article.asp?id=467

]]>
使用Jstat监控gc情况http://www.aygfsteel.com/allrounder/articles/351293.html[ 王志ä¼?][ 王志ä¼?]Sun, 29 May 2011 15:08:00 GMThttp://www.aygfsteel.com/allrounder/articles/351293.htmlhttp://www.aygfsteel.com/allrounder/comments/351293.htmlhttp://www.aygfsteel.com/allrounder/articles/351293.html#Feedback0http://www.aygfsteel.com/allrounder/comments/commentRss/351293.htmlhttp://www.aygfsteel.com/allrounder/services/trackbacks/351293.html性能‹¹‹è¯•˜q‡ç¨‹ä¸­ï¼Œæˆ‘们该如何监控java虚拟机内存的使用情况åQŒç”¨ä»¥åˆ¤æ–­JVM是否存在内存问题呢?如何判断JVM垃圾回收是否正常åQŸä¸€èˆ¬çš„top指ä×o(h¨´)基本上满­‘³ä¸äº†è¿™æ ïL(f¨¥ng)š„éœ€æ±‚ï¼Œå› äØ“(f¨´)它主要监控的是æ€ÖM½“的系¾lŸèµ„源,很难定位到java应用½E‹åºã€?br />在项目实践过½E‹ä¸­åQŒæˆ‘们探索和使用了一‹Æ¾æ–°å·¥å…·åQï¼Jstatã€?br />    先秀一下。Jstat是JDK自带的一个轻量çñ”ž®å·¥å…—÷€‚å…¨¿U?#8220;Java Virtual Machine statistics monitoring tool”åQŒå®ƒä½äºŽjavaçš„bin目录下,主要利用JVM内徏的指令对Java应用½E‹åºçš„资源和性能˜q›è¡Œå®žæ—¶çš„命令行的监控,包括了对Heap size和垃圑֛žæ”¶çжå†ëŠš„监控。可见,Jstat是轻量çñ”的、专门针对JVMçš„å·¥å…øP¼Œéžå¸¸é€‚用ã€?br />那,该怎么用呢åQ?br />    语法¾l“构如下åQšjstat [Options] vmid [interval] [count]
    Options — 选项åQŒæˆ‘们一般ä‹Éç”?-gcutil 查看gc情况
    vmid    — VM的进½E‹å·åQŒå³å½“前˜qè¡Œçš„java˜q›ç¨‹å?br />    interval– 间隔旉™—´åQŒå•ä½äØ“(f¨´)¿U’或者毫¿U?br />    count   — 打印‹Æ¡æ•°åQŒå¦‚果缺省则打印无数‹Æ?br />    下面¾l™å‡ºä¸€ä¸ªå®žé™…的例子åQ?/p>

 

            

注:(x¨¬)ç”׃ºŽJVM内存讄¡½®è¾ƒå¤§åQŒå›¾ä¸­ç™¾åˆ†æ¯”变化不太明显

 

    图中参数含义如下åQ?/p>

    S0 — Heap上的 Survivor space 0 区已使用½Iºé—´çš„百分比
    S1 — Heap上的 Survivor space 1 区已使用½Iºé—´çš„百分比
    E   — Heap上的 Eden space 区已使用½Iºé—´çš„百分比
    O   — Heap上的 Old space 区已使用½Iºé—´çš„百分比
    P   — Perm space 区已使用½Iºé—´çš„百分比
    YGC — 从应用程序启动到采样时发ç”?Young GC 的次æ•?br />    YGCT– 从应用程序启动到采样æ—?Young GC 所用的旉™—´(单位¿U?
    FGC — 从应用程序启动到采样时发ç”?Full GC 的次æ•?br />    FGCT– 从应用程序启动到采样æ—?Full GC 所用的旉™—´(单位¿U?
    GCT — 从应用程序启动到采样时用于垃圑֛žæ”¶çš„æ€ÀL—¶é—?单位¿U?

    上图的示例,¾U¢æ¡†ä¸­ï¼Œæˆ‘们可以看到åQ?‹Æ¡young gc之后åQŒåžƒåœ‘Ö†…存被从Eden spaceåŒ?E)攑օ¥äº†Old spaceåŒ?O)åQŒåƈ引è“väº†ç™¾åˆ†æ¯”çš„å˜åŒ–ï¼Œå¯ÆD‡´Survivor space使用的百分比ä»?9.69%(S0)降到10.34%(S1)。有效释放了内存½Iºé—´ã€‚绿框中åQŒæˆ‘们可以看刎ͼŒä¸€‹Æ¡full gc之后åQŒOld spaceåŒ?O)的内存被回收åQŒä»Ž36.81%降到35.01%ã€?/p>

    图中同时打印了young gcå’Œfull gcçš„æ€ÀL¬¡æ•°ã€æ€»è€—时。而,每次young gc消耗的旉™—´åQŒå¯ä»¥ç”¨ç›”R—´éš”的两行YGCT相减得到。每‹Æ¡full gc消耗的旉™—´åQŒå¯ä»¥ç”¨ç›”Rš”的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生äº?‹Æ¡young gcåQŒæ¶ˆè€—的旉™—´ä¸?2.281-52.252åQ?.029¿U’ã€?/p>

    帔R©»å†…å­˜åŒ?P)çš„ä‹É用率åQŒå§‹¾lˆåœç•™åœ¨37.6%左右åQŒè¯´æ˜Žå¸¸é©Õd†…存没有突变,比较正常ã€?/p>

如果young gcå’Œfull gc能够正常发生åQŒè€Œä¸”都能有效回收内存åQŒå¸¸é©Õd†…存区变化不明显,则说明java内存释放情况正常åQŒåžƒåœ‘Ö›žæ”¶åŠ(qi¨¢ng)æ—Óž¼Œjava内存泄露的几率就ä¼?x¨¬)大大降低。但也不能说明一定没有内存泄霌Ӏ?/p>

 

    以上åQŒä»‹¾läº†Jstat按百分比查看gc情况的功能。其实,它还有其它功能,例如加蝲¾cÖM¿¡æ¯ç»Ÿè®¡åŠŸèƒ½ã€å†…å­˜æ± ä¿¡æ¯¾lŸè®¡åŠŸèƒ½½{‰ï¼Œé‚£äº›æ˜¯ä»¥¾lå¯¹å€¼çš„形式打印出来的,比较?y¨­u)®‘用åQŒåœ¨æ­¤å°±ä¸åšä»‹ç»ã€?/p>

  

    ä¸ÞZº†æ›´å…¨é¢çš„监控JVM内存使用情况åQŒæˆ‘们需要引入更强大的工å…äh¥˜q›ä¸€æ­¥åˆ†æž?#8211;JConsole。敬请关注ã€?/p>

--------

一、概˜q?/strong>

    SUN çš„JDK中的几个工具åQŒéžå¸¸å¥½ç”¨ã€‚秉承着有免费,不用商用的原则。以下简单介¾lä¸€ä¸‹è¿™å‡ ç§å·¥å…·ã€?注:(x¨¬)本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javacä¸€æ øP¼Œä¸é¡»ç‰ÒŽ(gu¨©)„å®‰è£…) ã€?br />   
    我一共找åˆîC»¥ä¸‹å››ä¸ªå·¥å…øP¼š(x¨¬)重点看看jconsoleå’Œjmapã€?/p>

jps    
:与unix上的ps¾cÖM¼¼åQŒç”¨æ¥æ˜¾½Cºæœ¬åœ°çš„java˜q›ç¨‹åQŒå¯ä»¥æŸ¥çœ‹æœ¬åœ°è¿è¡Œç€å‡ ä¸ªjava½E‹åºåQŒåƈ昄¡¤ºä»–们的进½E‹å·ã€?nbsp;   
   
jstat    
:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大ž®åŠ(qi¨¢ng)其内存ä‹É用量ã€?nbsp;   
   
jmap    
:打印出某个java˜q›ç¨‹åQˆä‹É用pidåQ‰å†…存内的,所æœ?#8216;对象’的情况(如:(x¨¬)产生那些对象åQŒåŠ(qi¨¢ng)其数量)ã€?nbsp;   
   
jconsole    
:一个java GUI监视工具åQŒå¯ä»¥ä»¥å›¾è¡¨åŒ–的形式昄¡¤ºå„ç§æ•°æ®ã€‚åÆˆå¯é€šè¿‡˜qœç¨‹˜qžæŽ¥ç›‘视˜qœç¨‹çš„æœåС噍VMã€?/span>




 

二ã€?使用介绍åQ?
   
    1、jstat åQšæˆ‘æƒ›_¾ˆå¤šäh都是用过unix¾pȝ»Ÿé‡Œçš„ps命ä×o(h¨´)åQŒè¿™ä¸ªå‘½ä»¤ä¸»è¦æ˜¯ç”¨æ¥æ˜„¡¤ºå½“前¾pȝ»Ÿçš„è¿›½E‹æƒ…况,有哪些进½E‹ï¼Œå?qi¨¢ng)å…?idã€?jps ä¹Ÿæ˜¯ä¸€æ øP¼Œå®ƒçš„作用是显½Cºå½“前系¾lŸçš„java˜q›ç¨‹æƒ…况åQŒåŠ(qi¨¢ng)å…¶id受÷€‚我们可以通过它来查看我们到底启动了几个java˜q›ç¨‹åQˆå› ä¸ºæ¯ä¸€ä¸ªjava½E‹åºéƒ½ä¼š(x¨¬)独占一个java虚拟机实例)åQŒå’Œä»–们的进½E‹å·åQˆäØ“(f¨´)下面几个½E‹åºåšå‡†å¤‡ï¼‰åQŒåƈ可通过opt来查看这些进½E‹çš„详细启动参数ã€?
    使用æ–ÒŽ(gu¨©)³•åQšåœ¨å½“前命ä×o(h¨´)行下æ‰?jps(需要JAVA_HOMEåQŒæ²¡æœ‰çš„话,到改½E‹åºçš„目录下æ‰? ã€?/p>

可惜没有linux下的ps好用åQŒå¿UîC¸å¥½ç”¨ã€‚但是在½W¬å››ä¸ªå·¥å…·jconsole的界面里面会(x¨¬)有具体JAR包的名称ã€?br />   
    2、jstat åQšå¯¹VM内存使用量进行监控ã€?
    jstat工具特别强大åQŒæœ‰ä¼—多的可选项åQŒè¯¦¾l†æŸ¥çœ‹å †å†…各个部分的使用量,以及(qi¨¢ng)加蝲¾cÈš„æ•°é‡ã€‚ä‹É用时åQŒéœ€åŠ ä¸ŠæŸ¥çœ‹˜q›ç¨‹çš„è¿›½E‹idåQŒå’Œæ‰€é€‰å‚数。以下详¾l†ä»‹¾lå„个参数的意义ã€?
    jstat -class pid:昄¡¤ºåŠ è²class的数量,å?qi¨¢ng)所占空间等信息ã€?
    jstat -compiler pid:昄¡¤ºVM实时¾~–译的数量等信息ã€?
    jstat -gc pid:可以昄¡¤ºgc的信息,查看gc的次敎ͼŒå?qi¨¢ng)时间。其中最后五™å¹ï¼Œåˆ†åˆ«æ˜¯young gc的次敎ͼŒyoung gc的时é—ß_(d¨¢)¼Œfull gc的次敎ͼŒfull gc的时é—ß_(d¨¢)¼Œgcçš„æ€ÀL—¶é—´ã€?
    jstat -gccapacity:可以昄¡¤ºåQŒVM内存中三代(young,old,permåQ‰å¯¹è±¡çš„使用和占用大ž®ï¼Œå¦‚:(x¨¬)PGCMN昄¡¤ºçš„æ˜¯æœ€ž®perm的内存ä‹É用量åQŒPGCMX昄¡¤ºçš„æ˜¯perm的内存最大ä‹É用量åQŒPGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以æ ÒŽ(gu¨©)®˜q™ä¸ª¾cÀLލåQ?OC是old内纯的占用量ã€?
    jstat -gcnew pid:new对象的信息ã€?
    jstat -gcnewcapacity pid:new对象的信息及(qi¨¢ng)其占用量ã€?
    jstat -gcold pid:old对象的信息ã€?
    jstat -gcoldcapacity pid:old对象的信息及(qi¨¢ng)其占用量ã€?
    jstat -gcpermcapacity pid: perm对象的信息及(qi¨¢ng)其占用量ã€?
    jstat -util pid:¾lŸè®¡gc信息¾lŸè®¡ã€?
    jstat -printcompilation pid:当前VM执行的信息ã€?
    除了以上一个参数外åQŒè¿˜å¯ä»¥åŒæ—¶åŠ ä¸Š 两个数字åQŒå¦‚åQšjstat -printcompilation 3024 250 6是每250毫秒打印一‹Æ¡ï¼Œä¸€å…±æ‰“å?‹Æ¡ï¼Œ˜q˜å¯ä»¥åŠ ä¸?h3每三行显½CÞZ¸€ä¸‹æ ‡é¢˜ã€?
   
   3、jmap æ˜¯ä¸€ä¸ªå¯ä»¥è¾“å‡ºæ‰€æœ‰å†…å­˜ä¸­å¯¹è±¡çš„å·¥å…øP¼Œç”šè‡³å¯ä»¥ž®†VM 中的heapåQŒä»¥äºŒè¿›åˆ¶è¾“出成文本。ä‹É用方æ³?jmap -histo pid。如果连ç”?SHELL jmap -histo pid>a.log可以ž®†å…¶ä¿å­˜åˆ°æ–‡æœ¬ä¸­åŽ»ï¼ˆwindows下也可以使用åQ‰ï¼Œåœ¨ä¸€ŒD‰|—¶é—´åŽåQŒä‹Éç”¨æ–‡æœ¬å¯¹æ¯”å·¥å…øP¼Œå¯ä»¥å¯ÒŽ(gu¨©)¯”出GC回收了哪些对象。jmap -dump:format=b,file=f1 3024可以ž®?024˜q›ç¨‹çš„内存heap输出出来到f1æ–‡äšg里ã€?
   
    4、jconsole 是一个用java写的GUI½E‹åºåQŒç”¨æ¥ç›‘控VMåQŒåƈ可监控远½E‹çš„VMåQŒéžå¸¸æ˜“用,而且功能非常强。由于是GUI½E‹åºåQŒè¿™é‡Œå°±ä¸è¯¦¾l†ä»‹¾läº†åQŒä¸ä¼?x¨¬)的地方可以参考SåQµï¼®çš„官æ–ÒŽ(gu¨©)–‡æ¡£ã€?
    使用æ–ÒŽ(gu¨©)³•åQšå‘½ä»¤è¡Œé‡Œæ‰“ jconsoleåQŒé€‰åˆ™˜q›ç¨‹ž®±å¯ä»¥äº†ã€?
   
    友好提示åQšwindows查看˜q›ç¨‹åøP¼Œç”׃ºŽä»ÕdŠ¡½Ž¡ç†å™¨é»˜è®¤çš„æƒ…况下是不显½Cø™¿›½E‹idåïL(f¨¥ng)š„åQŒæ‰€ä»¥å¯ä»¥é€šè¿‡å¦‚下æ–ÒŽ(gu¨©)³•加上。ctrl+alt+del打开ä»ÕdŠ¡½Ž¡ç†å™¨ï¼Œé€‰æ‹©‘˜q›ç¨‹’选项卡,ç‚?#8216;查看’->''选择åˆ?'->加上''PID''åQŒå°±å¯ä»¥äº†ã€‚当然还有其他很好的选项ã€?/p>

 

三、参考资料:(x¨¬)

    article:http://elf8848.javaeye.com/blog/442806


    jps:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jps.html


    jstat:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html


    jmap:http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jmap.html


    jconsole:http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html    



]]>
PermGen space异常解决æ–ÒŽ(gu¨©)¡ˆhttp://www.aygfsteel.com/allrounder/articles/351292.html[ 王志ä¼?][ 王志ä¼?]Sun, 29 May 2011 15:05:00 GMThttp://www.aygfsteel.com/allrounder/articles/351292.htmlhttp://www.aygfsteel.com/allrounder/comments/351292.htmlhttp://www.aygfsteel.com/allrounder/articles/351292.html#Feedback0http://www.aygfsteel.com/allrounder/comments/commentRss/351292.htmlhttp://www.aygfsteel.com/allrounder/services/trackbacks/351292.html我在å?a href="http://www.aygfsteel.com/ynstudio/archive/2008/04/11/192205.html" target="_blank">TMS的发布工å…?/a>的时候,ž®±é‡åˆîCº†é—®é¢˜åQŒè¿™ä¸ªå·¥å…ïL(f¨¥ng)š„目的是把一个相同的¾pȝ»ŸåQŒåœ¨tomcat下自动的发布多䆾åQŒä½†å½“卸载,重新发布多次后, tomcatž®±æŒ‚了,整个ç”?sh¨´)脑如同æ­ÀLœºä¸€èˆ¬ã€‚后来ä‹É用文章里的set JAVA_OPTS=-server -Xms800m -Xmx800m -XX:PermSize=64M-XX:MaxNewSize=256m-XX:MaxPermSize=128m -Djava.awt.headless=true 解决了问题,不过åœ?G的电(sh¨´)脑上åQŒæˆ‘是把-XX:MaxPermSize=128m 调到äº?XX:MaxPermSize=256m。另外我˜q˜å°è¯•了把所有的lib都放到tomcatçš„lib下,一些libž®×ƒ¸èƒ½åœ¨æœ¬é¡¹ç›®ä¸­å†å‡ºçŽîCº†ã€?
现在看,˜q˜æ˜¯springåQŒhibernate之类的äñ”生的¾cÕd¯¼è‡´PermGen space½Iºé—´ä¸èƒö造成的这些问题ã€?br />http://www.javaeye.com/topic/80620?page=1 ˜q™ä¸ªå¸–子里讨è®ÞZº†˜q™ä¸ªé—®é¢˜åQŒæœ‰äººåšäº†äº›æœ‰ç›Šçš„分析可以看看ã€?br />我又¾l§ç®‹åœ¨æˆ‘的笔记本上做了测试T42,1G内存。tomcat版本6.0.14ã€?br />set JAVA_OPTS=-server -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m -Djava.awt.headless=true
˜q™ä¸ªé…ç½®åå¤å‘布是可以的åQŒå¦å¤–又一‹Æ¡æµ‹è¯•了ž®†é¡¹ç›®ä¸‹çš„jar包放到tomcatçš„lib下的å¯ÒŽ(gu¨©)¯”。重新安装一个lib䏋䨓(f¨´)½Iºçš„½E‹åºæ˜?0¿U’,否则æ˜?0¿U’ã€?br />
æ€È»“一下:(x¨¬)
1、修改tomcat的启动参敎ͼŒ¾cÖM¼¼å¦‚下的样å­?
set JAVA_OPTS=-server -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
 
echo Using CATALINA_BASE:   %CATALINA_BASE%
echo Using CATALINA_HOME:   %CATALINA_HOME%
echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%
if ""%1"" == ""debug"" goto use_jdk
echo Using JRE_HOME:        %JRE_HOME%
goto java_dir_displayed
:use_jdk
echo Using JAVA_HOME:       %JAVA_HOME%
:java_dir_displayed

echo Using JAVA_OPTS: %JAVA_OPTS%
set JAVA_OPTS=-server -Xms256m -Xmx256m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

2、将通用的libæ–‡äšg攑ֈ°tomcat的目录下

]]>
POJO含义http://www.aygfsteel.com/allrounder/archive/2011/04/19/348554.html[ 王志ä¼?][ 王志ä¼?]Tue, 19 Apr 2011 03:00:00 GMThttp://www.aygfsteel.com/allrounder/archive/2011/04/19/348554.htmlhttp://www.aygfsteel.com/allrounder/comments/348554.htmlhttp://www.aygfsteel.com/allrounder/archive/2011/04/19/348554.html#Feedback0http://www.aygfsteel.com/allrounder/comments/commentRss/348554.htmlhttp://www.aygfsteel.com/allrounder/services/trackbacks/348554.html POJOåQˆPlain Old Java ObjectåQ‰è¿™¿Uå«æ³•是Martin Fowler、Rebecca Parsonså’ŒJosh MacKenzieåœ?000òq´çš„一‹Æ¡æ¼”讲的时候提出来的ã€?br />       我在做J2EE培训中发现我的很多学生问我什么是POJOåQŒåŽæ¥æˆ‘在写书(《Spring2初学者实跉|•™æã€‹å’Œã€ŠSpring3初学者实跉|•™æã€‹ï¼‰çš„æ—¶å€™å‘现POJO˜q™ä¸ªæ¦‚念无法回避。现在网上对于POJO的解释很多,但是很多都是有错误的或者不够准¼‹®ã€‚对此我一开始也是存在误区的åQŒæˆ‘原来是这æ ïL(f¨¥ng)†è§£çš„åQ?br />         POJO是这æ ïL(f¨¥ng)š„一¿U?#8220;¾U¯çÑa(b¨³)çš?#8221;JavaBeanåQŒåœ¨å®ƒé‡Œé¢é™¤äº†JavaBean规范的方法和属性没有别的东西,即private属性以å?qi¨¢ng)对˜q™ä¸ªå±žæ€§æ–¹æ³•çš„publicçš„getå’Œsetæ–ÒŽ(gu¨©)³•。我们会(x¨¬)发现˜q™æ ·çš„JavaBeanå¾?#8220;单纯”åQŒå®ƒåªèƒ½è£…蝲数据åQŒä½œä¸ºæ•°æ®å­˜å‚¨çš„载体åQŒè€Œä¸å…ähœ‰ä¸šåŠ¡é€»è¾‘å¤„ç†çš„èƒ½åŠ›ã€?br />     所以下面的代码被认为是POJO了ã€?/p>

package com.tongking.spring;


public class DbHello implements Hello {

       private DictionaryDAO dao;

       public void setDao(DictionaryDAO dao) {

              this.dao = dao;

       }

}

        其实åQŒè¿™æ ïL(f¨¥ng)š„è®¤äØ“(f¨´)是错误的åQŒæˆ‘仔细阅读了《POJOs in Action》这本书的有关部分和POJO的最原始的出处http://martinfowler.com/bliki/POJO.htmlåQ?br />         The term was coined while Rebecca Parsons, Josh MacKenzie and I were preparing for a talk at a conference in September 2000. In the talk we were pointing out the many benefits of encoding business logic into regular java objects rather than using Entity Beans. We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it''s caught on very nicely.
基本的意思是我们要给å…ähœ‰ä¸šåŠ¡é€»è¾‘å¤„ç†çš„è§„åˆ™çš„Java对象åQˆregular java objectsåQ‰è“v了一个名字——POJOåQŒè¿™äº›Java对象不是EntityBeansåQˆEJB的一¿Uï¼‰ã€?/p>


        我又在http://www.webopedia.com/TERM/P/POJO.htm查到解释如下åQ?/p>

POJO, or Plain Old Java Object, is a normal Java object class (that is, not a JavaBean, EntityBean etc.)  and does not serve any other special role nor does it implement any special interfaces of any of the Java frameworks. This term was coined by Martin Fowler, Rebbecca Parsons and Josh MacKenzie who believed that by creating the acronym POJO, such objects would have a "fancy name", thereby convincing people that they were worthy of use.
        基本意思是说POJO一个正规的Java对象åQˆä¸æ˜¯JavaBeanåQŒEntityBean½{‰ï¼‰åQŒä¹Ÿä¸æ‹…当ä“Q何的ç‰ÒŽ(gu¨©)®Šçš„è§’è‰ÔŒ¼Œä¹Ÿä¸å®žçްä»ÖM½•Java框架指定的接口ã€?br />         我觉得上面的解释很准¼‹®ï¼ŒPOJO应该不是我们开始认为的JavaBeanåQŒå½“然更不是EJBåQŒå®ƒä¸åº”该依赖于框架即ç‘ô承或实现某些框架¾cÀLˆ–接口。例如:(x¨¬)Struts1中的Actionå’ŒActionForm当然不属于POJO了,而在Struts2中的Actionç”׃ºŽå¯ä»¥ä¸ç‘ô承ä“Q何的接口åQŒæ‰€ä»¥åœ¨˜q™ç§æƒ…况下Action是POJOåQŒä½†æ˜¯Struts2中的Action也可以ç‘ô承ActionSupport¾cÕd°±ä¸å†å±žäºŽPOJO了。POJO里面是可以包含业务逻辑处理和持久化逻辑åQŒä¹Ÿå¯ä»¥åŒ…含¾cÖM¼¼ä¸ŽJavaBean属性和对属性访问的setå’Œgetæ–ÒŽ(gu¨©)³•çš„ã€?br />        最后,我们æ€È»“一下给一个定义把åQŒPOJO是一个简单的、正规Java对象åQŒå®ƒåŒ…含业务逻辑处理或持久化逻辑½{‰ï¼Œä½†ä¸æ˜¯JavaBean、EntityBean½{‰ï¼Œä¸å…·æœ‰ä“Q何特ŒDŠè§’色和不ç‘ô承或不实çŽîC“Q何其它Java框架的类或接口ã€?br />
文章出处åQšé£žè¯ºç½‘(www.firnow.com):http://dev.firnow.com/course/3_program/java/javashl/200845/108451.html



]]>
非äçR入式设计 å’ŒäçR入式设计 意思?http://www.aygfsteel.com/allrounder/articles/348547.html[ 王志ä¼?][ 王志ä¼?]Tue, 19 Apr 2011 02:23:00 GMThttp://www.aygfsteel.com/allrounder/articles/348547.htmlhttp://www.aygfsteel.com/allrounder/comments/348547.htmlhttp://www.aygfsteel.com/allrounder/articles/348547.html#Feedback0http://www.aygfsteel.com/allrounder/comments/commentRss/348547.htmlhttp://www.aygfsteel.com/allrounder/services/trackbacks/348547.html非äçR入式¾pÖM»‹¾lDI用语åQŒæˆ‘得理解是两个¾l„äšgåQˆç±»åQŒæŽ¥å£ï¼‰ä¹‹é—´åQŒæ¯”较独立,不深入到另一个类内部åQŒå“ªä½å¤§è™¾èƒ½ç‚ÒŽ(gu¨©)‹¨ä¸€äºŒï¼Ÿ

 

关于“侵入å¼?#8221;å’?#8220;非äçR入式”设计

有读者讲“侵入å¼?#8221;˜q™ä¸€æœ¯è¯­æ— æ³•理解åQŒè¿™é‡Œç»™ä¸€ä¸ªç®€å•解释,是我个äh的看法ã€?

在设计一个类æ—Óž¼ŒæŒ‰ç†è¯ß_(d¨¢)¼Œéœ€è¦è€ƒè™‘的应该只是该¾cÀL‰€ä¼å›¾è¡¨ç¤ºçš„é‚£ä¸?#8220;概念”本èínåQšäØ“(f¨´)表示有关概念应记录哪些信息,该类的对象与外界交换信息的界面等½{‰ã€‚但定义˜q™ä¸ª¾cÕdƈ不是ä¸ÞZº†æ”‘Öœ¨é‚£é‡Œè§‚赏åQŒè€Œæ˜¯ä¸ÞZº†ä½¿ç”¨ã€‚在考虑¾cÕd¯¹è±¡çš„使用æ—Óž¼Œä½¿ç”¨çŽ¯å¢ƒçš„ä¸€äº›è¦ç´ å°±å¯èƒ½“侵入”˜q™ä¸ª¾cȝš„设计之中。实际上åQŒè®¸å¤šæƒ…况下我们常常可以åœ?#8220;侵入å¼?#8221;设计å’?#8220;非äçR入式”设计之间做一个选择åQŒä¸åŒé€‰æ‹©å„有优缺炏V€‚在考虑非类的程序部分时åQŒè¿™¿Ué—®é¢˜ä¹ŸåŒæ ·å­˜åœ¨ã€?

例如åQŒæˆ‘们可能需要对¾c»A的对象做引用计数åQŒè¿™é‡Œæœ‰ä¸¤ç§åŸºæœ¬å¯èƒ½æ€§ï¼š(x¨¬)ž®†è®¡æ•°åŠŸèƒ½çº³å…¥ç±»A的设计内åQˆäçR入式引用计数设计åQŒæ­¤æ—¶ç±»A的对象中包含了与引用计数有关的要素,˜q™æ˜¾ç„¶æ˜¯ä¸Žç±»A所要表½Cºçš„æ¦‚念无关的东西)åQŒæˆ–者将计数功能攑֜¨¾c»A之外åQˆéžä¾µå…¥å¼å¼•用计敎ͼ‰ã€?

本书中讨论容器时提出äº?#8220;侵入式容å™?#8221;设计å’?#8220;非äçR入式容器”设计的概念:(x¨¬)当我们希望将¾c»A的对象放入一¿Uå®¹å™¨æ—¶åQŒæ˜¯å¦éœ€è¦å°†è¯¥å®¹å™¨çš„实现要素“侵入”¾c»A的设计实çŽîC¹‹ä¸­ï¼ˆ˜q™æ˜¾ç„¶æ˜¯ä¸Žç±»A本èínòq¶æ— å¿…ç„¶å…³ç³»çš„è¦ç´ ï¼‰ã€‚ä¸åŒè€ƒè™‘å¯ÆD‡´ä¸åŒçš„容器设计ã€?nbsp; 

 

我基本上知道了,从夏大虾得著作中得知�
比如strutsåQŒéœ€è¦ç‘ô承一些strutså¾—ç±»åQŒè¿™ž®±æ˜¯ä¾µå…¥å¼ï¼Œä½¿å¾—¾pȝ»Ÿ¼›ÖM¸å¼€é‚£ä¸ªæ¡†æž¶ã€?
而spring中,业务¾cÖM¸éœ€è¦ç‘ô承框架得¾c»ï¼Œž®†æ¥æŠ›å¼ƒspring也比较方ä¾Ñ€?
æ¥ég¸Šå¤§è™¾åQˆåœŸè±†å—åQ‰èƒ½å¦è°ˆä¸‹ejb与spring之间得关¾p…R€‚你用ejb吗?如果用了åQŒæ„Ÿè§‰å¦‚何?

 

非äçR入式(non-intrusive)设计是目前非常热门的话题。在一般的讨论中,非äçR入式设计æ€ÀL˜¯å’ŒSpring˜q™æ ·çš„IoC容器或者AOP技术联¾pÕdœ¨ä¸€èµ—÷€‚但是从思想上说åQŒnon-intrusiveòq¶ä¸½{‰ä­h(hu¨¢n)于IoC或者AOPåQŒå®ƒæ˜¯ä¸€ä¸ªæ¯”AOP更加宽泛的概å¿üc€?br />       首先åQŒæˆ‘们考察一下何谓intrusive。典型的intrusive实现是ç‘ô承特定的基类, 或者实现特定的接口. 在抽象的意义上说, intrusive意味着在基¼‹€¾l“构中预留了一些特ŒDŠçš„,专用的结æž? ˜q™äº›¾l“构对于基础功能而言不仅仅是无用çš? 甚至是有害的, 例如影响性能或者模¾pŠäº†åŽŸæœ‰çš„æ¦‚å¿ëŠ»“æž? 而系¾lŸæ•´ä½“的后期扩展能力也受到这些预讄¡š„¾l“构通道的限åˆ?
non-intrusive设计的基本特ç‚ÒŽ(gu¨©)˜¯ž®½é‡åˆ©ç”¨åŸºç¡€¾l“构的元ç´? 而不是引入额外的ç‰ÒŽ(gu¨©)®Š¾l“æž„.例如, 在witrixòq›_°çš„tpl模板ä¸?br /> åQœbutton tpl:tag="ui:FlatButton" value="xx" onclick="alert('ok')" /åQ?br /> 如果后台tpl引擎不解析<ui:FlatButtonåQžæ ‡½{? 那么该标½{„¡š„表现ž®±æ˜¯æ™®é€šçš„html button. ˜q™é‡Œæ•´ä¸ª™åµé¢çš„界面表现结构没有被tpl标签所破坏,而如果像jsp tagé‚£æ ·å¼ø™¡Œè§„定必须采用节点语法, å?br /> åQœui:FlatButton value="xx" onclick="alert('ok')" /åQ?br /> 则在没有tpl引擎的情况下, 界面¾l“构被tpl标签所破坏,此时在dreamweaver˜q™æ ·çš„可视化工具中我们无法再识别出有效的界面元素, 丧失了WYSIWYG¾~–辑的能åŠ?
tpl:tag属性属于html语法本èín规定了的自定义属æ€? 它在html中的存在是符合规范的, 而且它对于button来说没有造成什么限制或损害, 因而是一¿Uæ— å®³çš„æ ‡è®°. 在没有tpl模板引擎的情况下, tpl:tag属性与其他自定义属性一样处于同æ ïL(f¨¥ng)š„åœîC½, 没有什么特ŒDŠçš„作用. 而一旦tplæ¨¡æ¿å¼•æ“Žè¯†åˆ«å‡ø™¯¥ç‰ÒŽ(gu¨©)®Šæ ‡è®°, 整个节点ž®Þp¢«è§£é‡Šæˆä¸€ä¸ªå…·æœ‰ä¸°å¯Œè¡¨çްåŞ式的òq³é¢æŒ‰é’®è€Œä¸æ˜¯ç³»¾lŸç¼ºçœé£Žæ ¼çš„æ™®é€šæŒ‰é’? 从çñ”列设计的角度上说, button对应于ui:FlatButton在没有tpl解析能力情况旉™€€åŒ–了的结æž? 在EJB3的规范中, 普通的POJO(Plain Old Java Object)对象在经˜q‡æ— å®³çš„æ ‡è®°(annotation)之后通过Enhance˜q‡ç¨‹èŽ·å¾—æŒä¹…åŒ–ç­‰ç‰ÒŽ(gu¨©)€? POJO正对应于EJB Object的退化åÅžå¼? 在某¿Uæ„ä¹‰ä¸Šæˆ‘们可以è¯? 存在着多少¿Uå¯é€€åŒ–方式,ž®±å¯¹åº”着多少¿Unon-intrusive designã€?br />       与传¾lŸè®¾è®¡ä¸­çš„结构堆砌不å? çŽîC»£æŠ€æœ¯æ›´åŠ å¼ºè°ƒåœ¨åŽŸæœ‰¾l“构基础上的同态变åŒ? å…Ïx³¨åŽŸæœ‰¾l“构中的某些部分出现ç‰ÒŽ(gu¨©)®Šæ„ä¹‰åŽæ‰€äº§ç”Ÿçš„对¿U°ç ´¾~? 在non-intrusive设计ä¸? 基础的结构中没有为扩展内¾|®ä»€ä¹ˆç‰¹ŒDŠçš„¾l“æž„, 一般仅仅是标记而已, ˜q™äº›æ ‡è®°æ˜¯æ— å®³çš„甚至本èín在基¼‹€¾l“构中是有用çš? 例如某些javascript库在前台html™åµé¢ä¸­åˆ©ç”¨html标签的class属性作为标è®? ä¸ÞZº†è¯†åˆ«˜q™äº›å±žäºŽ¾l“æž„æ ‡å‡†éƒ¨åˆ†çš„æ ‡è®°åÆˆå¯¹ä¹‹˜q›è¡Œå¤„理,我们需要一¿Uå¯é€‰æ‹©çš„结构透明æ€? 具体来说我们需要能渗透到¾pȝ»Ÿå†…部,准确的定位到标记å¤? ˜q™å°±¾cÖM¼¼äºŽx光检‹¹? x光只与某些特ŒDŠææ–™å‘生强烈作用而普通部分对于x光而言是透明çš? è€Œå½“å¤–éƒ¨å¼•æ“Žè¯†åˆ«å‡ø™¿™äº›ç‰¹ŒDŠçš„æ ‡è®°ä¹‹åŽ, 可能需要操¾Uµè¯¥å±€éƒ¨ç»“æž? 例如在基¼‹€¾l“构中插入一些新的结构以实现基础¾l“构的增å¼? ˜q™äº›éƒ½å¯èƒ½éœ€è¦åº”用类ä¼égºŽAOP的技æœ? 而在˜q™ä¸€å¢žå¼º˜q‡ç¨‹ä¸­å…³äºŽæ‰©å±•结构的具体知识存在于扩展引擎中而不是基¼‹€¾l“æž„ä¸? 因而往往整体表现å‡ÞZ¸€¿UIoC的特æ€?


转自åQšhttp://hi.baidu.com/westsky/blog/item/46d452f0127cebaaa50f522f.html

]]>
jquery 父窗å?子窗å?相关操作 http://www.aygfsteel.com/allrounder/articles/345878.html[ 王志ä¼?][ 王志ä¼?]Mon, 07 Mar 2011 06:14:00 GMThttp://www.aygfsteel.com/allrounder/articles/345878.htmlhttp://www.aygfsteel.com/allrounder/comments/345878.htmlhttp://www.aygfsteel.com/allrounder/articles/345878.html#Feedback0http://www.aygfsteel.com/allrounder/comments/commentRss/345878.htmlhttp://www.aygfsteel.com/allrounder/services/trackbacks/345878.html<1> js或者jQuery讉K—®™åµé¢ä¸­çš„æ¡†æž¶iframe.
注意:框架内的™åµé¢æ˜¯ä¸èƒ½è·¨åŸŸçš„! 假设有两个页é?在相同域ä¸?

 

假设åQšçˆ¶½H—口  index.html åQŒæœ‰ id ä¸?subifrm çš?iframe

 

1. 在index.html执行JS直接讉K—®å­çª—口中某元ç´?:

document.getElementById('subifrm').contentWindow.document.getElementById('test').style.color='red'  

2. 利用jquery 来访问子½H—口

$("#subifrm").contents().find("#test").css('color','red');

====================================================================

====================================================================

 

<2> 用DOMæ–ÒŽ(gu¨©)³•与jqueryæ–ÒŽ(gu¨©)³•¾l“合的方式实çŽîCº’动操ä½?/strong>

1.在父½H—口中操ä½?选中IFRAME中的所有单选钮

$(window.frames["iframe1"].document).find("input[@type='radio']").attr("checked","true"); 

2.在IFRAME中操�选中父窗口中的所有单选钮
$(window.parent.document).find("input[@type='radio']").attr("checked","true"); 

====================================================================

====================================================================

 

<3> 使用jquery操作iframe

1 ™åµé¢é‡Œæœ‰ä¸¤ä¸ªifame

<iframe id="leftiframe"></iframe>     
<iframe id="mainiframe></iframe>    
<iframe id="leftiframe"></iframe>  
<iframe id="mainiframe></iframe> 

leftiframe中jQuery改变mainiframeçš„src代码åQ?/p>

$("#mainframe",parent.document.body).attr("src","http://www.baidu.com"

2�如果内容里面有一个ID为mainiframe的ifame

<iframe id="mainifame"></ifame>     
<iframe id="mainifame"></ifame> 

ifame包含一个someID

<div id="someID">you want to get this content</div>     
<div id="someID">you want to get this content</div>

得到someID的内�/p>

$("#mainiframe").contents().find("someID").html();或è€?("#mainiframe").contains().find("someID").text();   
$(
"#mainiframe").contents().find("someID").html();或è€?("#mainiframe").contains().find("someID").text(); 

$(
"#mainiframe").contents().find("someID").html();或è€?("#mainiframe").contains().find("someID").text(); 


2 、如上面所½C?
   leftiframe中的jQuery操作mainiframe的内容someID的内å®?/p>

$("#mainframe",parent.document.body).contents().find("someID").html();或�nbsp;$("#mainframe",parent.document.body).contents().find("someID").val();

source:http://suan2046.javaeye.com/blog/575421

]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º ÐóÇÏØ| Çå½§ÏØ| ÉîÔóÏØ| º¼½õºóÆì| ·ïÇìÏØ| ÉϲÌÏØ| ³¤Ì©ÏØ| ̨ÖÐÏØ| ÖñÉ½ÏØ| °Í³þÏØ| ÅíÑôÏØ| ÁÙÔóÏØ| ¾ÅÁúÏØ| »ªÆºÏØ| ÂÞ½­ÏØ| ´óÖñÏØ| Ò˳ÇÊÐ| ÑĮ̀ÊÐ| ±±Æ±ÊÐ| Ò¦°²ÏØ| ÎߺþÊÐ| ¼¦ÔóÏØ| ÑÎÔ´ÏØ| ͨÐíÏØ| Ç­ÄÏ| Ðû³ÇÊÐ| ±ÈÈçÏØ| µ±Í¿ÏØ| ÇåË®ÏØ| Ë·ÖÝÊÐ| ÄÏÆ½ÊÐ| ºéºþÊÐ| ÁÖÖÜÏØ| ½úÖÝÊÐ| ÎÌÅ£ÌØÆì| Â³É½ÏØ| Î÷Æ½ÏØ| ×Þ³ÇÊÐ| »ô³ÇÏØ| Âí¹ØÏØ| Àó²¨ÏØ|