【问题标题】:INSERT with Dapper takes too long in SQL Azure在 SQL Azure 中使用 Dapper 插入需要太长时间
【发布时间】:2017-01-18 16:57:07
【问题描述】:

我有一个实体实例,具有一对多关系(项目)。我正在尝试通过 Dapper 将其插入到 SQL Azure 实例中。

项目数约为 3.5k

using (var transaction = connection.BeginTransaction())
{
  // (...) x inserted here, we want to insert the items next...
  connection.Execute(TSQL_InsertStatement, x.Items, transaction);
  transaction.Commit();
}
  • 在本地(与 .\SQLEXPRESS 相比),执行时间约为 300-500[ms]
  • 在 Azure 中,执行大约需要 8[s]

我相信此操作会产生大量单独的 INSERT,这可能是个问题。我尝试将其重构为“手动生成的 sql”解决方案,该解决方案生成了 4x INSERTS(1k、1k、1k、500 行),但是在本地执行此操作超过 2[s]。

  • 有没有办法让 Dapper 运行得更快?可能像批量插入一样?
  • SQL Azure 有什么我不知道的吗?喜欢一些隐藏的节流?

【问题讨论】:

  • 本地与 Internet 可能不同
  • sql 数据库和执行插入的应用程序位于同一天蓝色区域 (dc)
  • 循环运行一些测试插入,看看等待统计数据是什么
  • 在 TVP SQLdataRecord 上搜索

标签: c# azure-sql-database dapper


【解决方案1】:

在同一事务中使用多个插入在 Azure SQL 数据库中通常是个坏主意。

您应该使用批处理来提高插入查询的性能,请参阅https://azure.microsoft.com/en-us/documentation/articles/sql-database-use-batching-to-improve-performance/。 如果可能的话,我会推荐表值参数、批量插入或多个参数化插入。参考文章中描述了这些场景。

Azure Sql 数据库也支持 JSON,因此如果您的原始源是 JSON 对象数组,您可以将整个 JSON 推送为文本并使用 OPENJSON 在 SQL 端解析它(仍然没有证据表明这比其他方法更快)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 2020-06-15
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多