c# - SQL SERVER 删除大量行优化

标签 c# sql sql-server stored-procedures nhibernate

假设我有一个包含 5 列的表:

Id int primary key

Date datetime 

Value double

Fund_id reference

FundModel_id reference

FundDataField_id reference

这个表有 37 000 000 行。

每个基金大约有 4000 行。从这个表中删除行的最佳和快速方法是什么。 我需要一次删除大约 7000000 行,但这需要大约 10 分钟,对我来说这已经很多了。

目前我按 Fund_Id 删除行,如下所示:

Delete from FundYearDetail where Fund_id In (2054,2056,2058,2059,2061,2063,2064,2065,2066,2067,2069,2072,2073,2076,2078,2079,2080,2081,2082,
2086,2088,2090,2093,2095,2096,2097,2099,2101,2102,2103,2104,2105,2106,2107,2109,2110,2114,2115,2116,2117,2118,2119,2342,2125,2126,2127,2128,2129,2130,2131)

这条语句将影响大约 200 000 行并且需要很长时间才能完成,将这条语句分成 2 个查询我得到更好的性能,每个大约 4 秒。

有人知道更好的解决方案吗?

注意:我正在使用 Fluent NHibernate 进行数据访问,如果有人知道使用 Nhibernate 的更好解决方案,请告诉我。 如果我将执行存储过程怎么办,这会提高我的性能吗? 谢谢。

最佳答案

您可以像这样进行批量删除:

SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
    DELETE TOP (50000) dbo.timesheet  --change top value as needed
    WHERE Fund_id IN (2054,2056,2058,2059,2061,2063,2064,2065,2066,2067,2069,2072,2073,2076,
                      2078,2079,2080,2081,2082,2086,2088,2090,2093,2095,2096,2097,2099,2101,
                      2102,2103,2104,2105,2106,2107,2109,2110,2114,2115,2116,2117,2118,2119,
                      2342,2125,2126,2127,2128,2129,2130,2131           
            )

由@gbn 提供:Bulk Delete on SQL Server 2008

UPDATE

或者,您可以通过将要保留在临时表中的记录插入然后截断实际表来尝试这种方法。然后,将这些临时表记录传回您的实际表中。不确定你会从中获得多少性能增益,但肯定会建议在执行此操作之前执行 BACKUP:

SELECT col1, col2, col3, col4, col5 INTO #Holdingtable
       FROM FundYearDetail WHERE Fund_id NOT IN (2054,2056,2058,2059,2061,2063,2064,2065,
                    2066,2067,2069,2072,2073,2076,2078,2079,2080,2081,2082,2086,2088,2090,
                    2093,2095,2096,2097,2099,2101,2102,2103,2104,2105,2106,2107,2109,2110,
                    2114,2115,2116,2117,2118,2119,2342,2125,2126,2127,2128,2129,2130,2131           
            )
TRUNCATE TABLE FundYearDetail

INSERT FundYearDetail (
    col1
    ,col2
    ,col3
    ,col4
    ,col5
    )
SELECT 
     col1
    ,col2
    ,col3
    ,col4
    ,col5
FROM #Holdingtable

关于c# - SQL SERVER 删除大量行优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30401723/

相关文章:

SQL Server 在主表中加入两个没有重复的表

sql - SQL Server中根据条件进行计数

c# - NHibernate 在具有复合键的遗留数据库中一对一

c# - 无法使用身份验证 = Active Directory 托管标识从 dotnet Web 应用程序连接到 Azure SQL MI

php - MySQL Select Hex() 输出不起作用

mysql - 用于锁定操作或避免并发数据操作的防御策略

sql-server - sql server 将 PK 类型从 int 更改为 uniqueidentifier

sql-server - 如果同一个 ID 有多个 NUMBER,我想显示一个 ID 的记录

c# - 我可以切换到 64 位吗

c# - 按钮单击 MVC 后的部分加载