Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Медленно пишет в базу / 25 сообщений из 27, страница 1 из 2
17.04.2017, 18:52
    #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
17.04.2017, 19:23
    #39439817
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
qpileНо проблема в том, что когда набирается 2000 строк в запросе, то запись идет ооооочень медленно. Почему так?
1) У тебя расхождение в счетчике... теряешь 1800 записей
2) Скорость записи зависит от тысячи причин.
- Может у тебя файл базы лежит на медленном физическом диске, или вообще на сетевом.
- Может на таблице 100500 индексов понавешано и их все надо обновлять.
- Может у тебя одновременно с записью, на базе висят несколько открытых читающих коннектов и запись вынуждена ждать пока читатели уйдут и позволят обновить таблицу.
- Может C# клиент вместо записи занимается какой-то другой фигней. Например мусор собирает, или отрисоывает какой-нибудь ГУИ "идет запись".
- Может машина целиком торомозить.
...
Рейтинг: 0 / 0
17.04.2017, 20:19
    #39439839
qpile
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
White Owl,

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

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

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

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

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

Имеется ввиду попробовал в клиента файер фокса
...
Рейтинг: 0 / 0
18.04.2017, 13:00
    #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
18.04.2017, 17:35
    #39440394
qpile
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
VSVLAD,

AddRange нет в C# почему
...
Рейтинг: 0 / 0
18.04.2017, 17:45
    #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
18.04.2017, 18:16
    #39440426
qpile
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
Сделал тоже самое действие из под нажатия кнопки. Все заработало.
...
Рейтинг: 0 / 0
18.04.2017, 21:07
    #39440491
Уважаемый автор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
qpile,
Советы от бывалого:
1. используй транзакции
2. PRAGMA synchronous = NORMAL
3. PRAGMA temp_store = DEFAULT
...
Рейтинг: 0 / 0
19.04.2017, 15:01
    #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
19.04.2017, 17:37
    #39441121
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
qpile,

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

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

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


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

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

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

в моем примере скорость вставок только возрастает при увеличении кол-ва инсертов в транзакции
...
Рейтинг: 0 / 0
04.05.2017, 16:10
    #39448834
DYUMON
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
Не силен в шарпе, но у тебя там не после каждого инсерта транзакция копитит ?
...
Рейтинг: 0 / 0
04.05.2017, 21:03
    #39449013
tchingiz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
DYUMON транзакция копитит ?
комитит?
...
Рейтинг: 0 / 0
04.05.2017, 21:07
    #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
05.05.2017, 07:24
    #39449087
DYUMON
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Медленно пишет в базу
а вот тут
Код: c#
1.
 this.transaction = "BEGIN TRANSACTION;"+ this.transaction +"COMMIT;";


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


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