Я тестирую скорость вставки нескольких строк с единственным оператором INSERT.
Например: ЗНАЧЕНИЯ INSERT INTO [MyTable] (5, 'собака'), (6, 'кошка'), (3, 'рыба)
Это очень быстро, пока я не передаю 50 строк отдельному оператору, затем отбрасывания скорости значительно.
Вставка 10 000 строк с пакетами 50 занимает 0,9 секунды. Вставка 10 000 строк с пакетами 51 занимает 5,7 секунд.
Мой вопрос имеет две части:
Мои тесты были сделаны в C++ и ADO.
Править: Кажется, что пункт разгрузки не является 50 строками, но 1 000 столбцов. Я получаю подобные результаты с 50 строками 20 столбцов или 100 строками 10 столбцов.
Если вы используете SQL 2008, вы можете использовать параметры значений таблицы и просто выполнить один оператор вставки.
лично я никогда не видел замедления при 50 вставках записей даже при регулярных пакетах. Несмотря на это, мы перешли к параметрам значений таблицы, которые значительно увеличили для нас скорость.
Случайные мысли:
Это также может быть связано с размером строки. Таблица, которую вы используете в качестве примера, похоже, имеет только 2 столбца. А если в ней 25 столбцов? Падает ли производительность и при 50 строках?
Вы также сравнивали с подходом "union all", показанным здесь? http://blog.sqlauthority.com/2007/06/08/sql-server-insert-multiple-records-using-one-insert-statement-use-of-union-all/
Я подозреваю, что существует внутренний кэш/индекс, который используется до 50 строк (это хорошее круглое десятичное число). После 50 строк он возвращается к менее эффективному алгоритму вставки общего случая, который может обрабатывать произвольное количество входов без использования избыточной памяти.
Для больших и высокочастотных вставок рассмотрите возможность использования Массовых вставок для загрузки данных. Это не самая простая вещь в мире для реализации, и это приносит с собой новый набор проблем, но это может быть намного быстрее, чем выполнение INSERT.
замедление, вероятно, связано с синтаксическим анализом строковых значений: VALUES (5, 'dog'), (6, 'cat'), (3, 'fish)
, а не из-за INSERT.
попробуйте что-то вроде этого, что вставит по одной строке для каждой строки, возвращаемой запросом:
INSERT INTO YourTable1
(col1, col2)
SELECT
Value1, Value2
FROM YourTable2
WHERE ...--rows will be more than 50
и посмотрите, что произойдет