• 全部
  • .NET Framework
  • ASP
  • Web Services
  • .NET互联网桌面应用
  • VB
  • 图表区
  • 分析与设计
  • 组件/控件开发
  • AppLauncher
  • 问答

MSSQL输出1000条记录不到一秒,但转化为 JObject再变字符串究然耗时超过2分钟,什么问题

goodgame365 2020-11-30 09:53:05
今天碰到一个耗时异常的问题

从MSSQL读取1000条记录,在分析查询器那里测试,不到一秒就出结果了

但在C#了,将每条记录转为

-----------------
foreach (DataRow rs in dt.Rows)
{
ii++;
JObject jOb= new JObject();
jOb.Add(new JProperty("SourceID", rs["SourceID"]));
jOb.Add(new JProperty("RoomNum", rs["RoomNum"]));


。。。 。。。
----------------

竟用了好久,然后我再将jOb这个对象转为字符串jobj.ToString(),发现这个用时更久,不知什么原因,

说明下,job每条记录是这样的
{
"SourceID": 8243,
"RoomNum": "0202",
"SourceTag": "\u9614\u7ef0\u4e09\u623f,\u5357\u5317\u901a\u900f,\u5165\u6237\u82b1\u56ed",
"housetypes": "3\u623f2\u5385",
"CoveredArea": 119.68,
"Floors": 2,
"SourceImg": "house/2020_4/30/s_20200430085521VTL000.jpg",
"oneprice": 6161.0,
"totprice": 737348.5,
"IsOnline": true,
"IsSold": false,
"HouseTypeID": 97
},



共有981条,存为文本的话是379K,但调试时出结果耗时几分钟,是哪里出问题了呢,请高人指点,万分感谢!



...全文
11192 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
生财 2020-12-07
楼主试试直接用字符串拼接看看,是否也一样慢, 慢的原因可能是jObject 转换时内部存在较耗时的初始化操作. 第一次执行特别慢(可能存在动态编译表达树之类的), 第二次就快了.
回复
jun471537173 2020-12-05
尽量不要在循环中读数据库,可以先把数据都读到内存中再进行操作。
回复
goodgame365 2020-12-02
我发现问题了,原来还是我一直纠结的问题,是一次lef join 联合查询的效率高还是 遍历数据时循环再读取另一张表效率高,实际发现,遍历数据时,如果里面不在二次调取另一张表的数据,大概用时2秒左右,至于上次我提到的jOb这个对象转为字符串jobj.ToString()耗时久,诂计是我的破电脑的原因,再执行这里断点点开后,秒完成,没再发生! 那么问题来了,如果全部 left join联合查询,有些是需要调取多条记录的怎么办呢?
回复
基本上,就算是100万行,查询分析器告诉“秒告诉”你有100万行查询结果,然后当你序列化到 asp.net 控件也得几十分钟吧?!不需要看就不要弄到客户端,如果 html 能看的就不要弄什么 DataGrid,内存对象保存数据就可以的既不要弄什么 asp.net 控件,强类型高级对象可以的就不用使用低级的字符串去组织 JObject。
回复
你在查询分析器数过它详细列出来确实是将近1000行了吗?
回复
gs0038 2020-12-01
这玩意自己拼接自己控制,别人封装的属于大众化的,不一定适合你自己呢
回复
你是要 datatable 转json吗? 直接就转了 ,别转成JObject 了 引用微软的Newtonsoft.Json; JsonConvert.SerializeObject(ds) 就是json包了。 而且你的写法有问题, 为什么 JObject jOb= new JObject();                     jOb.Add(new JProperty("SourceID", rs["SourceID"]));                     jOb.Add(new JProperty("RoomNum", rs["RoomNum"])); 不是应该创建一个 list<JObject > a= new list<JObject > JObject 创建个实体类 然后 for() { JObject  b =new JObject (); b.lie=zhi; a.add(b); } 你多还几个写法 就知道实际浪费在哪里了
回复
相关推荐
发帖
.NET技术社区
创建于2007-09-28

5.8w+

社区成员

.NET技术交流专区
申请成为版主
帖子事件
创建了帖子
2020-11-30 09:53
社区公告
暂无公告