千万级数据的插入语查询

l9920704 2014-08-31 12:26:52
现在有大概两千万条数据,分在10个文本文件里面。每个文件大概有300M,现在我想把这些记录存在数据库里面,然后再进行查询。现在的问题有两个:
1、怎么样快速的把这些信息导入到数据库里面(SQL SERVER),如果是多线程的话是一个线程读取一个文件的信息然后导入,还是每个文件都有多个线程去读取然后导入。
2、数据导入到数据库中之后怎么样快速的查询相应的信息,主要正对NAME和ID这两个字段,数据在一张表里面。
...全文
680 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
千万行的数据算比较小的量 基本上SqlBulkCopy就能搞定 如果还是觉得磁盘IO不够,可以做成分区表,再加上合理的索引,这样查询/插入的速度都可以保证 我们日均千万行的数据也基本上这个思路可以搞定,还有复杂的更新逻辑什么的
exception92 2014-09-01
  • 打赏
  • 举报
回复
就 用SqlBulkCopy,可以设置 每次拷贝的数量,少则几百条,多则上万条。 提升查询速度 可以通过创建索引;不要使用in,like等模糊字符查询函数。
ijwsoft 2014-09-01
  • 打赏
  • 举报
回复
楼主可以考虑 用微软的 BI开发工具。用 SSIS http://baike.baidu.com/view/1018273.htm?fr=aladdin
卧_槽 2014-09-01
  • 打赏
  • 举报
回复
引用 6 楼 zhi_ai_yaya 的回复:
[quote=引用 2 楼 zhi_ai_yaya 的回复:] SQL SERVER有一个导入数据功能,选择“平面文件数据源”,选中文本文件直接导入。或者使用代码导入也行,这是建立数据库的过程,效率不需要太高,慢点都行的。 快速查询,最简单的就是给相应字段添加索引。至于是否非空,没有多大关系~~ 在同一张表中,那可能会出现IO瓶颈,解决的办法就是一张表的记录分开存储在多个磁盘,使用多线程并行查询,再合并得到结果集。
抱歉,这里的“使用多线程并行查询”可能会引起歧义。我的原意是:客户依然是使用通用的查询语句,但是数据库接收到查询语句并建立一个查询计划后,进行查询优化:这时候使用并行子查询,多个线程查询存储在不同磁盘中的数据库表,每个子查询都获得一个查询结果,最后合并得到一个查询结果集,返回给客户。查询任务结束。 就是说,数据库查询过程对于客户是透明的,客户并不知道数据库内部使用的是并行多磁盘查询还是普通查询。 我没有搞过高性能数据库,但这是数据库解决IO瓶颈的一个直观的办法,在主流数据库中可能集成了相关模块和工具。[/quote] 多线程解决不了IO瓶颈,你的思路完全错了,主流数据库不会用这样的错误思路。
smthgdin_020 2014-09-01
  • 打赏
  • 举报
回复
1.SqlBulkCopy 2.设置索引,当然,也看你那两个字段的数据情况,越是少重复越快。
threenewbee 2014-08-31
  • 打赏
  • 举报
回复
多现程不会更快。 可以用SqlBulkCopy http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx http://blog.csdn.net/wxwrui335/article/details/6497413
  • 打赏
  • 举报
回复
导入到同一个表,即使你用了多线程去读取再插入,数据库那边也是会有IO瓶颈的,这个没什么太好的办法,你可以测试看看
Ki1381 2014-08-31
  • 打赏
  • 举报
回复
1、如果导入是一次性工作的话直接就用SQL自带的导入工具吧。如果非得用TSQL实现,可以试下BULK INSERT。 2、一般针对NAME/ID建索引。2000W条也不算大。(LZ不会是要玩KF查询吧 :D)
我叫小菜菜 2014-08-31
  • 打赏
  • 举报
回复
SQL SERVER有一个导入数据功能,选择“平面文件数据源”,选中文本文件直接导入。或者使用代码导入也行,这是建立数据库的过程,效率不需要太高,慢点都行的。 快速查询,最简单的就是给相应字段添加索引。至于是否非空,没有多大关系~~ 在同一张表中,那可能会出现IO瓶颈,解决的办法就是一张表的记录分开存储在多个磁盘,使用多线程并行查询,再合并得到结果集。
l9920704 2014-08-31
  • 打赏
  • 举报
回复
这里的ID不是主键,而是一个字段名而已,ID有可能为空的
l9920704 2014-08-31
  • 打赏
  • 举报
