Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Быстрое добавление строк в таблицу (только уникальных) / 3 сообщений из 3, страница 1 из 1
09.07.2006, 16:37
    #33840730
VIKT0R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрое добавление строк в таблицу (только уникальных)
Быстрое добавление строк в таблицу

Уникальных строк

Задача.
Есть массив строк, которые нужно добавить в таблицу. Обычно их около 500 длиной около 8 байт каждая.
Причем добавлять нужно не все подряд, а только те, которых еще нет в таблице.
С "просто добавлением" все просто - следующий код добавляет их за 0.233 секунды.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
 public string SendToDB(string command, Hashtable ht)
        {
            System.Diagnostics.Stopwatch MyWatch = new System.Diagnostics.Stopwatch();
            MyWatch.Start();
            using (System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connStr))
            {
                conn.Open();
                System.Data.OleDb.OleDbTransaction trans = conn.BeginTransaction();
                System.Data.OleDb.OleDbCommand comm = new System.Data.OleDb.OleDbCommand(command, conn, trans);
                try
                {
                    comm.Parameters.Add("@trash", OleDbType.Char);//.Value = trash;
                    comm.Parameters[ 0 ].Size =  1 ;
                    comm.Prepare();

                    for (int i =  0 ; i < ht.Count; i++)
                    {
                        comm.Parameters[ 0 ].Value =  ht[i +  1 ].ToString();
                        comm.Parameters[ 0 ].Size = ht[i +  1 ].ToString().Length;
                        comm.ExecuteNonQuery();
                    }

                    trans.Commit();
                }
                catch (OleDbException ex)
                {
                    MessageBox.Show("Внимание! Исправьте ошибку" + Environment.NewLine + Environment.NewLine + ex.Message);
                    trans.Rollback(); // Делаем откат изменений 
                    //return; 
                }
                finally
                {
                    conn.Close();
                }
            }
            MyWatch.Stop();
            return "Elapsed " + MyWatch.ElapsedMilliseconds.ToString() + " ms.";
        }

А с проверкой на отсутствие получалось не менее 30 секунд.
Быстрее всего получается, если обрабатывать исключение OleDbException (указав соотв. поле индексированным с непосторяющимися значениями), а не посылатьдополнительный SELECT-запрос на присутствие.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
  public bool SendDB(string command, string connStr)
        {
            using (OleDbConnection conn = new OleDbConnection(connStr))
            {
                conn.Open();
                OleDbTransaction trans = conn.BeginTransaction();
                OleDbCommand comm = new OleDbCommand(command, conn, trans);
                try
                {
                    // Execute выбирай по вкусу, в зависимости от твоих целей
                    comm.ExecuteNonQuery();
                    // Если всё ОК, то проводим транзакцию
                    trans.Commit();
                    return true;
                }
                catch (OleDbException ex)
                {
                    //MessageBox.Show("Внимание! Исправьте ошибку" + Environment.NewLine + Environment.NewLine + ex.Message);
                    trans.Rollback(); // Делаем откат изменений
                    //return;
                    return false;
                }
                finally
                {
                    conn.Close();
                }
            }
        }

А знаете ли Вы, как сделать еще быстрее. Хотя бы до 5 секунд снизить время.
Заранее спасибо
...
Рейтинг: 0 / 0
09.07.2006, 19:09
    #33840821
Bigheadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрое добавление строк в таблицу (только уникальных)
1. Так почему не воспользоваться тем способом, что вы описали? Создать констрейнт в БД, который и будет следить за уникальностью.
2. Если данных в таблице немного, то можно загрузить их все в приложение и отсеить неуникальные значения.
...
Рейтинг: 0 / 0
10.07.2006, 09:05
    #33841134
VIKT0R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Быстрое добавление строк в таблицу (только уникальных)
1. Первый способ достаточно медленный. В таблице всего 500 записей. Для добавления еще 500 тратится около 30 секунд. В таблице же будет около 20 млн. строк.
2. 20 млн. * 8 байт = 200МБ. Мне мало, а кому-то много.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Быстрое добавление строк в таблицу (только уникальных) / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]