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

Откуда:
Сообщений: 30
Всем привет.

Народ, подскажите как правильно делать импорт.

.NET, C#, SqlServer 2005, веб сайт.

1. Импорт из csv файла.
2. Перед непосредственной вставкой делаются различные проверки корректности данных.
3. Также до вставки нужно сделать проверку на базе (в моем случае - на дубликаты).
4. Таблица, в которую заливаются данные, часто используется в онлайне. То есть блокировать ее нельзя надолго.
5. Максимальный размер импортируемого файла примерно 10 тысяч строк по 25 полей в каждой. Суммарно такой файл весит около 3 MB.
6. Таблица, куда вливаются данные широко используется для поиска. По разным полям. Уже сейчас на ней висит порядка 10 индексов. И думаю это не предел.

В общем сейчас я заливаю файлик через аплоад, проверяю данные (эта проверка проходит моментально). Потому сериализую в xml и передаю в хранимую процедуру, где уже и делаю проверку на дубликаты и собственно вставку. Работает сносно, но чувствую с ростов кол-ва данных будет засада. И индексов этих немерено.

В общем хотел бы спросить, может есть какой-нибудь более грамотный подход. Принимаются на рассмотрение любые идеи. Может у меня архитектурно не все верно?

И еще. В секционировании есть какая то команда SWITCH. Реально ли ее использовать для импорта? Вначала вливать в отдельную таблицу, а потом добавлять секцию?

Всем спасибо заранее.
14 сен 09, 18:27    [7657415]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
aleks2
Guest
Зачем же рвать зубы через жопу? Ну модно нынче XML, ну и чо в каждую дырку затычка?

1. Грузим csv файло в отдельную таблицу, причем поля грузим ТЕКСТОМ (varchar, nvarchar).
2. Колбасим проверки.
3. Копируем в основную таблицу.
4. Удаляем.
5. Повторяем по нужде...
14 сен 09, 19:22    [7657657]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
x3mka
Member

Откуда:
Сообщений: 30
Рассматривал такой вариант. В связи с ним такие проблемы:

1. Как делать более сложные проверки типа с регулярными выражениями и т.п., на которые у T-SQL пока ума не хватает. А CLR мешать как-то неприкольно.
2. Что делать, если одновременно несколько импортов проводят.
3. Метод не намного будет эффективнее, потому что основные тормоза - это время на вставку в таблицу и индексы.
4. Если принять такой вариант, каким образом вы предлагаете делать вставку в отдельную таблицу, обычными Insert ?

Спасибо.
14 сен 09, 20:16    [7657792]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
aleks2
Guest
1. Не надо на зеркало пенять.
2. Кто вам мешает вставлять идентификатор загрузки вместе с данными CSV? Или пользовать ##TemporalTable.
3. Это глупое утверждение. Ибо проще - уже эффективнее.
4. Ну... если вас так скорость волнует - юзайте BULK INSERT.
15 сен 09, 06:12    [7658493]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
baike2000
Member

Откуда:
Сообщений: 177
Я гружу в темповую BULK INSERT'ом и с темповой извращаюсь как хочу. Проверяю дубликаты и т.д. Как проверил, все лишнее из темповой убрал, делаю просто INSERT в основную и все очень сносно работает... Ничего на долго не блокируется, только на время переноса из темповой в основную, но там никаких проверок нет.
15 сен 09, 09:40    [7658806]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
Glory
Member

Откуда:
Сообщений: 104760
x3mka
Рассматривал такой вариант. В связи с ним такие проблемы:

1. Как делать более сложные проверки типа с регулярными выражениями и т.п., на которые у T-SQL пока ума не хватает. А CLR мешать как-то неприкольно.
2. Что делать, если одновременно несколько импортов проводят.
3. Метод не намного будет эффективнее, потому что основные тормоза - это время на вставку в таблицу и индексы.
4. Если принять такой вариант, каким образом вы предлагаете делать вставку в отдельную таблицу, обычными Insert ?

Спасибо.

Ну так делаете все проверки на клиенте и формируете готовый к загрузке файл. Который и грузите bulk insert-ом
15 сен 09, 10:22    [7659037]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
x3mka
Member

Откуда:
Сообщений: 30
Всем спасибо.