回复
引用 6 楼 zhi_ai_yaya 的回复:
[quote=引用 2 楼 zhi_ai_yaya 的回复:] SQL SERVER有一个导入数据功能,选择“平面文件数据源”,选中文本文件直接导入。或者使用代码导入也行,这是建立数据库的过程,效率不需要太高,慢点都行的。 快速查询,最简单的就是给相应字段添加索引。至于是否非空,没有多大关系~~ 在同一张表中,那可能会出现IO瓶颈,解决的办法就是一张表的记录分开存储在多个磁盘,使用多线程并行查询,再合并得到结果集。
抱歉,这里的“使用多线程并行查询”可能会引起歧义。我的原意是:客户依然是使用通用的查询语句,但是数据库接收到查询语句并建立一个查询计划后,进行查询优化:这时候使用并行子查询,多个线程查询存储在不同磁盘中的数据库表,每个子查询都获得一个查询结果,最后合并得到一个查询结果集,返回给客户。查询任务结束。 就是说,数据库查询过程对于客户是透明的,客户并不知道数据库内部使用的是并行多磁盘查询还是普通查询。 我没有搞过高性能数据库,但这是数据库解决IO瓶颈的一个直观的办法,在主流数据库中可能集成了相关模块和工具。[/quote]一张表的记录分开存储在多个磁盘不是很懂,以前没做过这方面的效率优化,是指记录放在多个表中,然后用多个线程去查这些表,然后把记录合并么?
l9920704 2014-08-31
  • 打赏
  • 举报
回复
引用 2 楼 zhi_ai_yaya 的回复:
SQL SERVER有一个导入数据功能,选择“平面文件数据源”,选中文本文件直接导入。或者使用代码导入也行,这是建立数据库的过程,效率不需要太高,慢点都行的。 快速查询,最简单的就是给相应字段添加索引。至于是否非空,没有多大关系~~ 在同一张表中,那可能会出现IO瓶颈,解决的办法就是一张表的记录分开存储在多个磁盘,使用多线程并行查询,再合并得到结果集。
数据导入总是出错,查了下好像是因为有‘@’符号的原因,没法做批量导入
  • 打赏
  • 举报
回复
引用 9 楼 cmd201314 的回复:
别问“sp1234”,他会骂人的,他只以专业开发人员为伍,我刚在论坛发了个贴提问,给他说得狗血淋头 贴子如下: http://bbs.csdn.net/topics/390874699
引用 9 楼 cmd201314 的回复:
别问“sp1234”,他会骂人的,他只以专业开发人员为伍,我刚在论坛发了个贴提问,给他说得狗血淋头 贴子如下: http://bbs.csdn.net/topics/390874699
还“狗血淋头”。呵呵。如果csdn有个功能可以识别出你的问题来,我自然不会去回答你的问题。但是你有什么权利在现在这种帖子里这样写呢?你以为你龌龊地在我回复的帖子中捣乱,就能改变我能实际回答 lz 的问题和给以分析的文字的价值,以为这样就报了你的什么“仇”似地,那么你也太幼稚了。
cmd201314 2014-08-31
  • 打赏
  • 举报
回复
别问“sp1234”,他会骂人的,他只以专业开发人员为伍,我刚在论坛发了个贴提问,给他说得狗血淋头 贴子如下: http://bbs.csdn.net/topics/390874699
  • 打赏
  • 举报
回复
大批量导入数据时,首先要保证没有索引、没有查询、没有触发器、没有约束。只有当所有数据都导入之后,才创建那些辅助的东西。否则,就会把原本需要15分钟可以做完的导入动作,变成10个小时才能导完,很累人。
  • 打赏
  • 举报
回复
不要滥用什么线程。 如果你正确地使用索引,那么“千万”跟“万”的差别有多大?不过是 100毫秒跟80毫秒的差别,这种差别几乎感觉不到。 当然如果你的查询没有能够使用上索引,那就不一样了。那就是5分钟跟100毫秒的差别,体验差别巨大。
我叫小菜菜 2014-08-31
  • 打赏
  • 举报
回复
引用 2 楼 zhi_ai_yaya 的回复:
SQL SERVER有一个导入数据功能,选择“平面文件数据源”,选中文本文件直接导入。或者使用代码导入也行,这是建立数据库的过程,效率不需要太高,慢点都行的。 快速查询,最简单的就是给相应字段添加索引。至于是否非空,没有多大关系~~ 在同一张表中,那可能会出现IO瓶颈,解决的办法就是一张表的记录分开存储在多个磁盘,使用多线程并行查询,再合并得到结果集。
抱歉,这里的“使用多线程并行查询”可能会引起歧义。我的原意是:客户依然是使用通用的查询语句,但是数据库接收到查询语句并建立一个查询计划后,进行查询优化:这时候使用并行子查询,多个线程查询存储在不同磁盘中的数据库表,每个子查询都获得一个查询结果,最后合并得到一个查询结果集,返回给客户。查询任务结束。 就是说,数据库查询过程对于客户是透明的,客户并不知道数据库内部使用的是并行多磁盘查询还是普通查询。 我没有搞过高性能数据库,但这是数据库解决IO瓶颈的一个直观的办法,在主流数据库中可能集成了相关模块和工具。

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