【问题标题】:What to do if the speed of data availability is faster than insert?如果数据可用的速度比insert快怎么办?
【发布时间】:2015-11-23 21:08:45
【问题描述】:

我正在向表中插入大量数据。

例如每 15 分钟一次,有 N 条数据记录可供插入到表中。

我的问题是,如果插入 N 条记录的时间超过 15 分钟,我该怎么办?也就是说,下一个插入无法开始,因为前一个仍在进行中。

请假设我使用了最实惠的硬件,甚至在开始插入数据之前删除索引也不会使插入速度超过 15 分钟。

我的偏好是不删除索引,因为同时查询表。在这种情况下,最佳做法是什么?

P.S.我没有任何实际代码。我只是在思考和质疑一个可能的场景。

【问题讨论】:

  • 您使用什么工具/语言插入数据?
  • 缺少很多信息 - 你如何执行插入?如果它是逐行的,你可以做一些优化。每笔交易的交易量(#records/storage)是多少?
  • 如果我们不得不假设你已经做了所有可能的事情,那么我们真的帮不了你。
  • @Meysam - 在我看到你的代码之前我不能假设..

标签: sql sql-server performance optimization bulkinsert


【解决方案1】:

如果您每季度接收/加载大量数据,则您有 操作 要求,而不是 应用程序 要求,因此请使用 操作 解决方案。

所有数据库都有一个“批量插入”实用程序,sql server也不例外,甚至调用函数BULK INSERT

BULK INSERT mytable FROM 'my_data_file.dat'

此类实用程序专为原始速度而构建,将超越任何替代应用程序解决方案。

编写一个 shell 脚本将数据接收到一个文件中,使用 shell 实用程序根据需要对其进行格式化,然后调用BULK INSERT

将进程连接到 crontab(或等效的 Windows 调度程序,如 AT,如果您在 Windows 上运行)。

【讨论】:

    【解决方案2】:

    首先要寻找插入的基本优化。
    你可以找到很多关于它的帖子:
    What is the fastest way to insert large number of rows
    Insert 2 million rows into SQL Server quickly

    第二件事是看看为什么需要超过 15 分钟?很多事情都可以解释 - 锁、隔离级别等。所以尝试挑战它(例如,某些查询可以读取未提交的记录?)。

    第三件事 - 找到正确的插入配额,并考虑拆分为几个较小的数据块,并进行中间提交。一个事务中的许多插入而不提交可能会对服务器产生不良影响(日志文件/锁定明智 - 您需要能够回滚整个事务)。

    【讨论】:

    • 如果“耗时超过 15 分钟”究竟是因为数据量大怎么办?
    • @Meysam - 每 x 条记录 15 分钟是传入速率,传出速率取决于您能够以多快的速度执行每条记录的插入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多