<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    qileilove

    blog已經(jīng)轉(zhuǎn)移至github,大家請訪問 http://qaseven.github.io/

    關于SQL一對多關系轉(zhuǎn)換的效率思考(續(xù))

     之前寫了一篇文章關于SQL函數(shù)效率的一些測試與思考,在當中提到了將數(shù)據(jù)庫中一對多關系轉(zhuǎn)換為一對一關系顯示的兩種方法:第一種方法是在數(shù)據(jù)庫中寫一個函數(shù),第二種方法為在程序中獲取表Class與表Student所有數(shù)據(jù),然后對比ClassID。

      那么除了這兩種方法,還有沒有更快、更好的方法呢?在這里我再介紹兩種方法與大家分享、討論

      閑話不多說,下面進入正文。還是那兩張表

      Student:

      Class:

      想要獲得的數(shù)據(jù)效果為

      第三種方法:使用SQL函數(shù)stuff

      SQL語句如下

    SELECT C.ID, C.ClassName,stuff((select ',' + S.StuName from dbo.Student S where S.ClassID = C.ID for xml path('')),1,1,'')as stuName FROM Class C

      將第三種方法與第二種方法(在程序中獲取表Class與表Student所有數(shù)據(jù),然后對比ClassID)對比效率,輸出結(jié)果如下:

      00:00:00.5497196
      00:00:00.3517834
      效率比1.562665
      =============================
      00:00:01.0181020
      00:00:00.7060913
      效率比1.441884
      =============================
      00:00:01.4912831
      00:00:01.0682834
      效率比1.395962
      =============================
      00:00:01.9636678
      00:00:01.4199062
      效率比1.382956
      =============================
      00:00:02.4391574
      00:00:01.7712431
      效率比1.377088
      =============================
      00:00:02.9111560
      00:00:02.1255719
      效率比1.369587
      =============================
      00:00:03.3923697
      00:00:02.5069699
      效率比1.353175
      =============================
      00:00:03.8671226
      00:00:02.8594541
      效率比1.352399
      =============================
      00:00:04.3314012
      00:00:03.2064415
      效率比1.350844
      =============================
      00:00:04.8019142
      00:00:03.5546490
      效率比1.350883
      =============================

     第一個時間為第二種方法的執(zhí)行時間,第二個時間為第三種方法執(zhí)行時間。每種方法循環(huán)了10次以確保數(shù)據(jù)準確性

      關于測試程序代碼在之前的文章中有提到,改一下SQL語句就可以使用了

      數(shù)據(jù)結(jié)果顯示第三種方法要優(yōu)秀不少。至于為什么第三種方法快,我心里已經(jīng)有了個大致的想法,不過因為太難表述了,就懶得浪費口水說了,大家記住結(jié)論就好了

      接下來介紹第四種方法:在SQL中加載程序集,在查詢時調(diào)用程序集

      加載程序集的方法有些難以表述,感興趣的朋友可以自己去查找相關資料。在此我貼出主要代碼:

    View Code

        /// <summary>
        /// The variable that holds the intermediate result of the concatenation
        /// </summary>
        private StringBuilder intermediateResult;

        /// <summary>
        /// Initialize the internal data structures
        /// </summary>
        public void Init()
        {
            this.intermediateResult = new StringBuilder();
        }

        /// <summary>
        /// Accumulate the next value, not if the value is null
        /// </summary>
        /// <param name="value"></param>
        public void Accumulate(SqlString value)
        {
            if (value.IsNull)
            {
                return;
            }

            this.intermediateResult.Append(value.Value).Append(',');
        }

        /// <summary>
        /// Merge the partially computed aggregate with this aggregate.
        /// </summary>
        /// <param name="other"></param>
        public void Merge(Concatenate other)
        {
            this.intermediateResult.Append(other.intermediateResult);
        }

        /// <summary>
        /// Called at the end of aggregation, to return the results of the aggregation.
        /// </summary>
        /// <returns></returns>
        public SqlString Terminate()
        {
            string output = string.Empty;
            //delete the trailing comma, if any
            if (this.intermediateResult != null
                && this.intermediateResult.Length > 0)
            {
                output = this.intermediateResult.ToString(0, this.intermediateResult.Length - 1);
            }

            return new SqlString(output);
        }

        public void Read(BinaryReader r)
        {
            intermediateResult = new StringBuilder(r.ReadString());
        }

        public void Write(BinaryWriter w)
        {
            w.Write(this.intermediateResult.ToString());
        }

      這個方法比第三種方法快得不多,大概只有5%到10%的性能提升,但是這種方法十分優(yōu)雅,我竊以為這種方法是解決一對多關系轉(zhuǎn)換一對一方法中最好的方法

      PS:最近太懶了,都沒有來寫東西。罪過罪過

      再PS:想吐槽一下,最近園子里幾個小妹子寫的生活上的雜七雜八的東西居然引起了那么多人的追捧,而真正的技術貼卻是無人問津,不得不說是一種悲哀

      再再PS:歡迎留言討論,歡迎轉(zhuǎn)載。不足之處望海涵

    posted on 2012-05-24 09:35 順其自然EVO 閱讀(190) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫

    <2012年5月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    導航

    統(tǒng)計

    常用鏈接

    留言簿(55)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲VA中文字幕不卡无码| 亚洲成A人片在线观看无码3D | 99热这里只有精品6免费| 久久亚洲精品无码播放| 抽搐一进一出gif免费视频| 亚洲中文字幕无码专区| 国产精品小视频免费无限app| 国产日韩成人亚洲丁香婷婷| 一级特黄色毛片免费看| 亚洲成年看片在线观看| 久久久久国色AV免费观看| 亚洲精品乱码久久久久久久久久久久 | 亚洲国产精彩中文乱码AV| 国产精成人品日日拍夜夜免费 | 国产男女猛烈无遮挡免费视频网站| 亚洲AV无码一区二区三区网址| 在线观看人成网站深夜免费| 午夜亚洲国产理论片二级港台二级 | 性做久久久久免费观看| 九九九国产精品成人免费视频| 亚洲欧洲日产国码无码网站| 久久久国产精品无码免费专区| 亚洲午夜精品在线| 波多野结衣久久高清免费| 一级毛片一级毛片免费毛片| 亚洲av片劲爆在线观看| 日韩免费一区二区三区在线播放| 精品韩国亚洲av无码不卡区 | 亚洲高清美女一区二区三区| 24小时免费直播在线观看| 无人视频在线观看免费播放影院 | 色吊丝最新永久免费观看网站| 美女视频免费看一区二区| 亚洲不卡中文字幕无码| 97无码免费人妻超级碰碰夜夜| 日韩在线视频免费| 亚洲精品成人久久| 亚洲成a人片在线观看国产| 久久福利资源网站免费看| 特级毛片爽www免费版| 亚洲白嫩在线观看|