Один маленький вопрос. Нормальная практика использовать BULK INSERT, если сервер базы и веб сервер находятся на разных машинах? Там надо, как я понимаю, шары настраивать и т.п. А тут уже последнее слово будет за админами.
15 сен 09, 14:49    [7661669]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
x3mka
Member

Откуда:
Сообщений: 30
И еще одно. Как правильно поступить, если вливаемые данные ложатся не в одну таблицу? В этом случае BULK INSERT-ом уже поспользоваться вроде бы не получится. Нужны будут обычные Insert-ы. Поэтому я и использовал xml с заметкой, что тут сложность данных уже не сильно влияет.
15 сен 09, 14:58    [7661751]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
Glory
Member

Откуда:
Сообщений: 104760
x3mka
Всем спасибо.

Один маленький вопрос. Нормальная практика использовать BULK INSERT, если сервер базы и веб сервер находятся на разных машинах? Там надо, как я понимаю, шары настраивать и т.п. А тут уже последнее слово будет за админами.

BULK INSERT - это серверная команда. Ничто не мешает вам инициировать такую вставку со стороны клиента через стандартную утилиту bcp.exe или написать свой анологичный клиентский код
15 сен 09, 14:59    [7661764]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
x3mka
Всем спасибо.

Один маленький вопрос. Нормальная практика использовать BULK INSERT, если сервер базы и веб сервер находятся на разных машинах? Там надо, как я понимаю, шары настраивать и т.п. А тут уже последнее слово будет за админами.
BULK INSERT не работает в сетях без доменов. Точнее не работает без разнообразных ухищрений: тынц.

В сетях с доменами надо выдавать права на доступ к шаре либо доменной учетке, под которой стартует служба MSSQL$xxxxxx, или компьютеру если последняя стартует по NETWORK SERVICE (как по-умолчанию).
15 сен 09, 15:13    [7661915]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
Senya_L
Member

Откуда: Москва
Сообщений: 5381
aleks2
1. Грузим csv файло в отдельную таблицу, причем поля грузим ТЕКСТОМ (varchar, nvarchar).
Медленно проходит эта стадия, слишком медленно, если грузить позаписно выполняя запросы типа INSERT INTO... VALUES. Пакетами заливать через INSERT INTO... SELECT ... UNION ALL... - те же яйца, только в профиль. Медленно...

Мне вот советовали OLEDB использовать. Пока не пробовал, все руки не доходят.
15 сен 09, 15:17    [7661952]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
aleks2
Guest
>>BULK INSERT не работает в сетях без доменов
Ну чо уж собственное невежество выдавать за скрижали Моисеевы?

>>Медленно проходит эта стадия, слишком медленно, если грузить позаписно выполняя запросы типа INSERT INTO... VALUES. Пакетами заливать через INSERT INTO... SELECT ... UNION ALL... - те же яйца, только в профиль.

Медленно - это качественное определение. Скока вам нужно в граммах?

Кроме того, вы могете утверждать, что XML быстрее?
15 сен 09, 17:35    [7663244]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
x3mka
Member

Откуда:
Сообщений: 30
Glory
BULK INSERT - это серверная команда. Ничто не мешает вам инициировать такую вставку со стороны клиента через стандартную утилиту bcp.exe или написать свой анологичный клиентский код
Glory, если я правильно понял, вы предлагаете скопировать bcp утилиту на машину веб вервера и там использовать ее?
aleks2
Кроме того, вы могете утверждать, что XML быстрее?
Я могу утверждать, что xml быстрее, чем вставка во временную таблицу обычными Insert. Это я проверил.

Надо еще с bcp поэксперимертировать.
15 сен 09, 18:04    [7663467]     Ответить | Цитировать Сообщить модератору
 Re: Импорт данных с проверками.  [new]
Glory
Member

Откуда:
Сообщений: 104760
x3mka
Glory
BULK INSERT - это серверная команда. Ничто не мешает вам инициировать такую вставку со стороны клиента через стандартную утилиту bcp.exe или написать свой анологичный клиентский код
Glory, если я правильно понял, вы предлагаете скопировать bcp утилиту на машину веб вервера и там использовать ее?

Можно и не копировать, можно и сетевого ресурса запускать
15 сен 09, 18:13    [7663536]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить