Какой самый быстрый способ заполнить таблицу SQLite из таблицы данных - PullRequest
5 голосов
/ 13 января 2010

Какой самый быстрый способ заполнить базу данных SQLite из DataTable в C # .net 2.

В настоящее время я создаю вставки для каждой строки таблицы. Я пробовал dataadaptor, но скорость, кажется, не была быстрее. В настоящее время требуется 5 минут, чтобы пройтись по 20000 строк и записать их в базу данных. Любые предложения?

Решение:

Я обнаружил, что объемные блоки вставок с помощью BEGIN ... COMMIT сработали для меня с заметным улучшением скорости:

BEGIN;
INSERT INTO friends (name1,name2) VALUES  ('john','smith');
INSERT INTO friends (name1,name2) VALUES  ('jane','doe');
COMMIT;

мои операторы вставки составляли около 500 байт каждая, поэтому я ограничил количество операторов до 100 на транзакцию.

Ответы [ 3 ]

3 голосов
/ 13 января 2010

См. Эту запись FAQ с веб-сайта SQLite:

http://www.sqlite.org/faq.html#q19

По умолчанию каждый оператор INSERT является собственной транзакцией. Но если вы окружите несколько операторов INSERT с помощью BEGIN ... COMMIT, то все вставки сгруппируются в одну транзакцию. Время, необходимое для фиксации транзакции, амортизируется по всем вложенным операторам вставки, поэтому время на оператор вставки значительно сокращается.

1 голос
/ 13 января 2010

См. эту тему .

Лучший способ - использовать ExecuteNonQuery(), который фиксирует все вставки одновременно и не должен продолжать выделять строки. 20 000 строк должны занимать гораздо меньше минуты.

0 голосов
/ 13 августа 2018

Рассмотрите возможность использования SqLiteDataAdapter. (Мне все еще нужно использовать vb.net, но следующий пример легко перевести. Или взгляните на первоисточник: http://stackoverflow.com/a/2671511)

Private Sub FillDatabaseTableWithDataTable(dataTable As DataTable)
            ' inspired by http://stackoverflow.com/a/2671511

            ' Query the destination database
            Dim query As String = $"SELECT * FROM `{dataTable.TableName}`"

            Using adapter As New SQLiteDataAdapter(query, Connection)

                Using commandBuilder = New SQLiteCommandBuilder(adapter)

                    Connection.Open()

                    commandBuilder.QuotePrefix = "["
                    commandBuilder.QuoteSuffix = "]"
                    commandBuilder.GetInsertCommand()

                    'Create an empty "destination" table for synchronization
                    ' with SqLite "source" database
                    Dim destinationTable As New DataTable()

                    'load data from SqLite "source" database to destination table, e.g.
                    'column headers
                    adapter.Fill(destinationTable)

                    'adapt "destination" table: fill data
                    For Each row As DataRow In dataTable.Rows
                        Dim destinationRow As DataRow = destinationTable.NewRow()
                        destinationRow.ItemArray = row.ItemArray
                        destinationTable.Rows.Add(destinationRow)
                    Next

                    'Update SqLite source table
                    'the Update has To be wrapped In a transaction
                    'Otherwise, SQLite would implicitly create a transaction
                    'for each line. That would slow down the writing process.
                    Using transaction = Connection.BeginTransaction()
                        adapter.Update(destinationTable)
                        transaction.Commit()
                    End Using

                    Connection.Close()
                End Using
            End Using
        End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...