我必须合并两个500M +行表。
合并它们的最佳方法是什么?
如果有人在我的网页上搜索,我只需要显示这两个SQL-Server表中的记录。
这些是固定表格,没有人会在这些表格生效后更改这些表格。
create a view myview as select * from table1 union select * from table2
使用上述方法有什么危害吗?
如果我开始合并500M行,它将运行数天,如果机器重新启动,它将使数据库进入恢复模式,然后我必须从头开始。
为什么我要合并这些表?
我们目前的表现如何?
我们有SQL server 2008 R2
我们只在一个月内加载一次新数据并执行选择
复制有帮助吗?
我面临的最大问题是管理庞大的表格。
我希望我能解释一下情况。
谢谢&此致
答案 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
请注意,您必须至少在连接字段上建立索引(以加快处理速度)。
有关这些字段的更多详细信息可能有助于提供更准确的答案。