假设我有一个包含 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/