powered by simpleCommunicator - 2.0.35     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Медленно пишет в базу
25 сообщений из 27, страница 1 из 2
Медленно пишет в базу
    #39439801
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Есть массив постоянно поступающих значений. Их записываю в базу. Но запись идет дико медленно
Вот так создаю

Код: sql
1.
2.
3.
4.
5.
6.
7.
cmd.CommandText = "CREATE TABLE IF NOT EXISTS " + SecTable + " (id INTEGER PRIMARY KEY AUTOINCREMENT,sec TEXT NOT NULL)";
            cmd.ExecuteNonQuery();
            cmd.CommandText = "CREATE TABLE IF NOT EXISTS " + TradesTable + " (sec TEXT NOT NULL,dir INTEGER NOT NULL,qty INTEGER NOT NULL,transId INTEGER NOT NULL,time REAL NOT NULL)";
            cmd.ExecuteNonQuery();
            cmd.CommandText = "PRAGMA synchronous = 0";
            cmd.ExecuteNonQuery();
        


Вот так записываю в базу
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
  if (counter < 200)
            {
                this.transaction = this.transaction+"INSERT INTO " + TradesTable + "(sec,dir,qty,transId,time) VALUES ('" + idSec + "','" + dir + "','" + trade.Volume.ToString() + "','" + trade.Id.ToString() + "','" + trade.Time.Ticks + "');";
            }
            if (counter >=2000)
            {

                this.transaction = "BEGIN TRANSACTION;"+ this.transaction +"COMMIT;";
                cmd.CommandText = this.transaction;
                cmd.ExecuteNonQuery();
                counter = 0;
                this.transaction = "";
            }
          
            counter++;



Но проблема в том, что когда набирается 2000 строк в запросе, то запись идет ооооочень медленно. Почему так?
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39439817
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qpileНо проблема в том, что когда набирается 2000 строк в запросе, то запись идет ооооочень медленно. Почему так?
1) У тебя расхождение в счетчике... теряешь 1800 записей
2) Скорость записи зависит от тысячи причин.
- Может у тебя файл базы лежит на медленном физическом диске, или вообще на сетевом.
- Может на таблице 100500 индексов понавешано и их все надо обновлять.
- Может у тебя одновременно с записью, на базе висят несколько открытых читающих коннектов и запись вынуждена ждать пока читатели уйдут и позволят обновить таблицу.
- Может C# клиент вместо записи занимается какой-то другой фигней. Например мусор собирает, или отрисоывает какой-нибудь ГУИ "идет запись".
- Может машина целиком торомозить.
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39439839
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

Специально никакие индексы не вешал. Или можно как то существующие удалить?

Попробую создать отдельный поток для записи.
Ноут нормальный. 4 ядра , 8 гигов оперы.
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39439840
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qpile,

БАзой пользуется одна программа. Она пишет и она потом будет читать. Чтение отключено. Пока идет только запись
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39439888
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя клиент формирует большую команду на вставку.
Это команда находися в памяти клиенте в виде строки. Запиши эту строку в файл.
Возьми консольную sqlite3.exe и отдаей ей этот на файл на исполнение (sqlite3 my.db .read file.sql)
Сравни скорость работы базы и твоего клиента.
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39439977
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

Спасибо за совет! Пробую!
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39440005
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qpile,

попробовал в SQLLITE. Пишет почти моментально запрос 2000 строк. Значит проблема в клиенте получается
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39440006
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qpile,

Имеется ввиду попробовал в клиента файер фокса
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39440172
Фотография VSVLAD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qpile,

Строки формируй через StringBuilder, а ещё лучше попробуй выполнить запрос с параметрами, может даст хороший прирост скорости

Примерчик из моего проекта
Код: vbnet
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.
39.
40.
41.
42.
43.
44.
45.
46.
(...)
    sqlInnerConnection = OpenSQLConnection()
    SqlCmdAddSportInsert = sqlInnerConnection.CreateCommand()
    SqlCmdAddSportInsert.CommandText = "insert into dbo.sports values(@dateofchange, @id_sport, @name)"
    SqlCmdAddSportInsert.Parameters.AddRange(New SqlParameter() {
                        New SqlParameter("@dateofchange", SqlDbType.DateTime, 100),
                        New SqlParameter("@id_sport", SqlDbType.Int, 100),
                        New SqlParameter("@name", SqlDbType.VarChar, 100)
                    })
(...)

Public Function AddSport(DateOfChange As Date, Id_Sport As Integer, Name As String) As Integer
    Dim retValue As Integer

    SqlCmdAddSportSelect.Parameters.Item("@id_sport").Value = Id_Sport

    If SqlCmdAddSportSelect.ExecuteScalar() = 0 Then
        SqlCmdAddSportInsert.Parameters.Item("@dateofchange").Value = DateOfChange
        SqlCmdAddSportInsert.Parameters.Item("@id_sport").Value = Id_Sport
        SqlCmdAddSportInsert.Parameters.Item("@name").Value = Name

        retValue = SqlCmdAddSportInsert.ExecuteNonQuery()
    End If

    Return retValue
End Function

Public Sub BeginLoaderTransaction()
    Try
        Using sqlCmd = sqlInnerConnection.CreateCommand()
            sqlCmd.CommandText = "begin transaction"
            sqlCmd.ExecuteNonQuery()
        End Using
    Catch ex As Exception
    End Try
End Sub

Public Sub CommitLoaderTransaction()
    Try
        Using sqlCmd = sqlInnerConnection.CreateCommand()
            sqlCmd.CommandText = "commit transaction"
            sqlCmd.ExecuteNonQuery()
        End Using
    Catch ex As Exception
    End Try
