gpt4 book ai didi

sql-server - 使用 Dapper 删除超过 2100 行(按 ID)的正确方法

转载 作者:行者123 更新时间:2023-12-02 10:00:08 27 4
gpt4 key购买 nike

我正在尝试使用Dapper支持我的服务器应用程序的数据访问。

我的服务器应用程序有另一个应用程序,它以每分钟 400 条的速度将记录放入我的数据库中。

我的应用程序将它们批量拉出,处理它们,然后从数据库中删除它们。

由于在我处理时数据不断流入数据库,所以我没有一个好的方法来表示 delete from myTable where allProcessed = true .

但是,我确实知道要删除的行的 PK 值。所以我想做一个delete from myTable where Id in @listToDelete

问题是,如果我的服务器停机甚至 6 分钟,那么我就有超过 2100 行需要删除。

由于 Dapper 获取我的 @listToDelete 并将每个参数转换为参数,因此我对删除的调用失败。 (导致我的数据清除更加落后。)

在 Dapper 中处理这个问题的最佳方法是什么?

注意:我已经查看了表值参数,但从我所看到的来看,它们不太performant 。我的架构的这一部分是我系统的瓶颈,我需要非常非常快。

最佳答案

一种选择是在服务器上创建临时表,然后使用批量加载工具将所有 ID 一次性上传到该表中。然后使用联接、EXISTS 或 IN 子句仅删除您上传到临时表中的记录。

批量加载是 SQL Server 中经过良好优化的路径,并且速度应该非常快。

例如:

  1. 执行语句CREATE TABLE #RowsToDelete(ID INT PRIMARY KEY)
  2. 使用批量加载将键插入到 #RowsToDelete
  3. 执行DELETE FROM myTable where Id IN (SELECT ID FROM #RowsToDelete)
  4. 执行DROP TABLE #RowsToDelte(如果关闭 session ,该表也会自动删除)

(假设 Dapper)代码示例:

conn.Open();

var columnName = "ID";

conn.Execute(string.Format("CREATE TABLE #{0}s({0} INT PRIMARY KEY)", columnName));

using (var bulkCopy = new SqlBulkCopy(conn))
{
bulkCopy.BatchSize = ids.Count;
bulkCopy.DestinationTableName = string.Format("#{0}s", columnName);

var table = new DataTable();
table.Columns.Add(columnName, typeof (int));
bulkCopy.ColumnMappings.Add(columnName, columnName);

foreach (var id in ids)
{
table.Rows.Add(id);
}

bulkCopy.WriteToServer(table);
}

//or do other things with your table instead of deleting here
conn.Execute(string.Format(@"DELETE FROM myTable where Id IN
(SELECT {0} FROM #{0}s", columnName));

conn.Execute(string.Format("DROP TABLE #{0}s", columnName));

关于sql-server - 使用 Dapper 删除超过 2100 行(按 ID)的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9946287/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com