Какой самый эффективный способ вставить тысячи записей после события клика? - PullRequest
2 голосов
/ 10 января 2010

Хай, ребята,

Я разработал веб-приложение, используя asp.net и sql server 2005 для системы управления посещаемостью. Как вы знаете, действия по посещаемости будут выполняться ежедневно. Вставка записи по одной - плохая идея, я знаю, что мой вопросы

  • Является ли Sqlbulkcopy единственной возможностью для меня при использовании сервера sql, поскольку я хочу вставить 100 записей в событие щелчка (т. Е.), Добавив посещаемость для класса, который содержит 100 студентов? Я хочу добавить посещаемость занятий по одному?

Ответы [ 3 ]

7 голосов
/ 10 января 2010

Если у вас нет особенно огромного количества записей посещаемости, которые вы добавляете каждый день, лучший способ сделать это с помощью insert заявлений (я не знаю, почему именно у вас есть вам в голову, что это плохая идея, наши базы данных часто обрабатывают десятки миллионов строк, добавляемых в течение дня).

Если ваши показатели посещаемости превышают эти показатели, вы выигрываете и получаете столько людей, которые посещают любые функции или курсы, которые вы используете: -)

Массовое копирование и импорт, как правило, предназначены для передачи значительных объемов данных, и я имею в виду такие же размеры, как и все содержимое базы данных, на сайт аварийного восстановления (и другие подобные вещи). Я никогда не видел, чтобы он использовался в дикой природе как способ передачи небольших данных в базу данных.


Обновление 1:

Я предполагаю, основываясь на комментариях, что вы на самом деле вводите записи посещаемости по одному в свое веб-приложение, а 1500 - это слишком долго.

Если это так, то это не замедляет работу базы данных или веб-приложения. Это как быстро вы можете печатать.

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

Это, конечно, при условии, что вводимые вами данные могут быть доступны в электронном виде. Если все, что вы получаете, это листки бумаги с подробностями посещаемости, то вам, вероятно, не повезло (несмотря на решения для оптического распознавания символов), хотя, если бы вы могли заставить несколько людей делать это одновременно, у вас может быть некоторый шанс сделать это своевременно манера. Наем 1500 человек делает один, каждый должен опрокинуть это приблизительно через пять минут: -)

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


Обновление 2:

На основании вашей последней информации, что обработка данных после запуска из веб-приложения занимает много времени, я не уверен, сколько данных у вас есть, но 100 записей в принципе не должны занимать время совсем.

Я не могу сказать, где узкое место, но вы должны это расследовать.

Я знаю, что в прошлом у нас были длительные операции из веб-интерфейса, где мы не хотели задерживать пользователя. Для этого существует множество решений, два из которых мы реализовали:

  • переводит операцию в автономный режим (т. Е. Запускает ее в фоновом режиме на сервере), предоставляя пользователю идентификатор для проверки состояния с другой страницы.
  • то же самое, но уведомить пользователя по электронной почте, как только он закончится.

Это позволило им продолжать работу в асинхронном режиме.

1 голос
/ 10 января 2010

Ах, с вашим обновлением я считаю, что проблема в том, что вам нужно добавить кучу записей после некоторого щелчка, но это занимает слишком много времени.

Я предлагаю одну вещь, которая не поможет вам сразу:

  • Немного переосмыслите ваш дизайн, так как это не выглядит особенно замечательно (с точки зрения БД). Но это всего лишь общее предположение, я могу ошибаться

Более полезное предложение:

  • Делать это в автономном режиме (через службу Windows или подобное)

Если это занимает слишком много времени, вы хотите сделать это асинхронно, а затем позже сообщить пользователю, что операция завершена. Возможно, им даже не нужно быть рядом, вы просто не позволяете им выполнять те функции, которые необходимы для данных, до того, как они будут завершены. Надеюсь, что идея имеет смысл.

0 голосов
/ 10 января 2010

Самый быстрый способ - использовать ExecuteNonQuery.

internal static void FastInsertMany(DbConnection cnn)
{
    using (DbTransaction dbTrans = cnn.BeginTransaction())
    {
        using (DbCommand cmd = cnn.CreateCommand())
        {
            cmd.CommandText = "INSERT INTO TestCase(MyValue) VALUES(?)";
            DbParameter Field1 = cmd.CreateParameter();
            cmd.Parameters.Add(Field1);
            for (int n = 0; n < 100000; n++)
            {
                Field1.Value = n + 100000;
                cmd.ExecuteNonQuery();
            }
        }
        dbTrans.Commit();
    }
}

Даже на медленном компьютере это займет гораздо меньше секунды для 1500 вставок.

[ссылка]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...