Вопрос:
У меня есть скрипт с около 45 тысяч вставок из отборных высказываний. Когда я пытаюсь запустить его, я получаю сообщение об ошибке, в котором говорится, что у меня недостаточно памяти. Как мне запустить этот скрипт?
Контекст:
- Добавлены некоторые новые поля данных, чтобы приложение работало с другим приложением, которое использует клиент.
- Получил электронную таблицу данных от клиента, полную данных, которые отображали текущие элементы данных в значения для этих новых полей.
- Преобразованная электронная таблица для вставки выписок.
- Если я только запускаю некоторые операторы, это работает, но весь сценарий - нет.
- Нет. Опечаток нет.
Если есть другой способ, которым я должен загружать эти данные, не стесняйтесь наказать меня и сообщить мне.
sql-server
sql-server-2005
etl
spaghetticowboy
источник
источник
Ответы:
Максимальный размер пакета для SQL Server 2005 составляет 65 536 * Размер сетевого пакета (NPS), где NPS обычно составляет 4 КБ. Это работает до 256 МБ. Это будет означать, что ваши операторы вставки будут в среднем 5,8 КБ каждый. Это кажется неправильным, но, возможно, там есть посторонние места или что-то необычное.
Моим первым предложением было бы ставить оператор «GO» после каждого оператора INSERT. Это разделит ваш отдельный пакет из 45 000 операторов INSERT на 45 000 отдельных пакетов. Это должно быть легче переварить. Будьте осторожны, если одна из этих вставок даст сбой, вам может быть трудно найти виновного. Возможно, вы захотите защитить себя с помощью транзакции. Вы можете быстро добавить эти операторы, если у вашего редактора есть хороший поиск и замена (который позволит вам искать и заменять возвращаемые символы, такие как \ r \ n) или макрос.
Второе предложение - использовать мастер для импорта данных прямо из Excel. Мастер создает небольшой пакет служб SSIS для вас за кулисами, а затем запускает его. У него не будет этой проблемы.
источник
GO
после каждого заявления? Ну, я думаю, если вы генерируете их, используя другой скрипт, это нормально. В противном случае я бы просто ставил один раз в 1000INSERT
с. Что касается того, чтобы сделать транзакцию атомарной и минимизировать размер транзакции, почему бы не загрузить все строки во временную таблицу или переменную таблицы, а затем загрузить их одним выстрелом оттуда в целевую таблицу?BULK INSERT
илиbcp
кажутся более подходящими варианты, чем 45 000 операторов вставки.Если вам нужно придерживаться операторов вставки, я бы рассмотрел несколько вариантов:
A: Используйте транзакции и упаковывайте пакеты по 100, 500 или 1000 операторов в каждом, чтобы минимизировать влияние на журнал и пакет. например
B: Вместо отдельных операторов вставки используйте
UNION ALL
по 100 или 500 операторов за раз, напримерДля краткости я оставил обработку ошибок, но суть в том, что я никогда не буду пытаться отправить в SQL Server один пакет из 45 000 отдельных операторов.
источник
VARCHAR(800)
столбцами в 2008 году со временем компиляции 12,5 минут на моем экземпляре разработчика 2008 года, поскольку он выполняет много ненужной работы, сравнивая значения, а не просто вставляя их (выполняет много быстрее при параметризации и нет значений для просмотра). Несмотря на значительное улучшение в 2012 году, нелинейный шаблон все еще существует и должен быть исправлен в версии после.Я не уверен, почему вы получаете ошибку нехватки памяти, но есть более простой подход.
Если вы можете экспортировать данные из электронной таблицы в формат с разделителями (например, csv), вы можете использовать мастер импорта данных в SSMS, чтобы вставить данные для вас:
источник
Используя несколько SqlBulkCopy, создайте временную таблицу. Вставьте новые данные во временную таблицу, затем объедините данные из временной таблицы в существующую. Пример использования метода C # SqlBulkCopy.WriteToServer (DataTable) . Надеюсь, это поможет
источник
Да, мы могли бы сделать это, я попытался использовать подход BCP (Bulk Copy Program), чтобы избежать проблемы OutOfMemory .
Примечание . Пробовал на SQL Server 2014.
В BCP сначала нам нужно экспортировать данные базы данных источника в файл bcp (в папке локального каталога), а затем импортировать этот файл bcp в базу данных назначения.
Ниже приведены шаги по пирогу:
Заметка:
а) Убедитесь, что пустая таблица присутствует в базе данных назначения
б) Убедитесь, что папка Temp присутствует на диске C
Создайте файл bat с именем Export_Data.bat с помощью команды, показанной ниже:
Пауза
Запустите этот bat-файл, в результате чего в папке Temp будет сгенерирован bcp- файл.
Затем создайте другой файл bat с именем Import_Data.bat с помощью следующей команды:
Пауза
И здесь мы идем!
источник