использование сервера SQL для хранения данных - PullRequest
1 голос
/ 19 февраля 2011

Я сейчас использую SQL Server 2008 в своем проекте для хранения и извлечения данных. до сих пор это происходит идеально. Я могу получить 20000 записей менее чем за 50 мс (JSON). но столкнулся с проблемой со вставками. В моем проекте мне нужно иметь возможность вставлять около 100000 записей каждую минуту. и это, кажется, очень медленно с сервером SQL.
Я попытался использовать другую базу данных (NOSQL DB), такую ​​как mongoDB, которая очень быстро хранит данные (5 с) по сравнению с SQLServer (270 с), но не так быстро, как sql при получении данных (20000 => 180 мс).
Поэтому я спрашиваю здесь, есть ли способ сделать SQL быстрее при хранении. или сделать mongoDB быстрее при извлечении (я не специалист по mongoDB, я знаю об этом самые базовые вещи).

public static void ExecuteNonQuery(string sql)
{
    SqlConnection con = GetConnection();
    con.Open();
    SqlCommand cmd = new SqlCommand(sql, con);
    try
    {
        cmd.ExecuteNonQuery();
    }
    finally
    {
        con.Close();
    }
}

Функция вставки SQL

public IEnumerable<T> GetRecords<T>(System.Linq.Expressions.Expression<Func<T, bool>> expression, int from, int to) where T : class, new()
{
    return _db.GetCollection<T>(collectionName).Find<T>(expression).Skip(from).Limit(to).Documents;
}

Функция выбора Монго (MongoDB 1.6)

Обновление : структура данных: (int) Id, (string) Data

Ответы [ 4 ]

4 голосов
/ 19 февраля 2011

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

Чтобы ускорить процесс, попробуйте выполнить много операций вставки (попробуйте с тысячей или около того) за один ExecuteNonQuery() вызов. Также не открывайте и не закрывайте, но оставляйте соединение открытым (таким образом, находясь в одной транзакции) для нескольких вставок.

3 голосов
/ 19 февраля 2011

Вы должны взглянуть на класс SqlBulkCopy http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx

0 голосов
/ 19 февраля 2011

Как правило, скорость вставки данных в базу данных зависит от сложности операции.

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

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

Я вижу, вы устанавливаете и закрываете соединение каждый раз ... это само по себе занимает много времени. Попробуйте использовать постоянное соединение.

0 голосов
/ 19 февраля 2011

MongoDB очень быстро читает и пишет.50k операций чтения и записи в секунду выполнимо на обычном оборудовании - в зависимости от размера данных.В дополнение к этому у вас всегда есть возможность масштабирования с наборами шардинга и реплики, но, как сказано: 20 000 операций в секунду с MongoDB равны ничто .

...