Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
Добрый день.
Как грамотно всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?

Проблема в том, что офис (70 пользователей) часто использует таблицу dbo.PriceList1 с полнотекстовым индексом.
Один раз в день требуется всё удалить из этой таблицы, а потом залить новые данные. Это необходимо сделать не выгоняя пользователей из БД.

Сейчас я запускаю процедуру :

delete top (20000) from dbo.PriceList1
delete top (20000) from dbo.PriceList1
delete top (20000) from dbo.PriceList1
...
и т.д.

Не быстро, но удаление доходит до финала 5 минут (примерно).

delete from dbo.PriceList1 - до финала вообще не доходит


А как грамотно сделать DELETE и потом INSERT в таблице с полнотекстовым индексом?
31 янв 14, 12:02    [15499432]     Ответить | Цитировать Сообщить модератору
 Re: Как всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
если у вас нет зависимостей этой таблицы с другими, можно сделать например так:

сделать всё в новой таблице pricelist2 и затем старую удалить, новую переименовать.

Но полнотекстовй каталог лучше бы строить после заливки в любом случае.
31 янв 14, 12:12    [15499533]     Ответить | Цитировать Сообщить модератору
 Re: Как всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
ну и кардинально, тоже если нет побочных эффектов:

truncate
31 янв 14, 12:13    [15499542]     Ответить | Цитировать Сообщить модератору
 Re: Как всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?  [new]
dvim
Member

Откуда: Санкт Петербург
Сообщений: 711
LightN,

А как грамотно сделать DELETE и потом INSERT в таблице с полнотекстовым индексом?

1 TRUNCATE
2 Отключаем индексы
3 Вставка
4 Включаем индексы

Если данных много и есть смысл оптимизировать - используем табличные типы.
Те передаем серверу не по одной строке, а сразу таблицу .
31 янв 14, 12:21    [15499615]     Ответить | Цитировать Сообщить модератору
 Re: Как всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
Winnipuh,
Спасибо за ответ. Это понятно. Пробовал так.
Только на этой таблице сидят 10-Views и в момент подмены у всех клиентов вылетает ODBC-Error ...
Вопрос и был в том, как это сделать быстрее на ходу (т.е. увеличить скорость del и ins)?
31 янв 14, 12:26    [15499655]     Ответить | Цитировать Сообщить модератору
 Re: Как всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?  [new]
dvim
Member

Откуда: Санкт Петербург
Сообщений: 711
LightN,

- отключать индексы.
- вставлять табличным типом
31 янв 14, 12:29    [15499688]     Ответить | Цитировать Сообщить модератору
 Re: Как всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
LightN
Winnipuh,
Спасибо за ответ. Это понятно. Пробовал так.
Только на этой таблице сидят 10-Views и в момент подмены у всех клиентов вылетает ODBC-Error ...
Вопрос и был в том, как это сделать быстрее на ходу (т.е. увеличить скорость del и ins)?


можно было бы не удалять по-живому, а добавить поле deleted, сделать апдейт ему в 1, и во всех вью проверять флаг.
И уже ночью без юзеров чистить таблицу.
31 янв 14, 12:33    [15499722]     Ответить | Цитировать Сообщить модератору
 Re: Как всё удалить, а потом вставить 300 000 записей в таблицу с полнотекстовым индексом?  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
Winnipuh,dvim спасибо за ответы.

Выбрал так:
1. Создам bit поле с Именем [Isdeleted].
2. Сделаю все Views чтобы видели только [Isdeleted]=0
3. Update dbo.PriceList1 set [Isdeleted]=1
4. Отключаю индексы.
5. Insert табличным типом из dbo.PriceList2 (он без индексов и c [Isdeleted]=Null)

[Isdeleted]=Null - чтобы Views не трогали данные и соотв. пользователи не мешали.

6. Включаю индексы.
7. Update dbo.PriceList1 set Isdeleted=1 where Isdeleted is Null
--

На ночь делая job -> delete from dbo.PriceList1 where Isdeleted=1
31 янв 14, 13:31    [15500188]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить