日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
優(yōu)化你的DiscuzNT,讓它跑起來

去年用DiscuzNT3.0做過二次開發(fā),做過一些性能優(yōu)化,但是時(shí)間關(guān)系一直沒機(jī)會(huì)寫下來;趁著5.1長假,來寫篇回憶性的隨筆吧。

之前看過園子里代震軍同學(xué)的博客,知道了老代同學(xué)是DiscuzNT團(tuán)隊(duì)的一員,從他的博文學(xué)了不少東西 ,我這里寫的博文是針對(duì)一些問題提出自己的看發(fā)和解決方案,針對(duì)問題并無針對(duì)任何人之意,秉著技術(shù)交流的原則。

DiscuzNT給我的印象是

1)功能很強(qiáng)大,所有你能想到的基本都已經(jīng)有了;

2)性能有待優(yōu)化,數(shù)據(jù)量較大的情況會(huì)產(chǎn)生性能瓶頸(這也正是寫此文的目的)。之前發(fā)的博文由于缺乏經(jīng)驗(yàn),沒有足夠的論據(jù),今天會(huì)多提供些圖文并茂的論據(jù)。

好了,言歸正轉(zhuǎn),開始我們今天的優(yōu)化之旅。

本系統(tǒng)環(huán)境如下:

軟件環(huán)境:DiscuzNT3.0 , sqlserver2000,windwos server 2003

數(shù)據(jù)環(huán)境:主貼表 dnt_topics 約220萬條記錄,回復(fù)表3個(gè),dnt_posts1 約400萬, dnt_posts2 約500萬, dnt_posts3 約500萬,附件表 約170萬,用戶表 dnt_users 約20萬, 論壇表 dnt_forums 約5000個(gè)論壇

現(xiàn)象:看帖時(shí),如果帖子包含附件,會(huì)很卡;

目的:優(yōu)化看帖速度,尤其是有附件的情況

動(dòng)手:看下它是如何獲取附件的,找到showtopic.aspx.cs,代碼如下:

 
 
 
 
  1. postlist = Posts.GetPostList(postpramsInfo, out attachmentlist, ismoder == 1); 

再看下 Posts.GetPostList() 方法的代碼:

 
 
 
 
  1. /// 
  2.         /// 獲取指定條件的帖子DataSet
  3.         /// 
  4.         /// 參數(shù)列表
  5.         /// 指定條件的帖子DataSet
  6.         public static List GetPostList(PostpramsInfo postpramsInfo, out List attachList, bool isModer)
  7.         {
  8.             List postList = Data.Posts.GetPostList(postpramsInfo);
  9.             int adCount = Advertisements.GetInPostAdCount("", postpramsInfo.Fid);
  10.             foreach (ShowtopicPagePostInfo postInfo in postList)
  11.             {
  12.                 LoadExtraPostInfo(postInfo, adCount);
  13.             }
  14.             attachList = new List();
  15.             if (postList.Count == 0)
  16.                 return postList;
  17.             string pidList = GetPidListWithAttach(postList);
  18.             attachList = Attachments.GetAttachmentList(postpramsInfo, pidList);
  19.             ParsePostListExtraInfo(postpramsInfo, attachList, isModer, postList);
  20.             return postList;23         }

從這里可以看出,DiscuzNT是把所有的帖子id組裝成 “ id1,id2,id3,id4 ” 的形式,然后傳入數(shù)據(jù)庫,避免多次調(diào)用數(shù)據(jù)庫,這個(gè)思路很好,現(xiàn)在我們順藤摸瓜,看看它調(diào)用了數(shù)據(jù)庫的腳本,它調(diào)用了這個(gè)過程 dnt_getattachmentlistbypid, 用profiler跟蹤這個(gè)過程看看性能。

看上面的圖,exec dnt_getattachmentlistbypid @pidlist = '5163797'  這個(gè)腳本的cpu=4531,reads=152641,duration=6156,很可觀吧,如果同時(shí)有10個(gè)人來調(diào)用這個(gè)過程,估計(jì)數(shù)據(jù)庫的壓力就大了,如果100人,難以想象。那我們?cè)趺磥韮?yōu)化這個(gè)過程呢,先看看里面它怎么寫的,是否用到了索引。

 
 
 
 
  1. ALTER   PROCEDURE [dnt_getattachmentlistbypid]
  2. @pidlist varchar(500)
  3. AS
  4. SELECT 
  5. [aid],
  6. [uid],
  7. [tid],
  8. [pid],
  9. [postdatetime],
  10. [readperm],
  11. [filename],
  12. [description],
  13. [filetype],
  14. [filesize],
  15. [attachment],
  16. [downloads],
  17. [attachprice],
  18. [width],
  19. [height] 
  20. FROM [dnt_attachments] 
  21. WHERE CHARINDEX(','+RTRIM([dnt_attachments].[pid])+',', ','+@pidlist+',')>0GO

這里主要查找的條件是pid,如果在pid列上建立索引,并且過程能用到索引,效果應(yīng)該會(huì)更理想,這個(gè)優(yōu)化工作我分為如下幾步:

1)pid列上是否有索引;

2)過程是否用到了索引;

3)優(yōu)化sql腳本;

4)跟蹤優(yōu)化后效果;

我們一步一個(gè)坑往下走:

1)sp_helpindex dnt_attachments 看看是否有索引,如下圖,從圖中可以看到pid列上是有索引的,如果沒有索引,請(qǐng)建立相關(guān)索引

2)看看是否用到了索引,CTRL + L 看看下面語句的執(zhí)行計(jì)劃,他用到的索引是 PK_dnt_attachments,根本沒用到我們期望的pid

3)沒用到我們期望的索引,那我們就來優(yōu)化一下;上面的dnt_getattachmentlistbypid過程里面 WHERE CHARINDEX(','+RTRIM([dnt_attachments].[pid])+',', ','+@pidlist+',')>0 對(duì)pid進(jìn)行了列運(yùn)算,這個(gè)是罪魁禍?zhǔn)?,我們想辦法把這個(gè)列運(yùn)算去掉,這個(gè)過程最終改成下面這個(gè)樣子:

 
 
 
 
  1. ALTER    PROCEDURE [dnt_getattachmentlistbypid]
  2. @pidlist varchar(500)
  3. AS
  4. declare @sql nvarchar(2000)
  5. set @sql = '
  6. SELECT 
  7. [aid],
  8. [uid],
  9. [tid],
  10. [pid],
  11. [postdatetime],
  12. [readperm],
  13. [filename],
  14. [description],
  15. [filetype],
  16. [filesize],
  17. [attachment],
  18. [downloads],
  19. [attachprice],
  20. [width],
  21. [height] 
  22. FROM [dnt_attachments] 
  23. WHERE pid in (' + @pidlist + ')'
  24. exec(@sql)
  25. GO

4)改完之后我們來跟蹤下優(yōu)化后的性能,看看跟蹤效果圖(同一個(gè)過程,同一個(gè)參數(shù),第2個(gè)是優(yōu)化前,第4個(gè)是優(yōu)化后,優(yōu)化效果灰常滿意)

至此,我們的優(yōu)化告一段落。


標(biāo)題名稱:優(yōu)化你的DiscuzNT,讓它跑起來
分享網(wǎng)址:http://m.5511xx.com/article/cdcojds.html