Несколько строк с единственной ВСТАВКОЙ в 2008 SQLServer

Я тестирую скорость вставки нескольких строк с единственным оператором INSERT.

Например: ЗНАЧЕНИЯ INSERT INTO [MyTable] (5, 'собака'), (6, 'кошка'), (3, 'рыба)

Это очень быстро, пока я не передаю 50 строк отдельному оператору, затем отбрасывания скорости значительно.

Вставка 10 000 строк с пакетами 50 занимает 0,9 секунды. Вставка 10 000 строк с пакетами 51 занимает 5,7 секунд.

Мой вопрос имеет две части:

  1. Почему там такое трудное отбрасывание производительности в 50?
  2. Я могу полагаться на это поведение и кодировать мое приложение, чтобы никогда отправить пакеты, больше, чем 50?

Мои тесты были сделаны в C++ и ADO.

Править: Кажется, что пункт разгрузки не является 50 строками, но 1 000 столбцов. Я получаю подобные результаты с 50 строками 20 столбцов или 100 строками 10 столбцов.

8
задан Todd 12 April 2010 в 20:04
поделиться

6 ответов

Если вы используете SQL 2008, вы можете использовать параметры значений таблицы и просто выполнить один оператор вставки.

лично я никогда не видел замедления при 50 вставках записей даже при регулярных пакетах. Несмотря на это, мы перешли к параметрам значений таблицы, которые значительно увеличили для нас скорость.

0
ответ дан 6 December 2019 в 01:39
поделиться

Случайные мысли:

  • это полностью согласовано при повторном запуске?
  • вы проверяете наличие дубликатов в первых 10к строках для второй 10кбайт вставки ?
  • вы сначала пробовали размер пакета 51?
  • вы очищали таблицу между тестами?
0
ответ дан 6 December 2019 в 01:39
поделиться

Это также может быть связано с размером строки. Таблица, которую вы используете в качестве примера, похоже, имеет только 2 столбца. А если в ней 25 столбцов? Падает ли производительность и при 50 строках?

2
ответ дан 6 December 2019 в 01:39
поделиться

Вы также сравнивали с подходом "union all", показанным здесь? http://blog.sqlauthority.com/2007/06/08/sql-server-insert-multiple-records-using-one-insert-statement-use-of-union-all/

Я подозреваю, что существует внутренний кэш/индекс, который используется до 50 строк (это хорошее круглое десятичное число). После 50 строк он возвращается к менее эффективному алгоритму вставки общего случая, который может обрабатывать произвольное количество входов без использования избыточной памяти.

0
ответ дан 6 December 2019 в 01:39
поделиться

Для больших и высокочастотных вставок рассмотрите возможность использования Массовых вставок для загрузки данных. Это не самая простая вещь в мире для реализации, и это приносит с собой новый набор проблем, но это может быть намного быстрее, чем выполнение INSERT.

0
ответ дан 6 December 2019 в 01:39
поделиться

замедление, вероятно, связано с синтаксическим анализом строковых значений: 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

и посмотрите, что произойдет

0
ответ дан 6 December 2019 в 01:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: