Вставка нескольких записей с моего веб-сайта не удалась
Я запрашиваю веб-сайт для данных за 5 лет из 150 точек данных, что составляет около 40000 записей каждая (всего 6 миллионов записей), и вставляю результат в мою базу данных. Это часть веб-приложения. Я использую VS 2010 и SQL Server 2008 Express. У меня есть два вопроса, не связанных друг с другом относительно этого:
1) Когда я использую отладчик VS 2010, запускаю приложение и пытаюсь выполнить эту задачу с помощью ADO.NET, для 40000 записей требуется примерно 15 минут. Есть ли способ ускорить это? Я использую обычный процесс вставки следующим образом.
SqlConnection myConnection = new SqlConnection("user id=sa; password=++++++; server=.\\SQLEXPRESS;database=+++++++++;");
myConnection.Open();
{
string CommandText = "Insert into myTable(TimeOfDay,Price,InstrumentID)"+" "
+"values('"+tod+"',"+price+","+insID+")";
SqlCommand myCommand = new SqlCommand(CommandText,myConnection);
myCommand.ExecuteNonQuery();
}
2) Мой второй вопрос: когда я запускаю приложение, используя IIS вместо подключенного отладчика VS 2010, процесс вставки останавливается после просто вставки 100 записей? Это ограничение связано с настройкой в IIS 6.0? Или в SQL сервере?
Пожалуйста, помогите.
1 ответ
Вы должны использовать параметризованный запрос. Это не только для более безопасных операций, но и для лучшей производительности, потому что Sql Optimizer может повторно использовать тот же запрос, когда вы используете параметры
Вы можете попробовать этот код (просто нужно немного протестировать, потому что я написал здесь на лету)
// A parameterized command text
string CommandText = "Insert into myTable(TimeOfDay,Price,InstrumentID) values(@tod, @price, @id)";
using(SqlConnection myConnection = new SqlConnection(......))
{
myConnection.Open();
using(SqlCommand myCommand = new SqlCommand(CommandText,myConnection))
{
// Build the parameters before entering the loop. They are always the same
// just the value changes, but setting the size, precision and scale allows
// the SQL Optimizer to reuse this command
Parameter tod = myCommand.Parameters.Add("@tod", SqlDbType.NVarChar);
tod.Size = 50; // TimeOfDay is a string? Set its size...
// Price is a numeric with Precision and Scale? Set this properties
Parameter price = myCommand.Parameters.Add("@price", SqlDbType.Decimal);
price.Precision = 10;
price.Scale = 2;
Parameter id = myCommand.Parameters.Add("@price", SqlDbType.Int);
for( ........ loop statement on your data .....)
{
... extract the parameters values ...
myCommand.Parameters["@tod"] = tod;
myCommand.Parameters["@price"] = price;
myCommand.Parameters["@id"] = insID;
myCommand.ExecuteNonQuery();
}
}
}
Очень полезное чтение, как код доступа к данным влияет на производительность базы данных