让人想跳楼的难题:sql server 大数据导出

qq_41684321 2018-01-28 02:07:50
sql server 有一个表存了二三十亿的数据表 字段数 9 现在想导出这些大数据到txt里面
最总要的是数据表没有索引,

现在用bcp去导出,但是导出13亿后面的数据,就导不出来了,tempdb文件100多个G
exec xp_cmdshell 'bcp "select top 1400000000 * from 表名 except select top 1300000000 * from 表名" queryout d:\data\7.txt -c -T'

求方法解决!谢
...全文
793 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2018-01-30
  • 打赏
  • 举报
回复
引用 10 楼 qq_41684321 的回复:
[quote=引用 1 楼 yupeigu 的回复:] select top 1400000000 * from 表名 except select top 1300000000 * from 表名,这种用except的写法,由于数据量太大,会用tempdb,所以tempdb文件会有100多G。、 如果只是想要把20亿数据直接导出来,select * from 表 就可以了。。。
老大,那这txt能放下20G的数据不?[/quote] 没问题,20G数据,小case
zhr009 2018-01-30
  • 打赏
  • 举报
回复
系统有自带的导出功能可以试下
还有20楼的方法这样做会快点,但是占空间,可以在原来的表alter一个自增字段,然后
DROP TABLE #test

CREATE TABLE #test (aa VARCHAR(50), bb VARCHAR(50))
SELECT * FROM #test

INSERT INTO #test
SELECT '11', '22'
UNION
SELECT '22', '22'
UNION
SELECT '33', '33'
UNION
SELECT '44', '44'
UNION
SELECT '44', '44'

ALTER TABLE #test ADD id bigint identity (1, 1)
SELECT * FROM #test
zjcxc 2018-01-29
  • 打赏
  • 举报
回复
分页使用 , 按照你原来的写法(需要2012的版本,如果是之前的版本,考虑 ROW_NUMBER(), 如果你的版本 ROW_NUMBER 也不支持,那不建议在数据库中折腾了,写个程序导出吧,用 DATAReader 读取所有数据,在 datareader.read 中判断写入的记录数,写入达到写入的总数换文件) 除了要 DISTINCT,, 还要在 1400000000 数据去排除 1300000000 的记录,而且是基于整条记录(而不是 KEY),开销之大可想而知
select * * from 表名 order by getdate() offset 1300000000 row fetch first 100000000 rows only
zjcxc 2018-01-29
  • 打赏
  • 举报
回复
看到这个写法还真想找人跳楼
zjcxc 2018-01-29
  • 打赏
  • 举报
回复
except 是要去重的,你拿这么大的数据量基于 select * 去做去重?
OwenZeng_DBA 2018-01-29
  • 打赏
  • 举报
回复
引用 楼主 qq_41684321 的回复:
sql server 有一个表存了二三十亿的数据表 字段数 9 现在想导出这些大数据到txt里面 最总要的是数据表没有索引, 现在用bcp去导出,但是导出13亿后面的数据,就导不出来了,tempdb文件100多个G exec xp_cmdshell 'bcp "select top 1400000000 * from 表名 except select top 1300000000 * from 表名" queryout d:\data\7.txt -c -T' 求方法解决!谢
如果13亿一次导出不了,就分多次导出吧。比如先导出10亿。另外你导出txt的目的只是想要让表没有索引吗?
吉普赛的歌 2018-01-29
  • 打赏
  • 举报
回复
--1. 创建新表,增加标识列(表结构除了标识列,其它按原来的表)
CREATE TABLE t_new(
id BIGINT IDENTITY(1,1) PRIMARY KEY,
c1 INT,
c2 INT,
……	
)
--2. 将原表中的所有记录插入到新表
INSERT INTO t_new
(
	c1,
	c2,
	……
)
SELECT c1,c2 
FROM t

--3. 分页导出,每次导出 1000 万条. 
除此之外, 没有别的什么好办法给你了。 如果你一定要搞什么无主键分页(何况你任何索引都没有), 这么大的数据量, 到最后就是死路一条, 根本没法运行……
lich2005 2018-01-29
  • 打赏
  • 举报
回复
最好自己在原表上新加一个自增列,bigint类型,作为序号主键; 然后根据主键按范围来划分,比如 1 ~ 1亿的数据 , 1亿 ~ 2亿的数据 ... ...( 这里的划分没固定标志,但是需要了解 1 ~ 1亿的数据大概占用多少磁盘空间,做到心中有数。); 这样得到 n 张小表以后,再去挨个导出 “小表”; 最后再整理好数据。 一般说来数据量上了千万级别,都应该考虑分开来操作数据了。一次性要操作整表,速度很慢慢慢慢慢,服务器性能不好的很可能直接死机,最好别一次性操作,有些懒不能偷...
zjcxc 2018-01-29
  • 打赏
  • 举报
回复
这种没主键的表,你要分页才是真折腾 sql 2005 应该支持了 ROW_NUMBER 的,类似下面这个你可以测试一下,但这个肯定也是慢的 SELECT * FROM(SELECT _r=ROW_NUMBER()OVER(ORDER BY GETDATE()), * FROM sys.all_objects) A WHERE _r BETWEEN 1 AND 100 而如果你是分开导,再合并,那就更没有必要分了,直接导就行(分开导再合并没看出意义在那)
zjcxc 2018-01-29
  • 打赏
  • 举报
回复
300G导出也没问题嘛 支持了最大文件大小参考这个(网络搜索的) FAT32单个文件最大不能超过4G,超过4G就不能读取了。 NTFS(Windows):支持最大分区2TB,最大文件2TB FAT16(Windows):支持最大分区2GB,最大文件2GB FAT32(Windows):支持最大分区128GB,最大文件4GB HPFS(OS/2):支持最大分区2TB,最大文件2GB EXT2和EXT3(Linux):支持最大分区4TB,最大文件2GB JFS(AIX):支持最大分区4P(block size=4k),最大文件4P XFS(IRIX):这是个正经的64位的文件系统,可以支持9E(2的63次方)的分区
qq_41684321 2018-01-29
  • 打赏
  • 举报
回复
引用 14 楼 wmxcn2000 的回复:
每一亿导导 成一个文件,最后再合并这些文件。
嗯,我现在就是这样操作,但是因为没有主键,索引,所以要条件,后面就倒不出来了!
卖水果的net 2018-01-29
  • 打赏
  • 举报
回复
每一亿导导 成一个文件,最后再合并这些文件。
qq_41684321 2018-01-29
  • 打赏
  • 举报
回复
引用 11 楼 zjcxc 的回复:
txt 当然能放 20G,这个没压力,除非你的操作系统不支持
老大,我这30亿数据,没有主键,我就导出部分删除部分,但是现在我用 DELETE FROM 表 where 不重复字段 in(select top 3 不重复字段 from 表) 效率极低啊!有没有什么办法?我可以快速删除前面指定的多少行数据!
qq_41684321 2018-01-29
  • 打赏
  • 举报
回复
引用 11 楼 zjcxc 的回复:
txt 当然能放 20G,这个没压力,除非你的操作系统不支持
说错了!300G以上。30十来亿数据!
zjcxc 2018-01-29
  • 打赏
  • 举报
回复
txt 当然能放 20G,这个没压力,除非你的操作系统不支持
qq_41684321 2018-01-29
  • 打赏
  • 举报
回复
引用 1 楼 yupeigu 的回复:
select top 1400000000 * from 表名 except select top 1300000000 * from 表名,这种用except的写法,由于数据量太大,会用tempdb,所以tempdb文件会有100多G。、 如果只是想要把20亿数据直接导出来,select * from 表 就可以了。。。
老大,那这txt能放下20G的数据不?
qq_41684321 2018-01-29
  • 打赏
  • 举报
回复
引用 7 楼 zjcxc 的回复:
分页使用 , 按照你原来的写法(需要2012的版本,如果是之前的版本,考虑 ROW_NUMBER(), 如果你的版本 ROW_NUMBER 也不支持,那不建议在数据库中折腾了,写个程序导出吧,用 DATAReader 读取所有数据,在 datareader.read 中判断写入的记录数,写入达到写入的总数换文件) 除了要 DISTINCT,, 还要在 1400000000 数据去排除 1300000000 的记录,而且是基于整条记录(而不是 KEY),开销之大可想而知
select * * from 表名 order by getdate() offset 1300000000 row fetch first 100000000 rows only
老大,我现在的是2005版本的,用你提供的查询 消息 102,级别 15,状态 1,第 1 行 'offset' 附近有语法错误。 消息 153,级别 15,状态 2,第 1 行 在 FETCH 语句中选项 first 的用法无效
qq_41684321 2018-01-29
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
你的这个表有没有主键?
对的,主要是没有主健
吉普赛的歌 2018-01-28
  • 打赏
  • 举报
回复
你的这个表有没有主键?
LongRui888 2018-01-28
  • 打赏
  • 举报
回复
另外,你说的 最终要的是数据表没有索引是什么意思? 是要把这个表的索引删掉吗?
加载更多回复(1)

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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