结构集筛选哪个快

.Net技术 码拜 5年前 (2016-05-21) 535次浏览
本人懒得测试了,想请大家帮忙测试下,并发下 理性、有效的性能测试过程及结论。
问题:
从数据库里查询一个小型表(万级以下)或 中型表(万级以上,百万以下),全取出结果。再多的数据,就不符合场景了,不在这里讨论。
结果集存入缓存,这样之前开关SQL的IO的效率就可以忽略了,不在这讨论。
下面对结构集做筛选操作的几种方法进行讨论研究。
1、存入DataSet的DataTable dt中。用 dt.select(“col1 like “%xxx%””)筛选结构。
2、存入DataSet的DataTable dt中。用dt.DefaltView.Filter=”col1 like “%xxx%””;
3、存入List<类mode> lst中。用lst.where(o=>o.col1.indexof(xxx)>=0).toList()
4、linq或EF的相应操作,本人相信更慢,(这个结论对吧?)有测试过程最好。
比较上面4种方法哪种效果高?
1、要结论
2、有测试过程数据,更给分
3、小型表和中型表结论能否一致?
4、假如DataTable设了主键,会否提高筛选效率
解决方案

10

没有测试,根据多年的.Net开发经验:
假如只进行一次查询,从空间利用和查询时间上,本人倾向于第3种方法。
假如要进行多次查询,从查询效率和架构设计上,本人倾向于直接从数据库查询,利用查询字段的数据库索引。

10

本人只凭经验说一下。
一 首先1比2要快,dataView慢是出名的。
二 3和1比较的话,本人个人偏向于3可能快。
三 你既然用了like并且%前置,那么索引就无效了

10

Redis不能算?
叫本人弄的话,首先DataSet不会作为内存存储的方式,本人还是会选择List<Entity>的方式,这样更能预先进行排序(其实你可以认为就是主键作用了),然后适用各种查找算法(甚或直接Hash来做映射)
其实上面都是扯淡,不同的查询条件,对应的插法不同,你硬要脱离数据库,其实也就是放弃了索引这个利器,而还想要效率的话,那也就是你本人要在程序里实现“索引”(算法),原因是算法是可预料的,所以实际可能效率上还会高于“索引”
至于测试、结论啥的,拜托,你好歹也是SQL版蓝花,没有任何约束限制条件的测试有何意义?

10

Trie  图

5

题主,就单次执行时间而言,你认为最慢的,恰恰是最快的。原因是你把全部数据加载到datatable或list的时间就远超直接查询获得结果的时间。
假如不算数据加载到内存的时间,第三种最快,原因是list是强类型的,少了类型转换的时间

5

肯定3最快
而且肯定不应该是这样的o=>o.col1.indexof(xxx)>=0

10

本人只从你的帖子看到几点:
1. 你不知道像  drt.select(…)、dataview.Filter=…. 这类字符串要付出代价去进行语法解释和临时编译,而产生的结果其实就模仿3、4。
2. 你不知道 Linq 其实为何物,你竟然不知道 3 中的where(….)就是linq,而4中的“linq或EF”也是linq。
3. 你不知道有索引和无索引的区别。你不懂“主键”跟你的那个查询表达式有没有什么关系?!
4. 你没有动手能力。连写个7、8代码的测试都动不动就说“本人懒得测试了”。
5. 你比较喜爱发帖。贴别是拿不出本人的测试代码,但是忽悠别人的帖子。你可能是很适合博客园的那种发文章的风格。

5

肯定3最快
like需要全表扫描

35

直接的主要代码

try
{
    SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString());
    con.Open();
    DataSet ds = new DataSet();
    SqlDataAdapter da = new SqlDataAdapter("select * from tableN", con);
    da.Fill(ds);
    DataTable dt = ds.Tables[0];
    da.Dispose();
    con.Close();
    Stopwatch sw = new Stopwatch();
    sw.Start();
    //为了不相互干扰,是分2次执行的,每次具体时间不等,但大小关系确定
    var Res1 = dt.Select("Col like "%xxxxxxx%"");  //00:00:00.3655990
    //var Res1 = dt.DefaultView.RowFilter="Col like "%xxxxxxxx%""; //00:00:00.2471333
    sw.Stop();
}
catch
{
    //...........
}
class Model
{
    public string Col1{set;get;}
    public string Col2 { set; get; }
    public DateTime Col3 { set; get; }
    public string Col4 { set; get; }
    public string Col5 { set; get; }
}
List<Model> list = new List<Model>();
try
{
    SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString"].ToString());
    con.Open();
    SqlCommand com = new SqlCommand("select * from tableN", con);
    SqlDataReader dr = com.ExecuteReader();
    while(dr.Read())
    {
        list.Add(new Model() { Col1 = dr["Col1"].ToString().Trim(), Col2 = dr["Col2"].ToString().Trim(), Col3 = Convert.ToDateTime(dr["Col3"].ToString().Trim()), Col4 = dr["Col4"].ToString().Trim(), Col5 = dr["Col5"].ToString().Trim() });
    }
    com.Dispose();
    con.Close();
    
    Stopwatch sw = new Stopwatch();
    sw.Start();
    var Res1 = list.Where(o => o.Col1.IndexOf("xxxxxxxxx")>=0).ToList(); //00:00:00.6017635
    sw.Stop();
 }
catch
{
    //...........
}

写的比较匆忙


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明结构集筛选哪个快
喜欢 (0)
[1034331897@qq.com]
分享 (0)