mssqlserver2016內存表測試


測試環境:

windows2012, sqlserver2016, 64G內存的pc服務器,接口:c# .netframework4.6

內存表是:schema_only

測試程序和數據庫服務器在同一主機

 

插入10萬條guid字符串(ID列),純單條insert語句插入:

磁盤表:57s

內存表:12s

 

根據表主鍵ID查詢1000次ID並匯總時間:

磁盤表:170ms  (直接select id, bh where id='333')

內存表:170ms(直接select id, bh where id='333')

內存表:250ms (本地編譯的存儲過程,"p1 {lst[m]} )

內存表:170ms  (本地編譯的存儲過程,  cmd.Parameters[0].Value = lst[0];) 

 

結論:

插入速度提高很多,如果按照本地編譯存儲過程,可能插入更快,參考:https://blog.csdn.net/yenange/article/details/32705347

查詢速度,是否用本地編譯的存儲過程,感覺差不多,我主要是想模擬key-value情況,查詢也是按主鍵查詢的,速度和磁盤表沒有明顯變化

考慮到內存表的諸多限制,如表長度不超過8000多,也不清楚內存何時釋放,有人說只有drop表時也釋放,delete 表中記錄是不釋放內存占用的。

還不如直接用磁盤表方便可控

 

代碼參考:

  private void button3_Click(object sender, EventArgs e)
        {
            lst.Clear();
            for(int m=0;m<100000;m++)
            {
                lst.Add(Guid.NewGuid().ToString());
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //普通表插入
            this.插入表("table_1");
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //普通表查詢
            SqlConnection cn = new System.Data.SqlClient.SqlConnection(cnstr);
            cn.Open();
            SqlCommand cmd = cn.CreateCommand();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            DateTime t = DateTime.Now;
            for (int m=0;m<1000;m++)
            {
                cmd.CommandText = $"select * from table_1 where id ='{lst[m]}'";
                da.Fill(ds, "t");
            }
            cn.Close();

            this.textBox1.Text = (DateTime.Now - t).TotalMilliseconds.ToString();
        }

        private void button5_Click(object sender, EventArgs e)
        {
            //內存表插入
            this.插入表("t_mem");
        }

        private void button4_Click(object sender, EventArgs e)
        {
            //內在表查詢
            SqlConnection cn = new System.Data.SqlClient.SqlConnection(cnstr);
            cn.Open();
            SqlCommand cmd = cn.CreateCommand();
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet ds = new DataSet();
            DateTime t = DateTime.Now;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = $"p1";
            cmd.Parameters.Add("@id", SqlDbType.VarChar);
            for (int m = 0; m < 1000; m++)
            {
                cmd.Parameters[0].Value = lst[0];
                da.Fill(ds, "t");
            }
            cn.Close();

            this.textBox1.Text = (DateTime.Now - t).TotalMilliseconds.ToString();



            //SqlConnection cn = new System.Data.SqlClient.SqlConnection(cnstr);
            //cn.Open();
            //SqlCommand cmd = cn.CreateCommand();
            //SqlDataAdapter da = new SqlDataAdapter(cmd);
            //DataSet ds = new DataSet();
            //DateTime t = DateTime.Now;
            //for (int m = 0; m < 1000; m++)
            //{
            //    cmd.CommandText = $"p1 {lst[m]}'";
            //    da.Fill(ds, "t");
            //}
            //cn.Close();

            //this.textBox1.Text = (DateTime.Now - t).TotalMilliseconds.ToString();

            //SqlConnection cn = new System.Data.SqlClient.SqlConnection(cnstr);
            //cn.Open();
            //SqlCommand cmd = cn.CreateCommand();
            //SqlDataAdapter da = new SqlDataAdapter(cmd);
            //DataSet ds = new DataSet();
            //DateTime t = DateTime.Now;
            //for (int m = 0; m < 1000; m++)
            //{
            //    cmd.CommandText = $"select * from t_mem where id ='{lst[m]}'";
            //    da.Fill(ds, "t");
            //}
            //cn.Close();

            //this.textBox1.Text = (DateTime.Now - t).TotalMilliseconds.ToString();
        }

        private void 插入表(string tab)
        {
            SqlConnection cn = new System.Data.SqlClient.SqlConnection(cnstr);
            cn.Open();
            SqlCommand cmd = cn.CreateCommand();
            DateTime t = DateTime.Now;
            foreach (string str in lst)
            {
                cmd.CommandText = $"insert into {tab}(id,bh) values('{str}','2')";
                cmd.ExecuteNonQuery();
            }
            cn.Close();

            this.textBox1.Text = (DateTime.Now - t).TotalMilliseconds.ToString();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM