2015-05-22 4 views
1

Предположим, у меня есть одна таблица, в которой есть 5 столбцов:SQL SERVER Удаление очень большое количество строк оптимизации

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, пожалуйста, скажите мне. Что делать, если я сделаю процедуру магазина, это увеличит мою производительность? Спасибо.

+1

Является ли эта операция одноразовая или функция, которую нужно добавить в приложение, чтобы быть повторяемым и выполняются конечными пользователями вашего программного обеспечения? (В любом случае, я, вероятно, не буду использовать NH, предполагая, что вы увлажняете все эти объекты только для их удаления) – Veatch

+0

Ну, я использую NH для доступа к данным в обычных случаях, я хочу удалить все эти строки только потому, что выполняю большие импорт данных из файлов csv, я делаю это с помощью sqlbulkcopy, поэтому перед импортом данных я хочу удалить все строки, которые будут затронуты, а не обновлять их, так как я думаю, что для обновления столько строк потребуется гораздо больше времени, чем вставлять их, используя sqlbulkcopy. – MDDDC

+0

И да, я ищу решение, которое можно повторить, но если у вас есть одно решение времени, пожалуйста, сообщите мне, какой у вас есть, я думаю, вы не будете предлагать воссоздать таблицу ... – MDDDC

ответ

1

Как насчет так:

decalre @tableIds table (Id int) 

insert into @tableIds 
select 2054 as Id union all 
... 
//here is other ids 
... 
select 2131 as Id 

while exists(select 1 from FundYearDetail t1 join @table t2 on t1.Fund_id = t2.Id) 
begin 
delete top(10000) t1 
from FundYearDetail t1 join @table t2 on t1.Fund_id = t2.Id 
end 
2

Вы могли бы сделать партию удаляет так:

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

В качестве альтернативы вы можете попробовать этот подход, вставив записи, которые хотите сохранить в таблице темпа, а затем усечь свою фактическую таблицу. Затем переместите те записи таблицы temp в вашу фактическую таблицу. Не знаю, сколько выполняют получить вы бы достичь этого, но определенно рекомендовал бы делать 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 
+0

200 000 строк на SQL SERVER EXPRESS были удалены за 43 секунды. не так хорошо, как хотелось бы. – MDDDC

+1

Это не значит, что решение недействительно, проблема с перфомансом может быть связана с расширением вашего файла журнала базы данных, блокированием, откатом и т. Д. – Greg

+0

@Greg, ну, я могу сделать это через 10 секунд, и я не ищу Я очень сожалею, но действительное решение может быть и простым удалением, я ищу лучшее решение. – MDDDC

Смежные вопросы