Insert/Update海量记录SQL服务器
Insert/Update mass records SQL Server
我有很多记录需要处理的问题。我想知道哪种方法最快。
我的问题描述:
我有一个 table(我们称之为 FooTable
),超过 2.000.000.000 records
个 ID(我们称之为 FooId
)。我需要对 FooId
求和以检查它重复了多少次。这个 table 每秒都在增长,因为它就像一个日志 table.
我试过的程序:
读取我的 FooTable
的 600 records
块,处理所有记录(对每个 FooId
求和)通过代码执行 GroupBy
并存储结果在另一个 table 中(我们称之为 FooResults
)。此 FooResults
新 table 是在与旧 FooTable
.
相同的架构中创建的
程序结果:
每个块的读取和数据处理都非常快。问题是储蓄。我的计算表明这大约需要 27 天。这明显过分了。
测试:
我用 100.000 records
做了一个测试。处理完此数据后结果为6000 records
,读取大约耗时32秒;处理耗时 32 毫秒;并且节省了 18 分钟。
未来尝试:
我正在考虑尝试在另一个模式中创建一个table,对所有记录进行唯一的读取操作,直到最后一个,处理内存中的所有数据并将其添加到这个新的table。这个新的 table 将禁用索引。
尝试 sql 而不使用 Entity Framework.
尝试使用批处理。
使用的技术:
- C#
- Entity Framework
- Sql 服务器 2012
编辑 1:
此table中包含的数据是将用于分析的关键数据,无法删除。
您应该运行将此作为数据库中的查询。如果你想检查一个这样的值:
select count(*)
from table t
where fooid = @foodid;
在 table(fooid)
上创建索引,这将 运行 相当快,即使在 20 亿行上也是如此。
如果您需要查找所有 foo id 的计数:
select fooid, count(*)
from table t (with nolock)
group by fooid;
这个时间会长一些,但不会是27天,也可以利用索引。通常,您希望在数据库内部进行此类处理,而不是将数据带回应用程序。
您可能需要考虑是否要 运行 在用于插入的实时 table 上进行这些查询。 selects
和 inserts
可以减慢速度。您可能会考虑某种复制管理,以便您可以拥有另一个数据库副本来进行此类分析。最好不要 运行 对每秒更新多次的 table 进行此类查询。
我有很多记录需要处理的问题。我想知道哪种方法最快。
我的问题描述:
我有一个 table(我们称之为 FooTable
),超过 2.000.000.000 records
个 ID(我们称之为 FooId
)。我需要对 FooId
求和以检查它重复了多少次。这个 table 每秒都在增长,因为它就像一个日志 table.
我试过的程序:
读取我的 FooTable
的 600 records
块,处理所有记录(对每个 FooId
求和)通过代码执行 GroupBy
并存储结果在另一个 table 中(我们称之为 FooResults
)。此 FooResults
新 table 是在与旧 FooTable
.
程序结果:
每个块的读取和数据处理都非常快。问题是储蓄。我的计算表明这大约需要 27 天。这明显过分了。
测试:
我用 100.000 records
做了一个测试。处理完此数据后结果为6000 records
,读取大约耗时32秒;处理耗时 32 毫秒;并且节省了 18 分钟。
未来尝试:
我正在考虑尝试在另一个模式中创建一个table,对所有记录进行唯一的读取操作,直到最后一个,处理内存中的所有数据并将其添加到这个新的table。这个新的 table 将禁用索引。
尝试 sql 而不使用 Entity Framework.
尝试使用批处理。
使用的技术:
- C#
- Entity Framework
- Sql 服务器 2012
编辑 1:
此table中包含的数据是将用于分析的关键数据,无法删除。
您应该运行将此作为数据库中的查询。如果你想检查一个这样的值:
select count(*)
from table t
where fooid = @foodid;
在 table(fooid)
上创建索引,这将 运行 相当快,即使在 20 亿行上也是如此。
如果您需要查找所有 foo id 的计数:
select fooid, count(*)
from table t (with nolock)
group by fooid;
这个时间会长一些,但不会是27天,也可以利用索引。通常,您希望在数据库内部进行此类处理,而不是将数据带回应用程序。
您可能需要考虑是否要 运行 在用于插入的实时 table 上进行这些查询。 selects
和 inserts
可以减慢速度。您可能会考虑某种复制管理,以便您可以拥有另一个数据库副本来进行此类分析。最好不要 运行 对每秒更新多次的 table 进行此类查询。