powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Быстрое добавление строк в таблицу (только уникальных)
3 сообщений из 3, страница 1 из 1
Быстрое добавление строк в таблицу (только уникальных)
    #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
Быстрое добавление строк в таблицу (только уникальных)
    #33840821
Bigheadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Так почему не воспользоваться тем способом, что вы описали? Создать констрейнт в БД, который и будет следить за уникальностью.
2. Если данных в таблице немного, то можно загрузить их все в приложение и отсеить неуникальные значения.
...
Рейтинг: 0 / 0
Быстрое добавление строк в таблицу (только уникальных)
    #33841134
VIKT0R
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. Первый способ достаточно медленный. В таблице всего 500 записей. Для добавления еще 500 тратится около 30 секунд. В таблице же будет около 20 млн. строк.
2. 20 млн. * 8 байт = 200МБ. Мне мало, а кому-то много.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Быстрое добавление строк в таблицу (только уникальных)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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