Майк, вирусный сканер отключил улучшенные вещи - но что-то все еще звучит из-за удара ... Согласитесь с @Remou, что объемная вставка будет намного лучше выполнять, если вы сможете это сделать.
Предполагая, что вы не можете вставлять вставки, просто сделал пример приложения (C#, извините - но VB.NET будет похож), чтобы создать каталог, таблицу и выполнить некоторые вставки. На данный момент я пропустил ограничение PK на ID.
Это давало мне около 1000 строк в 550 мс, работающих на виртуальной машине с антивирусным сканером на ноутбуке, работающем под управлением. Вы сможете легко справиться с этим быстрым приводом. Где различия?
Одна мысль - как вы вставляете ID? Автогенерировано и опущено из инструкции INSERT? Или вы вставили значение, а столбец обозначен PK? Последнее, несомненно, вызовет поиск индекса (ваш значительный IO?), Чтобы проверить уникальность данных по таблице?
using System;
using System.Data;
using System.Data.OleDb;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
String jetConnection = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\jetsample.mdb;";
ADOX.CatalogClass cat = new ADOX.CatalogClass();
cat.Create(jetConnection);
using(OleDbConnection conn = new OleDbConnection(jetConnection))
{
conn.Open();
using(OleDbCommand cmd = new OleDbCommand("CREATE TABLE test ([ID] INTEGER, [TestDouble] DOUBLE, [TestText] TEXT, [TestDate] DATE, [TestInt] INTEGER)",conn))
{
cmd.CommandType = CommandType.Text;
cmd.ExecuteNonQuery();
}
using (OleDbCommand cmd = new OleDbCommand("INSERT INTO [Test] VALUES (@id, @testDouble, @testText, @testDate, @testInt)", conn))
{
OleDbParameter id = cmd.Parameters.Add("@id", OleDbType.Integer);
OleDbParameter testDouble = cmd.Parameters.Add("@testDouble", OleDbType.Double);
OleDbParameter testText = cmd.Parameters.Add("@testText", OleDbType.VarWChar);
OleDbParameter testDate = cmd.Parameters.Add("@testDate", OleDbType.Date);
OleDbParameter testInt = cmd.Parameters.Add("@testInt", OleDbType.Integer);
DateTime start = DateTime.Now;
for (int index = 1; index <= 2000000; index++)
{
if (index % 1000 == 0)
{
System.Diagnostics.Debug.WriteLine(((TimeSpan)(DateTime.Now - start)).Milliseconds);
start = DateTime.Now;
}
id.Value = index;
testDouble.Value = index;
testText.Value = String.Format("{0} DBL", index);
testDate.Value = DateTime.Now.AddMilliseconds(index);
testInt.Value = index;
cmd.ExecuteNonQuery();
}
}
}
}
}
}
Нужно написать одну запись время, то есть, является добавлением запроса какого-либо описания неприемлемым? Вы каждый раз сжимаете базу данных до добавления? У этой ссылки могут быть некоторые подсказки: http://www.granite.ab.ca/access/performancefaq.htm – Fionnuala 2008-11-29 17:00:17