成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

優化你的DiscuzNT,讓它跑起來

數據庫 SQL Server 數據庫運維
去年用DiscuzNT3.0做過二次開發,做過一些性能優化,但是時間關系一直沒機會寫下來;趁著5.1長假,來寫篇回憶性的隨筆吧。

去年用DiscuzNT3.0做過二次開發,做過一些性能優化,但是時間關系一直沒機會寫下來;趁著5.1長假,來寫篇回憶性的隨筆吧。

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

DiscuzNT給我的印象是

1)功能很強大,所有你能想到的基本都已經有了;

2)性能有待優化,數據量較大的情況會產生性能瓶頸(這也正是寫此文的目的)。之前發的博文由于缺乏經驗,沒有足夠的論據,今天會多提供些圖文并茂的論據。

好了,言歸正轉,開始我們今天的優化之旅。

本系統環境如下:

軟件環境:DiscuzNT3.0 , sqlserver2000,windwos server 2003

數據環境:主貼表 dnt_topics 約220萬條記錄,回復表3個,dnt_posts1 約400萬, dnt_posts2 約500萬, dnt_posts3 約500萬,附件表 約170萬,用戶表 dnt_users 約20萬, 論壇表 dnt_forums 約5000個論壇

現象:看帖時,如果帖子包含附件,會很卡;

目的:優化看帖速度,尤其是有附件的情況

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

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

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

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

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

看上面的圖,exec dnt_getattachmentlistbypid @pidlist = '5163797'  這個腳本的cpu=4531,reads=152641,duration=6156,很可觀吧,如果同時有10個人來調用這個過程,估計數據庫的壓力就大了,如果100人,難以想象。那我們怎么來優化這個過程呢,先看看里面它怎么寫的,是否用到了索引。

  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列上建立索引,并且過程能用到索引,效果應該會更理想,這個優化工作我分為如下幾步:

1)pid列上是否有索引;

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

3)優化sql腳本;

4)跟蹤優化后效果;

我們一步一個坑往下走:

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

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

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

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

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

至此,我們的優化告一段落。

原文鏈接:http://www.cnblogs.com/gezifeiyang/archive/2011/05/02/2034124.html

【編輯推薦】

  1. 淺述當前模式讀與一致性讀續
  2. 淺述當前模式讀與一致性讀的區別
  3. 告訴你,如何成就DBA職業生涯
  4. DBA應用技巧:如何升級InnoDB Plugin
  5. MySQL日志操作教程:DBA們管理的利器

 

責任編輯:艾婧 來源: 博客園
相關推薦

2022-12-06 09:03:44

代碼fork系統

2021-01-22 14:03:34

Flutter系統鴻蒙

2009-04-29 14:40:17

2021-01-12 11:12:58

大數據智慧交通

2019-09-03 08:00:00

電腦硬盤程序

2023-03-02 23:09:53

Node.jsC++JS

2017-11-17 15:25:02

Java線程安全

2023-08-03 09:02:32

LangChain開發GLM

2010-07-13 09:31:08

RubyRuby on Rai

2024-05-27 09:01:22

2020-04-06 09:05:07

谷歌機器狗人工智能

2015-08-04 17:46:19

戴爾anycloud云計算

2022-01-10 10:23:07

瀏覽器Vitenode

2023-01-31 07:42:29

代碼JDKMaven

2012-05-15 13:29:20

HTML5

2019-03-21 15:00:47

Python程序代碼

2021-11-10 10:00:48

鴻蒙HarmonyOS應用

2011-05-24 15:29:05

程序CC++

2014-04-18 17:12:00

樂跑手環

2024-06-12 12:28:23

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美日韩视频 | 亚洲欧美日韩成人在线 | 日韩一区二区久久 | 国产黄色av网站 | 日韩精品福利 | 国产九九九九 | 黄色毛片在线看 | 国产网站久久 | 精品久久久久一区二区国产 | www久久av | 中文字幕一区二区三区在线视频 | 日韩av视屏 | 国产精品日韩高清伦字幕搜索 | 国产一级视频免费播放 | 国产一区h| 亚洲精品久久久一区二区三区 | 国产精品永久免费观看 | 中文字幕亚洲视频 | 51ⅴ精品国产91久久久久久 | 国产色网 | 国产欧美视频一区二区 | 国产精品一区二区久久久久 | 成人不卡 | 国产黄色精品 | 九九热这里只有精品在线观看 | 九九九久久国产免费 | 亚洲国产日本 | www久久国产 | 精品国产亚洲一区二区三区大结局 | 欧美一区二区三区,视频 | 免费激情| 97人人干 | 日日操夜夜操天天操 | 成人一区二区电影 | 精品成人av | 日本又色又爽又黄的大片 | av免费网址 | 欧美一卡二卡在线观看 | 精品自拍视频在线观看 | 瑟瑟免费视频 | 91久久精品一区二区二区 |