End Sub
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39440394
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VSVLAD,

AddRange нет в C# почему
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39440405
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь сделать так


Код: sql
1.
2.
3.
4.
5.
6.
        foreach (Trade trade in trades)
                        {
                            Thread myThread = new Thread(new ParameterizedThreadStart(InsertInBase));
                            myThread.Start(new TradeBase(sqlLite,trade));
                           // sqlLite.InsertTrade(trade);
                        }




Код: sql
1.
2.
3.
4.
5.
 private static void InsertInBase(object tradeBase)
        {

            ((TradeBase)tradeBase).sqlLite.InsertTrade(((TradeBase)tradeBase).trade);
        }



Выдает ошибку
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39440426
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал тоже самое действие из под нажатия кнопки. Все заработало.
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39440491
Уважаемый автор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qpile,
Советы от бывалого:
1. используй транзакции
2. PRAGMA synchronous = NORMAL
3. PRAGMA temp_store = DEFAULT
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39440969
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пытаюсь в диспатчере сделать запись в базу данных Сейчас уже не виснет, но выводит ошибку Индекс находился вне границ массива. Trader.Trades постоянно обновляется в другом потоке.

диспатчер запускается раз в 5 секунд

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
[SRC sql] private static void InsertInBase(object sqlLite)
        {
            foreach (Trade trade in MainWindow.Instance.Trader.Trades)
            {
                counter++;
                if (counter >= trades)
                  ((SqlLite)sqlLite).InsertTrade(trade);
            }
            
            trades = counter;
        }
        private void dispatcherTimer_Tick2(object sender, EventArgs e)
        {
            Thread myThread = new Thread(new ParameterizedThreadStart(InsertInBase));
            myThread.Start(sqlLite);
        }

[/SRC]

Код: c#
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.
public void InsertTrade(Trade trade)
        {

             cmd = con.CreateCommand();
             cmd.CommandText = " SELECT qty from " + TradesTable + " where transId='" + trade.Id.ToString() + "'";
             IDataReader reader = cmd.ExecuteReader();
             int count = 0;

             while (reader.Read())
             {

                 count = count + 1;
             }
             if (count != 0) return;
             

            string idSec =  GetSecId(trade.Security).ToString();
                string dir = "-1";
                if (trade.OrderDirection == StockSharp.Messages.Sides.Buy)
                    dir = "0";
                if (trade.OrderDirection == StockSharp.Messages.Sides.Sell)
                    dir = "1";
          
                this.transaction = this.transaction+"INSERT INTO " + TradesTable + "(sec,dir,qty,transId,time) VALUES ('" + idSec + "','" + dir + "','" + trade.Volume.ToString() + "','" + trade.Id.ToString() + "','" + trade.Time.Ticks + "');";
       
               cmd.CommandText = this.transaction;
                cmd.ExecuteNonQuery();
                counter = 0;
            
                this.transaction = "";
     
          
            counter++;

        }
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39441121
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qpile,

Вопросы по C# обсуждаются в соседнем форуме: http://www.sql.ru/forum/dotnet
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39441202
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, прав нет на добавление
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39441570
qpile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

А как права получить для добавление в ветку С#?
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39445236
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
VSVLADqpile,

Строки формируй через StringBuilder, а ещё лучше попробуй выполнить запрос с параметрами, может даст хороший прирост скорости


я не заметил на бесплатном SQLIte провайдере, чтобы переход на запросы с параметрами шото ускорял (чему страшно удивился).
Количество вставок в транзакции очень влияет. При автокоммите вообще безобразная скорость.
Глазом видно (в фаре) как в каталоге создаются и убиваются рабочие файлы для каждой записи.
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39445240
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39445241
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a -name 1.db -top 10000 <exportgps.csv -number 50 2>nul >>result.txt

тут данные для тестирования, если
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39445245
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlУ тебя клиент формирует большую команду на вставку..

1
Шото мне эти дветысячи инсертов в одной строке не нравятся. Почему бы по одной не выполнять.
2
В инструкции по провайдеру (мне кажется) строго рекомендовали классы использовать, а не
begin transaction и commit через ExecuteNonQuery();

в моем примере скорость вставок только возрастает при увеличении кол-ва инсертов в транзакции
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39448834
DYUMON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Не силен в шарпе, но у тебя там не после каждого инсерта транзакция копитит ?
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39449013
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DYUMON транзакция копитит ?
комитит?
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39449015
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет. Пример был написан для хоть какойто оценки скорости вставок.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
  Test a performance of SQLite depending on number of 'insert' operations in a single transaction.
usage 
a [-?] [-v] [-dbg] [-top XX]  [-number ZZ]  -name dbFl  <tracksFile
where
  -?             - to show this help page;
  -v             - to be verbose;
  -dbg           - just to parse tracks file (has to have at least 14 fields);
  -name   dbFl   - file of database;
  -top    XX     - to insert into db table just first XX records;
  -number ZZ     - ZZ is the number of inserts in the transaction;

-number ZZ - ZZ is the number of inserts in the transaction;

кол-во инсертов в транзакции задатся этим ключом
...
Рейтинг: 0 / 0
Медленно пишет в базу
    #39449087
DYUMON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вот тут
Код: c#
1.
 this.transaction = "BEGIN TRANSACTION;"+ this.transaction +"COMMIT;";


может так надо написать
Код: c#
1.
 this.transaction ="COMMIT;"+ this.transaction + "BEGIN TRANSACTION;";
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Медленно пишет в базу
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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