如何将5亿桌与另外5亿桌合并

时间:2014-06-09 14:24:17

标签: sql sql-server

我必须合并两个500M +行表。

合并它们的最佳方法是什么?

如果有人在我的网页上搜索,我只需要显示这两个SQL-Server表中的记录。

这些是固定表格,没有人会在这些表格生效后更改这些表格。

create a view myview as select * from table1 union select * from table2 

使用上述方法有什么危害吗?

如果我开始合并500M行,它将运行数天,如果机器重新启动,它将使数据库进入恢复模式,然后我必须从头开始。

为什么我要合并这些表?

  • 我有一个网站,提供人员表的搜索。
  • 此表包含名称,地址,年龄等列
  • 我们有5亿个类似的.txt文件,我们加载到其他文件中 表
  • 现在我们希望网站搜索页面查询两个表格以查看是否 表中有一个人。
  • 我们得到了类似的1亿或2千万的.txt文件 到这个巨大的桌子。

我们目前的表现如何?

  • 我们将.txt文件导入到单独的表中(某些列不同 在.txt)
  • 然后我们安排列并进行数据类型转换
  • 然后将此临时表插入到liveCopy巨表(中) 测试环境)

我们有SQL server 2008 R2

  • 我们可以使用表分区来获得性能优势吗?
  • 是否可以创建月度小表并在其上创建视图 它们?
  • 在这种情况下如何进行索引编制?

我们只在一个月内加载一次新数据并执行选择

复制有帮助吗?

我面临的最大问题是管理庞大的表格。

我希望我能解释一下情况。

谢谢&此致

4 个答案:

答案 0 :(得分:2)

1)通常,为了获得更高的性能,开发人员将大表拆分为较小的表并将其称为分区(水平更精确,因为还有垂直表)。您的视图是加入此类分区的示例。当然,它主要用于将大量数据拆分为值范围(例如,table1包含列[col1]< 0的记录,而table2包含[col1]> = 0)。但即使对于未分类的数据也可以,因为您可以获得更多的速度提升空间。例如 - 如果将表放入不同的存储,则并行读取。所以这是一个不错的选择。

2)另一种方法是使用SQL Server 2008及更高版本支持的MERGE语句 - http://msdn.microsoft.com/en-us/library/bb510625(v=sql.100).aspx

3)当然你可以使用INSERT + DELETE进行复制,但在这种情况下或者在使用MERGE命令的情况下,可以小批量进行复制。 Smth喜欢:

SET ROWCOUNT 10000
DECLARE @Count [int] = 1
WHILE @Count > 0 BEGIN
    ... INSERT+DELETE/MERGE transcation...

    SET @Count = @@ROWCOUNT
END

答案 1 :(得分:1)

如果您的目的只是将两个表中的数据移动到一个表中,您将需要批量执行 - 一次100K记录,或类似的事情。我猜你之前因为你的T-Log已经满了而崩溃了,尽管这只是猜测。如果您处于完全恢复模式,请务必在每批之后扔一个检查点。

那就是说,我同意你应该提供的所有意见,为什么你这样做 - 可能根本没有必要。

答案 2 :(得分:1)

您可能需要查看索引视图 通过这种方式,您可以在视图上设置索引并从中获得最佳性能。使用索引视图的昂贵部分是在CRUD操作中 - 但是对于读取性能,它将是您最好的解决方案。

http://www.brentozar.com/archive/2013/11/what-you-can-and-cant-do-with-indexed-views/

https://www.simple-talk.com/sql/learn-sql-server/sql-server-indexed-views-the-basics/

答案 3 :(得分:1)

如果这两个表是一对一链接的,那么每次读取都会浪费很多cpu时间。特别是你提到表格根本没有变化。在这种情况下,您应该只有一个表。 尝试创建一个新表,包括(至少)两个表中的两列。 您可以通过以下方式执行此操作:

  

选择进入newTable

    from A left join B on A.x=B.y

或(如果有些人没有文本文件的信息)

  

选择进入newTable

    from A inner join B on A.x=B.y

请注意,您必须至少在连接字段上建立索引(以加快处理速度)。

有关这些字段的更多详细信息可能有助于提供更准确的答案。

相关问题