SQL Server / MySQL / Доступ - ускоряющий вставку многих строк неэффективным способом

Сначала выберите верхнюю первую запись с флагом = 1 для каждой даты и установите цель на 1

df1 = df[df.flag==1].groupby("date").head(1);
df1.target = 1

Затем сбросьте цель на 0 для исходного кадра данных и замените значение цели на вновь созданный кадр данных с целью только на 1 для тех записей, которые выбраны в первом кадре данных.

df.target = 0
df.update(df1.target)
5
задан BIBD 7 January 2009 в 15:48
поделиться

11 ответов

Единственной самой большой вещью, которая уничтожит производительность здесь, является то, что (она походит), Вы выполняете миллион различных ВСТАВОК против DB. Каждого ВСТАВКА рассматривают как единственную операцию. Если можно сделать это как единственную операцию, то у Вас почти наверняка будет огромное повышение производительности.

И MySQL и поддержка SQL Server 'выбирают' константных выражений без имени таблицы, таким образом, это должно работать одним оператором:

INSERT INTO MyTable(ID, name)
SELECT 1, 'Fred'
UNION ALL SELECT 2, 'Wilma'
UNION ALL SELECT 3, 'Barney'
UNION ALL SELECT 4, 'Betty'

Это не ясно мне если поддержки Доступа что, не имея Доступ в наличии. ОДНАКО Доступ действительно поддерживает константы в ВЫБОРЕ, насколько я могу сказать, и можно принудить вышеупомянутое в ANSI SQL-92 (который должен поддерживаться всеми 3 механизмами; это о как близко к 'агностику DB', поскольку Вы доберетесь), просто добавив

FROM OneRowTable

в конец каждого отдельного ВЫБОРА, где 'OneRowTable' является таблицей со всего одной строкой фиктивных данных.

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

4
ответ дан 14 December 2019 в 09:03
поделиться

Для SQL Server:

  1. Можно установить модель восстановления на "Простой", таким образом, журнал транзакций будет сохранен маленьким. Не забывайте задерживать впоследствии.
  2. Отключение индексов является на самом деле хорошей идеей. Это будет работать над SQL 2005, не над SQL Server 2000.

    изменитесь индекс [INDEX_NAME] на [TABLE_NAME] отключают

И включить

alter index [INDEX_NAME] on [TABLE_NAME] rebuild

И затем просто вставьте строки один за другим. Необходимо быть терпеливыми, но по крайней мере это несколько быстрее.

1
ответ дан 14 December 2019 в 09:03
поделиться

действительно ли это - регулярный процесс или одно событие времени?

Я имею, в прошлом просто заданный сценарием текущие индексы, отбросил их, вставил строки, затем просто повторно добавьте индексы.

Studio управления SQL может написать сценарий индексов из меню правой кнопки...

2
ответ дан 14 December 2019 в 09:03
поделиться

Проблема установить модель восстановления на простой состоит в том, что она влияет на любых других пользователей, вводящих данные одновременно, и таким образом будет amke их неисправимые изменения.

Вещь Samre с отключением индексов, это отключает для всех и может сделать базу данных выполненной медленнее, чем краткий заголовок.

Предположите выполнение импорта в пакетах.

0
ответ дан 14 December 2019 в 09:03
поделиться

Если это - одноразовая вещь (или это, оказывается, достаточно часто выравнивает по ширине автоматизацию этого), также рассмотрение отбрасывания/отключения всех индексов и затем добавления/перевключения их снова, когда вставка сделанный

1
ответ дан 14 December 2019 в 09:03
поделиться

Вы рассмотрели использование Шаблона "фабрика"? Я предполагаю, что Вы пишете код для этого, поэтому при использовании шаблона "фабрика", Вы могли кодировать фабрику, которая возвратила конкретный класс типа "IDataInserter", который сделает работу для.

Это все еще позволило бы Вам быть агностиком данных и получать самый быстрый метод для каждого типа базы данных.

0
ответ дан 14 December 2019 в 09:03
поделиться

Если это не что-то, что должно быть считано ужасно быстро, можно сделать, "Вставляют Отложенный" в таблицу на MySQL. Это позволяет Вашему коду продолжать работать, не имея необходимость ожидать вставки для фактического случая. Это действительно имеет некоторые ограничения, но если Ваша первоочередная задача состоит в том, чтобы заставить программу заканчиваться быстро, это может помочь. Предупредите, что существует хороший длинный список ситуаций, где это не может действовать как ожидалось. Проверьте документы.

Я не знаю, работает ли эта функциональность на Доступ или MS SQL, все же.

0
ответ дан 14 December 2019 в 09:03
поделиться

Можно ли использовать DTS (2000) или SSIS (2005) для создания пакета, чтобы сделать это? DTS и SSIS могут и вытянуть из того же источника и передать по каналу различным потенциальным местам назначения. Пойдите для SSIS, если Вы можете. Существует большая хорошая, быстрая технология там наряду с функциональностью для встраивания IsSQLServer, IsMySQL, и т.д. логики.

0
ответ дан 14 December 2019 в 09:03
поделиться

SQL Server 2000/2005, MySQL и Доступ может все загрузиться непосредственно от вкладки / cr текстовый файл, у них просто есть различные команды, чтобы сделать это. Если у Вас есть оператор выбора для определения, который DB Вы импортируете в просто фигуру их предпочтение импорта текстового файла.

0
ответ дан 14 December 2019 в 09:03
поделиться

Вы могли бы рассмотреть использование модели восстановления SQL с массовым протоколированием во время своей объемной вставки.

http://msdn.microsoft.com/en-us/library/ms190422 (SQL.90) .aspx

http://msdn.microsoft.com/en-us/library/ms190203 (SQL.90) .aspx

Вы могли бы также отключить индексы на целевой таблице во время Ваших вставок.

-1
ответ дан 14 December 2019 в 09:03
поделиться

Стоит рассмотреть разбиение ваших вставок на более мелкие партии ; одна транзакция с большим количеством запросов будет медленной.

0
ответ дан 14 December 2019 в 09:03
поделиться
Другие вопросы по тегам:

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