从SQL获取1000万条记录的有效方法

时间:2014-09-16 10:58:44

标签: sql sql-server

我在SQL Server中有一个表,我需要将其数据导出到.CSV文件中。

以下是表格详情:

ProductId: PK, bigint
SupId: varchar(100)
CatalogId: FK, bigint
Price: float

没有索引。

CSV部分已完成,这意味着我已经尝试了几个可以将结果集写入CSV的库。

我被困的地方是SELECT *需要很长时间才能执行。

直到现在我还没有成功运行

SELECT * FROM 

现在,我知道运行SELECT *是一个非常糟糕的主意,我已经阅读了不少帖子。

有没有办法流式传输或获取部分数据?这是C#的人,所以请原谅这个行话。

那么,我应该阅读/学习什么?

如何从SQL获取此类数据?

问候。

2 个答案:

答案 0 :(得分:2)

Microsoft SQL Server的批量复制(bcp)命令使您能够直接从命令行插入大量记录

 bcp mydb.dbo.mytable out "C:\mytable.csv" -c -T

更多:http://msdn.microsoft.com/en-us/library/ms162802.aspx

修改

你也可以在sql执行上使用bcp

bcp "SELECT * FROM mydb.dbo.mytable t1 join mydb.dbo.anothertbl t2 on (t1.id=t2.mytable_id)" QUERYOUT C:\mytable.csv  -c -T

答案 1 :(得分:0)

这在很大程度上取决于

  • (a)你的桌子是什么样的,
  • (b)你有什么样的索引,
  • (c)您的查询是什么样的,
  • (d)您的硬件(服务器)支持的内容......

    这个问题太宽泛了,不能回答。

此表有多少行和哪种列?你真的需要你的表中的所有列(SELECT *)和所有行(no WHERE clause)吗?如果你真的需要那张桌子上的所有东西 - 那真的没有"魔法"加快聚集索引扫描的方法

但请尝试使用LOCKS。 当用户访问数据时,数据会被锁定,以便其他用户无法修改或删除某人正在阅读的数据。

select * from sys_letter_intid WITH (NOLOCK)

SQL Server - when should you use “with (nolock)”

还有一些因素会影响到这一点。快速列出要查看的内容:

  • 服务器的速度。 CPU,内存,网络连接都可以 是因素
  • 如果你正在做一个有条件的SELECT陈述(即使用a WHERE}或JOINS的{​​{1}},拥有索引会改善您的身份 性能,尤其是在具有数百万行的表上。哈希表 将在一张大桌子上做一个巨大的净积极。
  • 编写干净的查询。例如,如果您有大量项目 您需要从查询中排除,而不是执行LEFT JOIN 使用NOT IN条件。

这真的只是冰山一角,但一些最容易实施的东西也将为你提供一些最大的性能提升。